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 ?

1 Answer 1


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.


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;

//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'){

//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;

//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.

  • good idea, but I was looking for a way to create a downloadable file containing the encoded string, and the best way to do it is another file with headers, but the problem is passing the string to the headers file, and can't use post method because the button is in a form.
    – Pierre
    May 1, 2012 at 8:43
  • @Peter, i see what you mean, updated my answer
    – Bainternet
    May 1, 2012 at 9:30
  • I tried this code but it seems that it passes the header() part it actually loads an empty page, it shouldn't load the page the download should start before this stage right ?
    – Pierre
    May 1, 2012 at 10:04
  • I'm using almost this exact code to download my export and it works just fine, if the page is loaded then it means that you are probably not hooking the template_redirect hook before its called. update your question with the code that you are using and I'll have a look.
    – Bainternet
    May 1, 2012 at 13:37
  • Glad it worked out for you.
    – Bainternet
    May 1, 2012 at 14:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.