存储在多维数组中的更新选项


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

Answers:


36

就WordPress而言-您的多维数组是 一种选择。

要仅更新多维数组的一部分,就必须检索整个数组,对其进行相应的更改,然后更新整个数组。

假设您的多维数组如下:

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
嗨,史蒂芬:您好,我用我现在拥有的内容更新了我的原始问题,尽管它可以与Ajax一起使用(刷新时保存位置),一旦我保存了插件设置并刷新后,DB表中的选项就会有些混乱(看起来是重复的),这会引发错误-我是否仍在处理该错误?谢谢。
扎克2012年

您是说该行本身被复制吗?还是您的选项在行内显示为重复?尝试删除该选项,然后重试-可能是您只是保留了先前尝试中的重复项。
史蒂芬·哈里斯

嗨,斯蒂芬,您好-我按照步骤制作了一个pastebin,以重现该问题:pastebin.com/YHg1i7HR谢谢!
Zach 2012年

尝试删除您的array_merge。这导致了重复。您正在将一个数组与一个子数组合并(导致子数组重复)。
史蒂芬·哈里斯

嗨,史蒂芬(Stephen)-我想我当时不确定该如何写-我$mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);现在只有一个没有重复的文件(并且正确地写入了数据库,这很好)-但是保存在页面上(插件设置已保存) ,插件设置仍将从数据库中删除(就像该pastebin的最后一部分一样)。
扎克2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.