Cập nhật tùy chọn được lưu trữ trong mảng nhiều chiều


15

Tôi có dữ liệu trong wp_optionsbảng hiện được lưu dưới dạng mảng đa chiều ( 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";}}

Những gì tôi đang cố gắng thực hiện là cập nhật profile_element_ordertùy chọn (trong các tùy chọn đó). Đây là cách mọi thứ trông cho đến nay:

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

Dữ liệu được đăng chính xác vào bảng DB (vì tôi có thể thấy một số lần thử thất bại của mình dưới dạng các mục tùy chọn mới, như mouldings_settings->profile_element_order) - Tôi chỉ gặp khó khăn khi tìm ra update_option()cú pháp cho tùy chọn cụ thể đó. Tôi đã thử những thứ như (ghi nhớ `mouldings_sinstall là tên tùy chọn thực tế):

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

nhưng không có xúc xắc tại thời điểm này. Bât cư thông tin được cung câp nao cung được la sự suât hiện tuyệt vơi! Cảm ơn!

Cập nhật Đây là những gì tôi có bây giờ - hành động ajax tiết kiệm tốt, nhưng khi tôi lưu các tùy chọn plugin, nó sẽ sao chép các tùy chọn trong cơ sở dữ liệu và đưa ra lỗi tương tự như trước:

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

Chức năng:

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

Câu trả lời:


36

Theo như WordPress có liên quan - mảng đa chiều của bạn là một lựa chọn.

Để cập nhật chỉ là một phần của mảng đa chiều, cần phải lấy toàn bộ mảng, thay đổi nó cho phù hợp và sau đó cập nhật toàn bộ mảng.

Giả sử mảng đa chiều của bạn như sau:

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

Và giả sử bạn muốn cập nhật giá trị của tùy chọn 'xin chào' từ 'thế giới' thành 'mặt trăng'

//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
Xin chào Steven - Tôi đã cập nhật câu hỏi ban đầu của mình với những gì tôi có bây giờ và trong khi nó hoạt động với Ajax (lưu vị trí khi tôi làm mới) một khi tôi lưu cài đặt plugin và làm mới, các tùy chọn trong bảng DB hơi lộn xộn ( có vẻ trùng lặp) đó là một lỗi - tôi vẫn đang tiếp cận sai đó phải không? Cảm ơn.
Zach

Bạn đang nói rằng hàng tự nó được nhân đôi? Hoặc tùy chọn của bạn xuất hiện trùng lặp bên trong hàng? Hãy thử xóa tùy chọn và thử lại - có thể bạn chỉ đơn giản là giữ các bản sao khỏi các lần thử trước.
Stephen Harris

Xin chào Stephen - đã tạo ra một quá khứ trong các bước của tôi để tái tạo vấn đề: pastebin.com/YHg1i7HR Cảm ơn!
Zach

Hãy thử loại bỏ của bạn array_merge. Điều đó gây ra sự trùng lặp. Bạn đang hợp nhất một mảng với một mảng con (làm cho mảng con bị trùng lặp).
Stephen Harris

Xin chào Stephen - Tôi đoán là tôi không chắc chắn về cách viết nó sau đó - Tôi chỉ có $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);bây giờ không có bản sao (và ghi vào DB chính xác là tốt) - nhưng trên lưu trang (lưu cài đặt plugin) , cài đặt plugin vẫn bị xóa khỏi cơ sở dữ liệu (như phần cuối cùng của pastebin đó).
Zach
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.