为什么此全局数组从回调函数返回空值

时间:2017-11-15 作者:mrKC.988

这让我疯狂了好几个小时。。。请告诉我为什么$ppk\\u fields数组在ppk\\u field\\u回调函数中为空?请注意,它在ppk\\u default\\u id函数中返回正确的值,但这不是回调函数。非常感谢。

ppk。php

class Ppk {

    public function ini() {
        add_action( \'admin_menu\', array( $this, \'add_ppk_p_menu\' ) );
    }

    public function add_ppk_p_menu() {
        add_submenu_page( \'tools.php\', \'PPK PLUGIN\', \'PPK PLUGIN\', \'manage_options\', \'ppk_p\', array( $this, \'ppk_build_dashboard\' ) );
    }

    public function ppk_build_dashboard() {
        require_once plugin_dir_path( __FILE__ ) . \'ppk-builder.php\';
    }

}

if ( class_exists( \'Ppk\' ) ) {
    $ppk = new Ppk();
    $ppk->ini();
} 
ppk生成器。php

$ppk_sections = [
    \'section_1\' => [
        \'title\' => \'Group One\'
    ]
];

$ppk_fields = [
    \'field 1\' => [
        \'title\'   => \'Fieald One\',
        \'type\'    => \'text\',
        \'section\' => \'section_1\',  
        \'default\' => \'default\'
    ]
];

register_setting( \'ppk-builder\', \'ppk-builder\', \'ppk-builder_validate\' );

    foreach ($ppk_sections as $id => $value) {
        add_settings_section( $id, $value[\'title\'], \'ppk_section_callback\', \'ppk_p\');
    }

    foreach ($ppk_fields as $id => $value) {       
        add_settings_field( $id, $value[\'title\'], \'ppk_field_callback\', \'ppk_p\', $value[\'section\'], $id );
    }

function ppk_section_callback() {return null;}

function ppk_default_id( $id ) {
    global $ppk_fields;

    return $ppk_fields[ $id ][\'default\'];
}

function ppk_field_callback($id) {
    global $ppk_fields;

    $option = get_option(\'ppk-builder\');
    $id_field = isset($option[$id]) ? $option[$id] : ppk_default_id($id);

    switch ($ppk_fields[$id][\'type\']) {
        case \'text\':        
            echo \'<input type="text" name="ppk-builder[\' . $id . \']" value="\' . $id_field . \'"/>\';
        break;
    }
}


settings_fields( \'ppk-builder\' );
do_settings_sections( \'ppk_p\' ); 

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

这里的问题是,您从未创建$ppk_fields 作为全局变量。

$ppk_fields = [
    \'field 1\' => [
        \'title\'   => \'Fieald One\',
        \'type\'    => \'text\',
        \'section\' => \'section_1\',  
        \'default\' => \'default\'
    ]
];
这里我们有一个正常创建的变量,它遵循正常的范围规则。它不是一个全局变量,也没有人说过它是一个全局变量。

进一步查看我们的文件:

function ppk_field_callback($id) {
    global $ppk_fields;
但是,全局变量$ppk_fields 是未定义的,没有人定义它。每次使用该变量时,都必须将其声明为全局变量,这包括创建和销毁。没有例外。

因此,您需要:

使用定义变量时声明该变量是全局变量global $ppk_fields

做错了,但还有一个更大的问题。最大的问题是您使用了全局变量。全局变量是避免构建程序、中断单元测试和引入不必要复杂性的好方法

例如,如果您将上述所有代码都放在一个类中,那么就不需要全局变量。然后$this->fields 就是你要用的。

下面是一个部分示例:

ppk_settings.php:

class PPK_Settings {
    private $sections;
    private $fields;

    function __construct() {
        $this->sections = [
            \'section_1\' => [
                \'title\' => \'Group One\'
            ]
        ];
        $this->fields = [
            \'field 1\' => [
                \'title\'   => \'Fieald One\',
                \'type\'    => \'text\',
                \'section\' => \'section_1\',  
                \'default\' => \'default\'
            ]
        ];
    }

    function register() {
        register_setting( \'ppk-builder\', \'ppk-builder\', \'ppk-builder_validate\' );

        foreach ($this->sections as $id => $value) {
            add_settings_section( $id, $value[\'title\'], array( $this, \'section_callback\' ), \'ppk_p\');
        }

        foreach ($this->fields as $id => $value) {       
            add_settings_field( $id, $value[\'title\'], array( $this, \'ppk_field_callback\' ), \'ppk_p\', $value[\'section\'], $id );
        }
    }

    // etc... other methods go here
}

usage:

require_once( \'ppk_settings.php\' );    
$settings = new PPK_Settings();
$settings->register();
你可以选择OO方式PPK_FieldPPK_Section 对象,这样您就可以定义字段,然后在数组上循环创建对象,而无需访问它们,也无需全局变量或成员变量

结束

相关推荐

Virtual Pages plugins

我很难让插件正常工作Virtual Pages (WordPress插件可简化虚拟页面的创建)我确实进行了编辑,根据查询创建了一个循环。add_action( \'gm_virtual_pages\', function( $controller ) { /* Creating virtuals pages for companies */ $args = array( \'post_type\' => array(\'companies\',), \'post_status\'