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
참고 사항 : extract( $args, EXTR_SKIP );의 시작 부분에서 왜 oenology_hooks_setting_callback()배열의 모든 부분을 새 것으로 저장할 필요가 $var없습니까? 그런 다음 $'name_inside_the_array예 를 들어로 사용할 수 있습니다 . '$ title , $ tab` 등
kaiser

... 실제로 PHP가 그렇게 똑똑하지는 않기 때문에? :) 나는 그것을 시도 할 것이다; 감사!
칩 베넷

필터와 후크를 추가하고 인수를 구문 분석하고 쿼리 문자열 입력을 처리하는 방법에 대한 "모범 사례"예제를 보여주는 이 Gist를 살펴보고 싶을 것입니다. 그것은 조금 낡았 고 시간이되면 다시 작업 할 것입니다. 그러나 그것은 가치가 있습니다. :)
kaiser 2016

이것은 실제로 Oenology에 추가 한 후크에 UI를 추가하는 플러그인입니다. 테마에 실제로 후크를 추가 한 방법에 매우 익숙합니다 . 이제는 최종 사용자에게 노출시키는 편리한 방법을 제공하려고합니다.
Chip Bennett

나는 당신을 오해하지 않았습니다. 나는 그것이 당신에게 도움이 될 때를 대비하여 이것을 보여주고 싶었습니다. 나는이 코드를 아이러니 한 것으로 본다
기울이는가

답변:


18

당신이 보면 do_settings_sections 더 구체적으로 콜백 함수가 실행되고있는 라인 1164 기능 :

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

$ section 배열이 콜백 함수에 전달되고 있음을 알 수 있습니다. $section['id']

이것이 이후에 희망되기를 바랍니다.

최신 정보

다음은 예입니다. 모든 섹션에 대한 add_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) id이 첫 번째 인수가 될 것입니다add_settings_section()
Rarst

@ Chip Bennett 나는 더 잘 설명하고 설명하는 예제를 추가했습니다.
Bainternet 2018 년

@Bainternet : 대단해! 옵션 스크립트가 있으며 Chip Bennett과 동일한 문제를 만났습니다. 이제는 매력처럼 작동합니다. 감사.
Anh Tran

자, 주말에 클릭이되었습니다. 내가 생각한 코드를 시험 해보고 다시보고하겠습니다.
칩 베넷

4

나는 이것이 오래된 질문이라는 것을 알고 있지만 다른 누군가가 오기 위해 2 센트를 넣을 것이다. 더 간단한 방법은 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 );
}

또는 콜백 인수는 우리가 사용하는 배열 자체 일 수 있습니다.

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그것은 통과 $sectionsBainternet가 명시된 바와 같이 추가 전체 배열하는 것이이 수단 paramater을 $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.