Option de mise à jour stockée dans un tableau multidimensionnel

15

J'ai des données dans la wp_optionstable actuellement stockées sous forme de tableau multidimensionnel ( profile_element_order):

a:12:{s:17:"img_base64_enable";s:1:"1";s:25:"moulding_combination_page";s:0:"";s:24:"moulding_collection_page";s:0:"";s:25:"idea_gallery_thumb_height";s:3:"200";s:24:"idea_gallery_thumb_width";s:3:"200";s:23:"collection_thumb_height";s:3:"200";s:22:"collection_thumb_width";s:3:"200";s:20:"profile_item_columns";s:1:"4";s:17:"idea_item_columns";s:1:"2";s:24:"collections_item_columns";s:1:"2";s:25:"combinations_item_columns";s:1:"4";s:21:"profile_element_order";a:5:{i:0;s:8:"Option 1";i:1;s:8:"Option 2";i:2;s:8:"Option 3";i:3;s:8:"Option 4";i:4;s:8:"Option 5";}}

Ce que j'essaie d'accomplir, c'est de mettre à jour l' profile_element_orderoption (dans ces options). Voici à quoi tout ressemble jusqu'à présent:

function psort_save_order() {

    global $mouldings_options;

    $list = $mouldings_options['profile_element_order'];
    $new_order = $_POST['list_items'];
    $new_list = array();

    // update order
    foreach($new_order as $v) {
        if(isset($list[$v])) {
            $new_list[$v] = $list[$v];
        }
    }

    // save the new order
    update_option('profile_element_order', $new_list);

    die();
}
add_action('wp_ajax_psort_update_order', 'psort_save_order');

Les données sont correctement publiées dans la table DB (comme je peux voir certaines de mes tentatives infructueuses comme de nouvelles entrées d'options, comme mouldings_settings->profile_element_order) - J'ai juste du mal à trouver la update_option()syntaxe pour cette option spécifique. J'ai essayé des choses comme (en gardant à l'esprit que `mouldings_settings est le nom de l'option réelle):

mouldings_settings['profile_element_order']
$mouldings_options['profile_element_order']
profile_element_order

mais pas de dés pour le moment. Tous les pointeurs seraient grandement appréciés! Merci!

Mettre à jour C'est ce que j'ai maintenant - l'action ajax enregistre bien, mais lorsque je sauvegarde les options du plugin, il duplique les options dans la base de données et génère la même erreur qu'auparavant:

a:17:{s:17:"img_base64_enable";s:1:"1";s:25:"moulding_combination_page";s:0:"";s:24:"moulding_collection_page";s:0:"";s:25:"idea_gallery_thumb_height";s:3:"200";s:24:"idea_gallery_thumb_width";s:3:"200";s:23:"collection_thumb_height";s:3:"200";s:22:"collection_thumb_width";s:3:"200";s:20:"profile_item_columns";s:1:"4";s:17:"idea_item_columns";s:1:"2";s:24:"collections_item_columns";s:1:"2";s:25:"combinations_item_columns";s:1:"4";s:21:"profile_element_order";a:5:{i:4;s:8:"Option 5";i:0;s:8:"Option 1";i:1;s:8:"Option 2";i:3;s:8:"Option 4";i:2;s:8:"Option 3";}i:0;s:8:"Option 5";i:1;s:8:"Option 1";i:2;s:8:"Option 2";i:3;s:8:"Option 4";i:4;s:8:"Option 3";}

Une fonction:

function psort_save_order() {

    global $mouldings_options;

    $list = $mouldings_options['profile_element_order'];
    $new_order = $_POST['list_items'];
    $new_list = array();

    // update order
    foreach($new_order as $v) {
        if(isset($list[$v])) {
            $new_list[$v] = $list[$v];
        }
    }

    $mouldings_options['profile_element_order'] = $new_list;
    $mouldings_options = array_merge($mouldings_options,$mouldings_options['profile_element_order']);

    // save the new order
    update_option('mouldings_settings', $mouldings_options);

    die();
}
add_action('wp_ajax_psort_update_order', 'psort_save_order');
Zach
la source

Réponses:

36

En ce qui concerne WordPress, votre tableau multidimensionnel est une option.

Pour mettre à jour une partie seulement du tableau multidimensionnel, il est nécessaire de récupérer l'ensemble du tableau, modifiez-le en conséquence, puis mettez à jour l'ensemble du tableau.

Supposons que votre tableau multidimensionnel soit le suivant:

my_options = array(
  'option_a'=>'value_a',
  'option_b'=>'value_b',
  'inner_array'=>array(
       'foo' => 'bar',
       'hello' => 'world',
   ),
  'option_c'=>'value_c'
)

Et supposons que vous souhaitiez mettre à jour la valeur de l'option «bonjour» de «monde» à «lune»

//Get entire array
$my_options = get_option('my_options');

//Alter the options array appropriately
$my_options['inner_array']['hello'] = 'moon';

//Update entire array
update_option('my_options', $my_options);
Stephen Harris
la source
1
Salut Steven - J'ai mis à jour ma question d'origine avec ce que j'ai maintenant et bien que cela fonctionne avec Ajax (enregistre la position lorsque je rafraîchis) une fois que j'ai enregistré les paramètres du plugin et que je rafraîchis, les options du tableau DB deviennent un peu compliquées ( semble dupliqué), ce qui crée une erreur - est-ce que je m'approche toujours de cette erreur? Merci.
Zach
Voulez-vous dire que la ligne elle-même est dupliquée? Ou vos options apparaissent en double dans la ligne? Essayez de supprimer l'option et réessayez - il se peut que vous gardiez simplement les doublons de vos tentatives précédentes.
Stephen Harris
Salut Stephen - a fait un collage de mes étapes pour reproduire le problème: pastebin.com/YHg1i7HR Merci!
Zach
Essayez de supprimer votre fichier array_merge. Cela cause la duplication. Vous fusionnez un tableau avec un sous-tableau (provoquant la duplication du sous-tableau).
Stephen Harris
Salut Stephen - je suppose que je ne suis pas sûr de savoir comment écrire cela alors - j'ai juste $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);maintenant qui n'a pas la duplication (et écrit correctement dans la base de données, ce qui est bien) - mais sur la page-save (sauvegarde des paramètres du plugin) , le paramètre du plugin est toujours supprimé de la base de données (comme le fait la dernière partie de cette boîte à pâte).
Zach