So what is the best way to create an export and import feature, I tried serialize()
and urlencode()
on an array of options to be used in a url like so:
export.php?data=(long string)
, and use $_GET method in export.php file which forces download using headers, but that’s not a good idea because the array is very large.
so what is the best way to do export and import theme options ?
I’m just about done adding my own admin panel class
an Import/ Export functionality and I’ve come to a point where i feel the best way to export data would be as a base64 encoded serialize array, and this is way,
serialize data alone is somewhat human readable and i wonted to avoid that (theme options have stored files,images url , paths and other sensitive data), hence the base64 encoding.
Now i agree this makes a mess of a data but a simple single line string comes out which is very easy to copy paste without making mistakes (like removing lines, brackets, parentheses …).
As for the size of $_GET
depends on used browser. Some support 2000 character,
some more. I have a rule of thumb to use $_POST
method, if send data has more than
255 character.
Example , say $options is an array of theme options then export is done like this
echo "<!*!* START export Code !*!*>\n".base64_encode(serialize($options))."\n<!*!* END export Code !*!*>";
and the import code is:
$import_code = $_POST['import_code'];
$import_code = str_replace("<!*!* START export Code !*!*>\n","",$import_code);
$import_code = str_replace("\n<!*!* END export Code !*!*>","",$import_code);
$import_code = base64_decode($import_code);
$import_code = unserialize($import_code);
this is actually the code i use in my plugin Shortcodes UI for the import export functionality.
Update
As for downloading the export dump, you don’t have to create a more the one request meaning that you can export to a file with a single request, ex:
//first add a new query var
public function add_query_var_vars() {
global $wp;
$wp->add_query_var('theme_export_options');
}
//then add a template redirect which looks for that query var and if found calls the download function
public function admin_redirect_download_files(){
global $wp;
global $wp_query;
//download theme export
if (array_key_exists('theme_export_options', $wp->query_vars) && $wp->query_vars['theme_export_options'] == 'safe_download'){
download_file();
die();
}
}
//add hooks for these functions
add_action('template_redirect', 'admin_redirect_download_files');
add_filter('init', 'add_query_var_vars');
//then define the function that will take care of the actual download
public function download_file($content = null, $file_name = null){
if (! wp_verify_nonce($_REQUEST['nonce'], 'theme_export_options') )
wp_die('Security check');
//here you get the options to export and set it as content, ex:
$options= get_option('my_theme_options');
$content = "<!*!* START export Code !*!*>\n".base64_encode(serialize($options))."\n<!*!* END export Code !*!*>";
$file_name="theme_export.txt";
header('HTTP/1.1 200 OK');
if ( !current_user_can('edit_themes') )
wp_die('<p>'.__('You do not have sufficient permissions to edit templates for this site.').'</p>');
}
if ($content === null || $file_name === null){
wp_die('<p>'.__('Error Downloading file.').'</p>');
}
$fsize = strlen($content);
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-Disposition: attachment; filename=" . $file_name);
header("Content-Length: ".$fsize);
header("Expires: 0");
header("Pragma: public");
echo $content;
exit;
}
//and last a simple function to create the download export url / link
function create_export_download_link($echo = false){
$site_url = get_bloginfo('url');
$args = array(
'theme_export_options' => 'safe_download',
'nonce' => wp_create_nonce('theme_export_options')
);
$export_url = add_query_arg($args, $site_url);
if ($echo === true)
echo '<a href="'.$export_url.'" target="_blank">Download Export</a>';
elseif ($echo == 'url')
return $export_url;
return '<a href="'.$export_url.'" target="_blank">Download Export</a>';
}
So all i have to do is add a call to create_export_download_link(true);
in my theme options panel and it will create a link like this :
<a href="http://domain.com/?theme_export_options=safe_download&nonce=as4d56as4" target="_blank">Download Export</a>
obviously you will need to change it up a bit to match your needs but you should get the idea.