多次元配列に格納された更新オプション


15

wp_options現在、多次元配列(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";}}

私が達成しようとしているのは、profile_element_orderオプションを更新することです(それらのオプション内で)。これまでのところ、すべてがどのように見えるかです:

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

データはDBテーブルに正しく投稿されています(失敗した試行の一部がのような新しいオプションエントリとして表示されるためmouldings_settings->profile_element_order)- update_option()特定のオプションだけの構文を理解するのに苦労しています。私は次のようなことを試しました( `mouldings_settingsが実際のオプション名であることを念頭に置いてください):

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

しかし、現時点ではサイコロはありません。どんなポインタでも大歓迎です!ありがとう!

更新 これは私が今持っているものさ- AJAXアクションは罰金を節約できますが、私はプラグインのオプションを保存するとき、それはデータベースのオプションを複製し、前と同じエラーをスローします。

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

関数:

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

回答:


36

WordPressに関する限り、多次元配列は1つのオプションです。

多次元配列の一部のみを更新するには、配列全体を取得する必要があり、それに応じて変更してから配列全体を更新します。

多次元配列が次のようになっていると仮定します。

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

そして、「hello」オプションの値を「world」から「moon」に更新するとします。

//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
こんにちはSteven-プラグインの設定を保存して更新すると、DBテーブルのオプションが少し乱雑になります(更新時に位置を保存します)。重複しているように見えます)これはエラーをスローしています-私はまだ間違っていますか?ありがとう。
ザック

行自体が複製されると言っていますか?または、行内でオプションが重複して表示されますか?オプションを削除して再試行してください。以前の試行からの重複を単に保持している可能性があります。
スティーブンハリス

こんにちはスティーブン-私の問題を再現するための手順のペーストビンを作成しました:pastebin.com/YHg1i7HRありがとう!
ザック

を削除してみてくださいarray_merge。それが重複の原因です。配列をサブ配列とマージしています(サブ配列を複製するようにします)。
スティーブンハリス

こんにちはスティーブン-私はそれを書く方法がわからないだけだと思います- $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);重複のない(そしてDBに正しく書き込むのは良いです)だけですが、ページ保存(プラグイン設定の保存) 、プラグインの設定はデータベースから削除されます(pastebinの最後の部分と同様)。
ザック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.