ตัวเลือกการปรับปรุงที่เก็บอยู่ในอาร์เรย์หลายมิติ


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 เกี่ยวข้อง - อาเรย์หลายมิติของคุณเป็นตัวเลือกหนึ่ง

หากต้องการอัปเดตส่วนหนึ่งของอาร์เรย์หลายมิติที่จำเป็นในการดึงข้อมูลอาร์เรย์ทั้งหมดให้แก้ไขตามนั้นแล้วอัปเดตอาร์เรย์ทั้งหมด

สมมติว่าอาเรย์หลายมิติของคุณเป็นดังนี้:

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

และสมมติว่าคุณต้องการอัปเดตค่าของตัวเลือก 'สวัสดี' จาก 'โลก' เป็น 'ดวงจันทร์'

//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 - ฉันได้อัปเดตคำถามเดิมของฉันกับสิ่งที่ฉันมีตอนนี้และในขณะที่มันทำงานกับ Ajax (บันทึกตำแหน่งเมื่อฉันรีเฟรช) เมื่อฉันบันทึกการตั้งค่าปลั๊กอินและรีเฟรชตัวเลือกในตาราง DB จะยุ่งเล็กน้อย ( ดูซ้ำกัน) ซึ่งโยนข้อผิดพลาด - ฉันยังคงเข้าใกล้ที่ผิดหรือเปล่า? ขอบคุณ
Zach

คุณกำลังบอกว่าแถวตัวเองได้รับการทำซ้ำ? หรือตัวเลือกของคุณปรากฏซ้ำภายในแถว? ลองลบตัวเลือกแล้วลองใหม่อีกครั้ง - อาจเป็นเพราะคุณเพียง แต่เก็บข้อมูลซ้ำจากความพยายามครั้งก่อน
Stephen Harris

สวัสดีสตีเฟ่น - ทำขั้นตอนการทำซ้ำของฉันเพื่อวางปัญหา: pastebin.com/YHg1i7HRขอบคุณ!
Zach

array_mergeลองลบของคุณ นั่นเป็นสาเหตุของการทำซ้ำ คุณกำลังผสานอาเรย์กับอาเรย์ย่อย (ทำให้อาเรย์ย่อยซ้ำกัน)
Stephen Harris

สวัสดีสตีเฟ่น - ฉันเดาว่าฉันแค่ไม่แน่ใจว่าจะเขียนสิ่งนั้นแล้ว - ฉันเพิ่งมี$mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);ซึ่งไม่มีการทำซ้ำ (และเขียนไปยังฐานข้อมูลอย่างถูกต้องซึ่งเป็นสิ่งที่ดี) - แต่ในหน้าบันทึก (บันทึกการตั้งค่าปลั๊กอิน) การตั้งค่าปลั๊กอินจะถูกลบออกจากฐานข้อมูลยัง (ตามที่ส่วนสุดท้ายของ pastebin นั้น)
Zach
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.