这里的问题是,您从未创建$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_Field
和
PPK_Section
对象,这样您就可以定义字段,然后在数组上循环创建对象,而无需访问它们,也无需全局变量或成员变量