CALL_USER_FUNC_ARRAY()要求参数1是有效的回调,数组必须正好有两个成员

时间:2016-07-27 作者:Kiran Dash

我正在尝试在插件中创建一个主题选项页面。我已将整个代码粘贴到下面。但它给出了一个错误:

call_user_func_array() expects parameter 1 to be a valid callback, array must have exactly two members

class KD_Options {

    public function __construct(){
        $this->register_settings_and_fields();
    }

    public function add_menu_page(){
        add_options_page(\'Theme Options\',\'Theme Options\',\'administrator\',__FILE__, array(\'KD_Options\'),\'display_options_page\'); 
    }

    public function display_options_page(){
        ?>
        <div class="wrap">
            <h2>My theme Options</h2>
            <form method="post" action="options.php" enctype="multipart/form-data">
                <?php settings_fields(\'kd_plugin_options\');//includes all the hidden fields for security ?>
                <?php do_settings_sections(__FILE__); ?>
            </form>
        </div>
        <?php               
    }

    public function register_settings_and_fields(){
        register_setting(\'kd_plugin_options\',\'kd_plugin_options\');//3rd parameter = optional cb
        //get_option(\'kd_plugin_options\');  
        add_settings_section(\'kd_main_section\', \'Main Settings\', array($this, \'kd_main_section_cb\'), __FILE__);//id, title of section, cb, which page?
        add_settings_field(\'kd_banner_heading\',\'Banner Heading\', array($this, \'kd_banner_heading_setting\'), __FILE__, \'kd_main_section\');
        add_settings_field(\'kd_logo\',\'Your Logo: \', array($this, \'kd_logo_setting\'), __FILE__, \'kd_main_section\');
    }

    /*
     *
     * Inputs
     *
     */

     // Banner Heading
     public function kd_banner_heading_setting() {
         echo \'<input>\';
     }

     // Logo
     public function kd_logo_setting() {
         echo \'<input type="file">\';
     }

     //Function for validation and sanitization
     public function kd_main_section_cb(){
         //optional
     }

}

add_action(\'admin_menu\', function(){
    KD_Options::add_menu_page();
});

add_action(\'admin_init\', function(){
    new KD_Options();
});
我想这有点问题add_settings_section 其中kd_main_section_cb 没有接到电话什么的。我在调试脚本时遇到了一些问题。所以,如果有人能帮助我,让我知道问题所在。

1 个回复
最合适的回答,由SO网友:Andy Macaulay-Brook 整理而成

这里的参数相当错误:

add_options_page(
    \'Theme Options\',
    \'Theme Options\',
    \'administrator\',
    __FILE__, 
    array(\'KD_Options\'),
    \'display_options_page\'
); 
因为您在一个类中,所以回调需要array( $this, \'display_options_page\' ) 而不仅仅是函数名。对于类内的WP回调,可以使用该数组格式,以便正确引用它们。

然而add_options_page 取5个参数,而不是6个,它们应该是:

add_options_page(
    $page_title, 
    $menu_title, 
    $capability, 
    $menu_slug, 
    $function
);
因此,类似这样的方法应该有效:

add_options_page(
    \'Theme Options\',
    \'Theme Options\',
    \'administrator\',
    \'wpse_233388_slug\',
    array( $this, \'display_options_page\' )
); 
您最好使用真正的功能,而不是为您的功能指定角色名称。这样,可以允许其他角色使用该功能,而无需让用户关注管理员。

相关推荐