ฉันจะบันทึกอาร์เรย์เลือกหลายรายการด้วยการตั้งค่า API สำหรับหน้าตัวเลือกปลั๊กอินได้อย่างไร


10

ฉันคิดว่านี่อาจเป็นปัญหากับ PHP ของฉันมากกว่าที่จะใช้การตั้งค่า API แต่ฉันไม่สามารถรับ Wordpress เพื่อบันทึกอาร์เรย์ของข้อมูลสำหรับกล่องแบบเลือกได้หลายแบบ

กล่องแบบเลือกได้หลายรูปแบบสอดคล้องกับเขตข้อมูลเมตาแบบกำหนดเองและตัวเลือกที่เลือกคือประเภทโพสต์ที่กำหนดเองที่จะแสดงเขตข้อมูลเมตานั้น

นี่คือรหัสที่แสดง:

case 'select2':  
        echo "<select id='$id' style='width:15em;height:10em;' class='select$field_class' name='" . $buddha_option_name . "[$id]' multiple>";  
        foreach($choices as $item) {  

            $item = explode("|",$item);  
            $item[0] = esc_html($item[0], 'buddha_textdomain');  

            $selected = ($options[$id]==$item[1]) ? 'selected="selected"' : '';  
            echo "<option value='$item[1]' $selected>$item[0]</option>";  
        } 
        echo "</select>";  
        echo ($desc != '') ? "<br /><span class='description'>$desc</span>" : ""; 
    break;  

$choices ถูกกำหนดไว้ที่นี่เป็น 'ตัวเลือก':

$options[] = array(  
    "section" => "custom_meta",  
    "id"      => BUDDHA_SHORTNAME . "_meta_email",  
    "title"   => __( 'Email Meta Box', 'buddha_textdomain' ),  
    "desc"    => __( 'Select post types to have custom email meta box.', 'buddha_textdomain' ),  
    "type"    => "select2",  
    "std"    => print_r($buddha_option_name[$id]),  
    "choices" => array( __('Posts','buddha_textdomain') . "|post", __('Pages','buddha_textdomain') . "|page", __('Faculty/Staff','buddha_textdomain') . "|staff", __('FAQ','buddha_textdomain') . "|faq", __('Documents','buddha_textdomain') . "|docs", __('Courses','buddha_textdomain') . "|courses" )  
);

และรหัสตรวจสอบ:

case 'select2': 
                // process $select_values 
                    $select_values = array(); 
                    foreach ($option['choices'] as $k => $v) { 
                        // explode the connective 
                        $pieces = explode("|", $v); 

                        $select_values[] = $pieces[1]; 
                    } 
                // check to see if selected value is in our approved array of values! 
                $valid_input[$option['id']] = (in_array( $input[$option['id']], $select_values) ? $input[$option['id']] : '' ); 
            break; 

ปัจจุบันถ้าฉันเลือกมากกว่าหนึ่งค่าจากเขตข้อมูลแบบเลือกได้หลายค่า WP จะบันทึกเพียงหนึ่งค่า (โดยทั่วไปจะเป็นค่าตัวอักษรแรก) ฉันต้องการมันเพื่อบันทึกมากกว่าหนึ่งค่าในอาร์เรย์

ฉันคิดว่าการเพิ่ม[]ในตอนท้าย[$id]อาจช่วยได้ แต่ไม่


อะไรนะ$id? และทำไมใช้print_rในบริบทที่กำหนด?
TheDeadMedic

$idเหมือนกับ"id" => BUDDHA_SHORTNAME . "_meta_email"มันถูกนิยามในฟังก์ชั่นอื่น และฉันไม่รู้จริงๆว่าทำไมฉันถึงprint_rอยู่ที่นั่น
Spartacus

คุณทำให้มันทำงานหรือไม่ Addin []ในตอนท้ายของnameคุณลักษณะช่วยฉัน ตรวจสอบแอตทริบิวต์ชื่ออีกครั้ง คุณตรวจสอบ mySQL db ว่ามีการตั้งค่าอะไรบ้าง?
Radek

ไม่เกี่ยวข้องกับคำถามของคุณ: ฉันคิดว่าคุณสับสนesc_html()และesc_html__()ในรหัสที่แสดง อดีตยอมรับเพียงหนึ่งอาร์กิวเมนต์ หลังยอมรับอาร์กิวเมนต์ที่สองคือโดเมนข้อความ
Pat J

คำตอบ:


1

ดังนั้นดูเหมือนว่ามีสองสิ่งเกิดขึ้นที่นี่:

echo "<select id='$id' style='width:15em;height:10em;' class='select$field_class' name='" . $buddha_option_name . "[$id]' multiple>";  

ดังที่บันทึกไว้โดย @Radek คุณสามารถสร้างชื่อของกล่องที่เลือกเป็นอาร์เรย์โดยใช้[]- เช่นname="my_option_name[]"- สิ่งนี้จะส่งผลให้การยื่นแบบ$_POST['my_option_name']เป็นอาร์เรย์ของตัวเลือกที่เลือกที่คุณสามารถจัดเก็บได้

การดูรหัสของคุณทำให้ฉันนิ่งงันยิ่งขึ้น:

$select_values = array(); 
foreach ($option['choices'] as $k => $v) { 
    // explode the connective 
    $pieces = explode("|", $v); 

    $select_values[] = $pieces[1]; 
} 
// check to see if selected value is in our approved array of values! 
$valid_input[$option['id']] = (in_array( $input[$option['id']], $select_values) ? $input[$option['id']] : '' ); 

คุณเคยบันทึกเพียงหนึ่งค่าไป$valid_input[$option['id']]- เป็นswitchคำสั่งของคุณในวงตัวเอง? ถ้าเป็นเช่นนั้นลองเปลี่ยนบรรทัดสุดท้ายเป็น:

$valid_input[$option['id']][] = (in_array( $input[$option['id']], $select_values) ? $input[$option['id']] : '' );

จดบันทึกไว้[]ก่อนหน้าผู้ให้บริการที่ได้รับมอบหมาย เมื่อคุณบันทึก$valid_inputมันควรจะถือว่าเป็นค่าของ$valid_input[$option['id']]อาร์เรย์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.