Opcja aktualizacji zapisana w tablicy wielowymiarowej


15

Mam dane w wp_optionstabeli obecnie przechowywane jako tablica wielowymiarowa ( 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";}}

Usiłuję to zaktualizować profile_element_orderopcję (w ramach tych opcji). Oto jak wszystko wygląda do tej pory:

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

Dane są poprawnie wysyłane do tabeli DB (jak widzę niektóre z moich nieudanych prób jako nowe wpisy opcji, jak mouldings_settings->profile_element_order) - Mam właśnie trudności z ustaleniem update_option()składni tej konkretnej opcji. Próbowałem takich rzeczy (pamiętając, że `mouldings_settings to rzeczywista nazwa opcji):

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

ale w tej chwili nie ma kości. Wszelkie wskazówki będą mile widziane! Dzięki!

Aktualizacja Oto, co mam teraz - akcja ajax zachowuje się dobrze, ale kiedy zapisuję opcje wtyczki, duplikuje opcje w bazie danych i wyświetla ten sam błąd, co poprzednio:

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

Funkcjonować:

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

Odpowiedzi:


36

Jeśli chodzi o WordPress - wielowymiarowa tablica jest jedną z opcji.

Aby zaktualizować tylko część tablicy wielowymiarowej, należy pobrać całą tablicę, odpowiednio ją zmienić, a następnie zaktualizować całą tablicę.

Załóżmy, że twoja wielowymiarowa tablica wygląda następująco:

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

Załóżmy, że chcesz zaktualizować wartość opcji „cześć” z „świata” na „księżyc”

//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
Cześć Steven - Zaktualizowałem moje pierwotne pytanie tym, co mam teraz i chociaż działa ono z Ajaxem (zapisuje pozycję po odświeżeniu), kiedy zapiszę ustawienia wtyczki i odświeżam, opcje w tabeli DB stają się trochę niechlujne ( wygląda na powielone), co powoduje błąd - czy nadal podchodzę do tego źle? Dzięki.
Zach

Czy mówisz, że sam wiersz zostaje zduplikowany? A może opcje są zduplikowane w wierszu? Spróbuj usunąć tę opcję i spróbuj ponownie - może się zdarzyć, że po prostu zachowasz duplikaty z poprzednich prób.
Stephen Harris

Cześć Stephen - zrobiłem pastebin z moich kroków w celu odtworzenia problemu: pastebin.com/YHg1i7HR Dziękujemy!
Zach

Spróbuj usunąć swój array_merge. To powoduje duplikację. Scalasz tablicę z pod-tablicą (powodując duplikację pod-tablicy).
Stephen Harris

Cześć Stephen - Chyba nie jestem pewien, jak to wtedy napisać - Po prostu mam $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);teraz, który nie ma duplikacji (i zapisuje do DB poprawnie, co jest dobre) - ale na zapisie strony (zapis ustawień wtyczki) , ustawienie wtyczki jest nadal usuwane z bazy danych (tak jak robi to ostatnia część tej pastebin).
Zach
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.