web-dev-qa-db-fra.com

Quel est le meilleur moyen d'exporter et d'importer des options de thème?

Alors, quel est le meilleur moyen de créer une fonctionnalité d’exportation et d’importation, j’ai essayé serialize() et urlencode() sur un tableau d’options à utiliser dans une URL telle que:

export.php?data=(long string) et utilisez la méthode $ _GET dans le fichier export.php qui force le téléchargement à l'aide d'en-têtes, mais ce n'est pas une bonne idée car le tableau est très volumineux.

alors, quel est le meilleur moyen d'exporter et d'importer des options de thème?

2
Pierre

J'ai presque fini d'ajouter ma propre admin panel class une fonctionnalité d'importation/exportation et je suis arrivé à un point où je pense que le meilleur moyen d'exporter des données serait en base64. encoder sérialiser tableau, et c'est ainsi,

sérialiser uniquement les données est quelque peu lisible par l'homme et c'est ce que je voulais éviter (les options du thème ont des fichiers stockés, des images, des chemins d'accès et d'autres données sensibles), d'où le codage base64.

Maintenant, je suis d’accord sur le fait que les données sont gâchées, mais qu’une simple chaîne de caractères apparaît très facile à copier-coller sans commettre d’erreur (comme supprimer des lignes, des crochets, des parenthèses ...).

En ce qui concerne la taille de $_GET dépend du navigateur utilisé. Certains supportent 2000 caractères, d'autres plus. J'ai une règle empirique pour utiliser la méthode $_POST, si l'envoi de données a plus de 255 caractères.

Exemple, disons que $ options est un tableau d’options de thèmes puis que l’exportation se fait comme ceci

echo "<!*!* START export Code !*!*>\n".base64_encode(serialize($options))."\n<!*!* END export Code !*!*>";

et le code d'importation est:

$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);

c'est en fait le code que j'utilise dans mon plugin Shortcodes UI pour la fonctionnalité d'importation/exportation.

Update

En ce qui concerne le téléchargement du cliché d'exportation, vous n'avez pas besoin de créer plus d'une requête, ce qui signifie que vous pouvez exporter dans un fichier avec une seule requête, par exemple:

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

Donc, tout ce que je dois faire, c'est ajouter un appel à create_export_download_link(true); dans le panneau d'options de mon thème et cela créera un lien comme celui-ci:

<a href="http://domain.com/?theme_export_options=safe_download&nonce=as4d56as4" target="_blank">Download Export</a>

évidemment, vous devrez le modifier un peu pour répondre à vos besoins, mais vous devriez en avoir l’idée.

2
Bainternet