Làm cách nào để chuyển biến sang gọi lại add_sinstall_section ()?


16

Tôi đang cố gắng tự động hóa, càng nhiều càng tốt, chức năng API Cài đặt gọi cho từng cài đặt trong Plugin. Xoay quanh mảng tùy chọn và xuất ra add_settings_section()add_settings_field()đủ đơn giản:

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

Và `add_sinstall_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
    );
}

Với add_settings_field(), tôi có thể dễ dàng viết một cuộc gọi lại chung chung, bằng cách chuyển $hookbiến cho cuộc gọi lại, như là tham số thứ năm trong lệnh gọi hàm:

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 
}

Tuy nhiên, dường như add_settings_section()không có $argstham số tương tự ; do đó, tôi không thể sử dụng cùng một phương thức để truyền $sectionbiến cho hàm gọi lại.

Vì vậy, câu hỏi của tôi: có cách nào để chuyển một biến cho cuộc add_settings_section()gọi lại, hoặc một số cách khác để tạo một cuộc gọi lại tương tự như những gì tôi đang làm add_settings_field()không?

BIÊN TẬP:

@Bai Internet đóng đinh nó! Đây là mã làm việc của tôi:

/**
 * 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
Chỉ là một sidenote: Tại sao bạn không extract( $args, EXTR_SKIP );bắt đầu oenology_hooks_setting_callback(), vì vậy bạn không phải lưu mọi phần của mảng vào một cái mới $var? Những thứ này sau đó sẽ có sẵn $'name_inside_the_array, cho ex. '$ title , $ tab`, v.v.
kaiser

... bởi vì tôi không thực sự thông minh với PHP? :) Tôi sẽ thử. cảm ơn!
Chip Bennett

Có thể bạn muốn xem Gist này , trong đó hiển thị một số ví dụ "có thể thực hành tốt nhất" về cách thêm bộ lọc & móc, phân tích đối số và xử lý đầu vào chuỗi truy vấn. Nó hơi cũ và tôi có thể sẽ làm lại nó khi tôi có thời gian, nhưng imo nó đáng để xem. :)
kaiser

Đây thực sự chỉ là một Plugin bổ sung UI cho hook mà tôi đã thêm vào Oenology. Tôi khá thoải mái với cách tôi thực sự đã thêm các hook vào Theme. Bây giờ, tôi chỉ đang cố gắng cung cấp một cách thuận tiện để hiển thị chúng cho người dùng cuối.
Chip Bennett

Tôi đã không hiểu lầm bạn. Tôi chỉ muốn cho bạn thấy điều này trong trường hợp nó có thể giúp đỡ bạn (bất cứ khi nào). Tôi thấy mã này là một điều gì đó thật mỉa mai - hãy xem thử bao nhiêu công sức để có được mọi thứ cho mọi người theo cách wordpress ...
kaiser

Câu trả lời:


18

nếu bạn nhìn vào hàm do_sinstall_sections cụ thể hơn là dòng 1164 nơi hàm gọi lại đang được thực thi:

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

bạn có thể thấy rằng mảng phần $ đang được chuyển đến hàm gọi lại, do đó bạn có thể xác định hàm gọi lại bằng $section['id']

hy vọng điều này làm cho kể từ đó.

Cập nhật

đây là một ví dụ, nếu cuộc gọi lại add_sinstall_section của bạn cho tất cả các phần được đặt tên oenology_hooks_section_callbackthì bạn có thể xác định nó như thế này:

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

và bằng cách làm công cụ tôi có nghĩa là làm bất cứ điều gì bạn muốn làm với phần gọi lại phần đó.


Hmm ... có vẻ đầy hứa hẹn. Làm thế nào để tôi xác định $section['id']?
Chip Bennett

@Chip Bennett idsẽ là đối số đầu tiên bạn chuyển đếnadd_settings_section()
Rarst

@Chip Bennett Tôi đã thêm một ví dụ để thử và giải thích rõ hơn.
Bai Internet

@Bai Internet: Tuyệt vời! Tôi có một kịch bản tùy chọn và gặp vấn đề tương tự như Chip Bennett. Bây giờ nó hoạt động như một nét duyên dáng. Cảm ơn.
Anh Trần

Được rồi, cuối cùng nó đã nhấp vào cuối tuần; hãy để tôi thử mã tôi có trong đầu và tôi sẽ báo cáo lại.
Chip Bennett

4

Tôi biết đây là một câu hỏi cũ nhưng tôi sẽ ném hai xu của mình vào, trong trường hợp có người khác đi cùng; một cách đơn giản hơn để làm như vậy là viết bản sửa đổi của riêng bạn add_settings_section(), hàm này sẽ chỉ thêm một tham số args gọi lại ở cuối của nó.

Điều này sẽ trông như thế này (hoặc một cái gì đó giống như nó)

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

Bây giờ bạn chỉ cần sử dụng chức năng này thay vì chức năng wordpress riêng và truy cập cuộc gọi lại của bạn thông qua 'callbackargs'khóa mảng theo cách thông thường, như thế này

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

Mà chúng ta có thể sử dụng để chuyển đến một số chức năng khác:

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

Hoặc đối số gọi lại có thể là một mảng mà chúng ta sử dụng:

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

Điều này hoàn toàn có thể bởi vì tất cả đều add_settings_section()bổ sung một thành viên mảng mới vào $wp_settings_sectionsbiến toàn cục, thành viên mảng mới đó có thể là một mảng chứa bất kỳ số khóa nào có tên khác nhau, có thể được sử dụng, bởi bất kỳ chức năng nào biết chúng ở đó. Khi do_settings_sectionsgọi call_user_func_arraynó đi qua một $sectionstham số như BaiNET đã lưu ý, điều này có nghĩa là toàn bộ mảng chúng ta thêm $wp_settings_sectionsvào my_add_settings_section()được chuyển vào cuộc gọi lại của chúng ta, nghĩa là chúng ta có quyền truy cập vào mọi thành viên mảng mới mà chúng ta thêm vào như hàm callbackargscho phép hàm của chúng ta có đầy đủ gọi lại chính thức.

Mặc dù tôi chắc chắn rằng điều này có thể rõ ràng nhưng tôi nghĩ rằng tôi chỉ giải thích nó trong trường hợp ai đó bị nhầm lẫn nhìn vào.


0

Bạn cũng luôn có thể sử dụng một cách tiếp cận tổng quát hơn, không tìm kiếm việc thực hiện chức năng cụ thể (có nghĩa là, mà không cần kiểm tra nếu add_sinstall_section vượt qua bất cứ điều gì ngầm). Cách tiếp cận chung này sử dụng PHP đóng.

Cách sử dụng: ở mọi nơi, nơi bạn truyền một tên hàm, thay vì nó truyền một hàm ẩn danh, với việc sử dụng nó.

Thí dụ:

thay vì

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

function callback_name() {
    do_something();
}

bạn có thể dùng:

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 );
}
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.