Update-Option im mehrdimensionalen Array gespeichert


15

Ich habe Daten in der wp_optionsTabelle, die derzeit als mehrdimensionales Array gespeichert sind ( 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";}}

Ich versuche, die profile_element_orderOption zu aktualisieren (innerhalb dieser Optionen). So sieht alles bisher aus:

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

Die Daten werden korrekt in die DB-Tabelle geschrieben (da ich einige meiner fehlgeschlagenen Versuche als neue Optionseinträge sehe, wie z. B. mouldings_settings->profile_element_order). Es fällt mir nur schwer, die update_option()Syntax für diese bestimmte Option herauszufinden . Ich habe Dinge ausprobiert wie:

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

aber im Moment keine Würfel. Alle Hinweise wäre sehr dankbar! Vielen Dank!

Update Das ist, was ich jetzt habe - Ajax-Aktion spart gut, aber wenn ich die Plugin-Optionen speichere, dupliziert es die Optionen in der Datenbank und wirft den gleichen Fehler wie zuvor auf:

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";}

Funktion:

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

Antworten:


36

Für WordPress ist Ihr mehrdimensionales Array eine Option.

Um nur einen Teil des mehrdimensionalen Arrays zu aktualisieren, muss das gesamte Array abgerufen, entsprechend geändert und anschließend das gesamte Array aktualisiert werden.

Angenommen, Ihr mehrdimensionales Array sieht wie folgt aus:

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

Angenommen, Sie möchten den Wert der Option "Hallo" von "Welt" auf "Mond" aktualisieren.

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

1
Hallo Steven - Ich habe meine ursprüngliche Frage mit dem, was ich jetzt habe, aktualisiert und während es mit Ajax funktioniert (speichert die Position beim Aktualisieren), werden die Optionen in der DB-Tabelle ein wenig unordentlich, sobald ich die Plugin-Einstellungen speichere und aktualisiere ( sieht doppelt aus) was einen Fehler auslöst - gehe ich das immer noch falsch an? Vielen Dank.
Zach

Wollen Sie damit sagen, dass die Zeile selbst dupliziert wird? Oder erscheinen Ihre Optionen doppelt in der Zeile? Versuchen Sie, die Option zu löschen und es erneut zu versuchen. Möglicherweise behalten Sie einfach die Duplikate Ihrer vorherigen Versuche bei.
Stephen Harris

Hallo Stephen - habe einen Pastebin meiner Schritte erstellt, um das Problem zu reproduzieren: pastebin.com/YHg1i7HR Danke!
Zach

Versuchen Sie, Ihre zu entfernen array_merge. Das verursacht die Vervielfältigung. Sie führen ein Array mit einem Unterarray zusammen (wodurch das Unterarray dupliziert wird).
Stephen Harris

Hallo Stephen - ich denke, ich bin mir nur unsicher, wie ich das dann schreiben soll - ich habe gerade $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);jetzt das nicht dupliziert (und schreibt richtig in die DB, was gut ist) - aber auf Seite speichern (Plugin-Einstellungen speichern) wird die Plugin-Einstellung immer noch aus der Datenbank entfernt (wie der letzte Teil dieses Pastebins).
Zach
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.