จะส่งผ่านตัวแปรไปยัง add_settings_section () โทรกลับได้อย่างไร


16

ฉันพยายามทำให้เป็นอัตโนมัติเท่าที่จะทำได้ฟังก์ชั่นการตั้งค่า API จะเรียกใช้การตั้งค่าแต่ละอย่างในปลั๊กอิน วนรอบตัวเลือกอาร์เรย์และแสดงผลadd_settings_section()และadd_settings_field()ง่ายพอ:

add_settings_section():

$oenology_hooks_tabs = oenology_hooks_get_settings_page_tabs();
foreach ( $oenology_hooks_tabs as $tab ) {
    $tabname = $tab['name'];
    $tabtitle = $tab['title'];
    $tabsections = $tab['sections'];
    foreach ( $tabsections as $section ) {
        $sectionname = $section['name'];
        $sectiontitle = $section['title'];
        $sectiondescription = $section['description'];
        // Add settings section
        add_settings_section(
            'oenology_hooks_' . $sectionname . '_section',
            $sectiontitle,
            'oenology_hooks_' . $sectionname . '_text',
            'oenology_hooks_' . $tabname . '_tab'
        );
    }
}

และ `add_settings_field ():

global $oenology_hooks;
$oenology_hooks = oenology_hooks_get_hooks();

foreach ( $oenology_hooks as $hook ) {
    $hookname = $hook['name'];
    $hooktitle = $hook['title'];
    $hooktab = $hook['tab'];
    $hooksection = $hook['section'];
    add_settings_field(
        'oenology_hooks_' . $hookname,
        $hooktitle,
        'oenology_hooks_setting_callback',
        'oenology_hooks_' . $hooktab . '_tab',
        'oenology_hooks_' . $hooksection . '_section',
        $hook
    );
}

ด้วยadd_settings_field()ฉันสามารถเขียนการเรียกกลับทั่วไปโดยส่งผ่าน$hookตัวแปรไปยังการเรียกกลับเป็นพารามิเตอร์ตัวที่ห้าในการเรียกฟังก์ชัน:

function oenology_hooks_setting_callback( $hook ) {
    $oenology_hooks_options = get_option( 'plugin_oenology_hooks_settings' ); 
    $hookname = $hook['name'];
    $hooktitle = $hook['title'];
    $hookdescription = $hook['description'];
    $hooktype = $hook['type'];
    $hooktab = $hook['tab'];
    $hooksection = $hook['section'];
    $inputvalue = $hookname . '_hide';
    $inputname = 'plugin_oenology_hooks_settings[' . $inputvalue . ']';
    $textareaname = 'plugin_oenology_hooks_settings[' . $hookname . ']';
    $textareavalue = $oenology_hooks_options[$hookname];
    if ( 'Filter' == $hooktype ) {
        ?>
        <input type="checkbox" name="<?php echo $inputname; ?>" value="<?php echo $inputvalue;?>" <?php checked( true == $oenology_hooks_options[$inputvalue]  ); ?> />
        <span>Hide <?php echo $hooktitle; ?> content?</span><br />
        <?php
    }
    ?>
    <span class="description"><?php echo $hooktype; ?> Hook: <?php echo $hookdescription; ?></span><br />
    <textarea name="<?php echo $textareaname; ?>" cols="80" rows="3" ><?php 
        echo esc_textarea( $textareavalue ); 
    ?></textarea>
    <?php 
}

อย่างไรก็ตามปรากฏว่าadd_settings_section()ไม่มี$argsพารามิเตอร์แบบอะนาล็อก ดังนั้นฉันไม่สามารถใช้วิธีการเดียวกันเพื่อส่งผ่าน$sectionตัวแปรไปยังการเรียกกลับ

ดังนั้นคำถามของฉัน: มีวิธีการส่งตัวแปรไปยังการadd_settings_section()โทรกลับหรือวิธีอื่น ๆ ในการสร้างการโทรกลับคล้ายกับสิ่งที่ฉันทำเพื่อadd_settings_field()อะไร

แก้ไข:

@Bainternet จับมัน! นี่คือรหัสการทำงานของฉัน:

/**
 * Callback for add_settings_section()
 * 
 * Generic callback to output the section text
 * for each Plugin settings section. 
 * 
 * @param   array   $section_passed Array passed from add_settings_section()
 */
function oenology_hooks_sections_callback( $section_passed ) {
    global $oenology_hooks_tabs;
    $oenology_hooks_tabs = oenology_hooks_get_settings_page_tabs();
    foreach ( $oenology_hooks_tabs as $tab ) {
        $tabname = $tab['name'];
        $tabsections = $tab['sections'];
        foreach ( $tabsections as $section ) {
            $sectionname = $section['name'];
            $sectiondescription = $section['description'];
            $section_callback_id = 'oenology_hooks_' . $sectionname . '_section';
            if ( $section_callback_id == $section_passed['id'] ) {
                ?>
                <p><?php echo $sectiondescription; ?></p>
                <?php
            }
        }
    }
}

1
แค่ sidenote: ทำไมคุณไม่extract( $args, EXTR_SKIP );เริ่มแรกoenology_hooks_setting_callback()เลยคุณไม่ต้องบันทึกทุก ๆ ส่วนของอาเรย์ใหม่$var? สิ่งเหล่านี้จะพร้อม$'name_inside_the_arrayสำหรับเช่น '$ title , $ tab` ฯลฯ
ไกเซอร์

... เพราะฉันไม่ได้ฉลาดกับ PHP จริงๆ :) ฉันจะลองดู ขอบคุณ!
Chip Bennett

บางทีคุณอาจต้องการดูGist นี้ซึ่งแสดงตัวอย่าง "บางทีอาจเป็นวิธีปฏิบัติที่ดีที่สุด" เกี่ยวกับวิธีการเพิ่มตัวกรองและตะขออาร์กิวเมนต์การแยกวิเคราะห์และจัดการกับอินพุตสตริงข้อความค้นหา มันเก่าไปหน่อยและฉันจะทำใหม่เมื่อฉันมีเวลา แต่ imo มันคุ้มค่าที่จะดู :)
ไกเซอร์

นี่เป็นเพียงปลั๊กอินที่เพิ่ม UI สำหรับ hooks ที่ฉันได้เพิ่มลงใน Oenology ฉันค่อนข้างสบายใจกับวิธีที่ฉันเพิ่มตะขอลงในธีม ตอนนี้ฉันแค่พยายามหาวิธีที่สะดวกในการเปิดเผยให้ผู้ใช้เห็น
Chip Bennett

ฉันไม่ได้คิดถึงคุณ ฉันแค่ต้องการแสดงให้คุณเห็นในกรณีนี้อาจช่วยคุณได้ทุกเมื่อ ฉันเห็นรหัสนี้เป็นสิ่งที่น่าขัน - เพียงแค่ดูความพยายามเท่าไหร่ก็คือการได้รับแต่ละและทุกอย่างสำหรับทุกคนในทาง wordpress ...
kaiser

คำตอบ:


18

หากคุณดูที่ฟังก์ชั่นdo_settings_sectionsโดยเฉพาะเจาะจงมากขึ้นบรรทัดที่ 1164 ซึ่งมีการเรียกใช้ฟังก์ชันการเรียกกลับ:

call_user_func($section['callback'], $section);

คุณจะเห็นว่าอาเรย์ส่วน $ จะถูกส่งผ่านไปยังฟังก์ชั่นการโทรกลับเพื่อให้คุณสามารถระบุการโทรกลับโดย $section['id']

หวังว่าสิ่งนี้ทำตั้งแต่

ปรับปรุง

นี่คือตัวอย่างหากชื่อ call_settings_section ของคุณสำหรับทุกส่วนถูกตั้งชื่อoenology_hooks_section_callbackคุณสามารถระบุได้ดังนี้:

function oenology_hooks_section_callback($section_passed){
    if ($section_passed['id'] == 'whatever_section_id'){
        //do stuff
    }
    if ($section_passed['id'] == 'whatever_section_id_number2'){
        //do other stuff
    }
 }

และทำสิ่งที่ฉันหมายถึงทำสิ่งที่คุณต้องการจะทำกับการเรียกกลับส่วนที่


อืม ... ดูเหมือนว่าจะมีแนวโน้ม ฉันจะกำหนดได้$section['id']อย่างไร
Chip Bennett

@hip Bennett idจะเป็นข้อโต้แย้งแรกที่คุณส่งไปadd_settings_section()
Rarst

@Chip Bennett ฉันได้เพิ่มตัวอย่างเพื่อพยายามอธิบายให้ดียิ่งขึ้น
Bainternet

@Bainternet: ยอดเยี่ยม! ฉันมีสคริปต์ตัวเลือกและพบปัญหาเช่นเดียวกับ Chip Bennett ตอนนี้มันทำงานเหมือนจับใจ ขอบคุณ
Anh Tran

ตกลงดังนั้นในที่สุดมันก็คลิกไปสุดสัปดาห์ ให้ฉันลองใช้รหัสที่มีในใจและฉันจะรายงานกลับ
Chip Bennett

4

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันจะโยนสองเซ็นต์ของฉันในกรณีที่มีคนอื่นมา; วิธีที่ง่ายกว่าในการทำเช่นนั้นคือคุณเขียนการดัดแปลงของadd_settings_section()ฟังก์ชันเองซึ่งจะเพิ่มพารามิเตอร์ args โทรกลับในตอนท้ายของฟังก์ชัน

นี่จะมีลักษณะเช่นนี้ (หรืออะไรทำนองนี้)

function my_add_settings_section($id, $title, $callback, $page, $callbackargs) {

global $wp_settings_sections;

if ( !isset($wp_settings_sections) ) 
{
    $wp_settings_sections = array();
}

if ( !isset($wp_settings_sections[$page]) )
{
    $wp_settings_sections[$page] = array();
}

if ( !isset($wp_settings_sections[$page][$id]) )
{
    $wp_settings_sections[$page][$id] = array();
}

$wp_settings_sections[$page][$id] = array( 'id' => $id, 'title' => $title, 'callback' => $callback, 'callbackargs' => $callbackargs, 'page' => 'page' );
}

ตอนนี้คุณเพียงแค่ใช้สิ่งนี้แทนฟังก์ชั่น wordpress ดั้งเดิมและเข้าถึงการเรียกกลับของคุณผ่าน'callbackargs'คีย์อาเรย์ในแบบปกติเช่นนี้

function oenology_hooks_sections_callback( $section_passed ) {
   // Our callback arguments  
   $section_passed['callbackargs']
}

ซึ่งเราสามารถใช้ส่งผ่านไปยังฟังก์ชั่นอื่น ๆ :

 function oenology_hooks_sections_callback( $section_passed ) {
   // Our callback arguments  
   $args = $section_passed['callbackargs'];
   some_other_function( $args );
}

หรือโทรกลับ args อาจเป็นอาร์เรย์เองที่เราใช้:

function oenology_hooks_sections_callback( $section_passed ) {
   // Our callback arguments  
   if ( $section_passed['callbackargs']['stuff'] !== 'things' ) 
   {
       echo 'stuff is not things!";
   }
}

สิ่งนี้เป็นไปได้ทั้งหมดเนื่องจากทั้งหมดadd_settings_section()เพิ่มสมาชิกอาเรย์ใหม่ให้กับ$wp_settings_sectionsตัวแปรโกลบอลสมาชิกอาเรย์ใหม่นั้นอาจเป็นอาเรย์ที่มีจำนวนของคีย์ที่มีชื่อแตกต่างกันซึ่งสามารถใช้งานได้โดยฟังก์ชันใด ๆ ที่รู้ว่ามีอยู่ เมื่อdo_settings_sectionsเรียกcall_user_func_arrayมันผ่าน$sectionsparamater เป็น Bainternet สังเกตที่นี้หมายถึงว่าอาร์เรย์ทั้งหมดเราได้เพิ่มการ$wp_settings_sectionsในmy_add_settings_section()จะผ่านเข้าสู่การเรียกกลับของเราหมายถึงเรามีการเข้าถึงทุกสมาชิกของอาร์เรย์ใหม่ที่เราเพิ่มไปเช่นcallbackargsช่วยให้การทำงานของเราที่จะมีการเต็มรูปแบบ โทรกลับมาอย่างเปี่ยมประสิทธิภาพ

แม้ว่าฉันจะแน่ใจว่าสิ่งนี้อาจชัดเจนฉันคิดว่าฉันจะอธิบายในกรณีที่คนที่สับสนดู


1

นอกจากนี้คุณยังสามารถใช้วิธีการทั่วไปที่มากขึ้นโดยไม่มองหาการใช้งานฟังก์ชั่นเฉพาะ (หมายถึงโดยไม่ตรวจสอบว่า add_settings_section ส่งผ่านสิ่งใดโดยปริยาย) วิธีการทั่วไปนี้ใช้การปิด PHP

วิธีการใช้งานในทุกสถานที่ที่คุณส่งชื่อฟังก์ชั่นแทนมันผ่านฟังก์ชั่นที่ไม่ระบุชื่อกับการใช้งานอยู่ในนั้น

ตัวอย่าง:

แทน

foreach ( $ar as $name => value ) {
    add_settings_section(
        $section,
        'something',
        'something-else',
        'callback_name'
    );
}

function callback_name() {
    do_something();
}

คุณสามารถใช้ได้:

foreach ( $ar as $name => value ) {
    add_settings_section(
        $section,
        'something',
        'something-else',
        function () use ( $name, $value ) {
            callback_name( $name, $value )
        }
    );
}

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