我目前正在尝试为wordpress构建一个插件来构建设置页面。但由于某种原因,当我使用add_action("admin_init", array(class_object, \'function_name\'))
它将运行add\\u action函数,但不会访问回调。它只是跳过了它。
我试着用与主类相同的方式创建一个包含1个函数的测试类,这确实有效。所以我在某处做了一些不同的事情,但我不知道是什么。
这是代码。我已经将代码拆分为3个不同的文件,我将按包含文件的顺序发布它。
Index file for the plugin
include(\'admin/options.php\');
function social_share_menu_item() {
add_submenu_page("options-general.php", "Social Share", "Social Share", "manage_options", "social-share", \'socialShareOptions\');
}
add_action("admin_menu", "social_share_menu_item");
...
options.php
include_once(\'settings/SocialOptions.class.php\');
function socialShareOptions(){
$options = array(
array(
\'type\' => \'checkbox\',
\'name\' => \'social-share-facebook\',
\'value\' => 1,
\'title\' => \'Show Facebook \'
),
array(
\'type\' => \'checkbox\',
\'name\' => \'social-share-twitter\',
\'value\' => 1,
\'title\' => \'Show Twitter\'
),
array(
\'type\' => \'checkbox\',
\'name\' => \'social-share-instagram\',
\'value\' => 1,
\'title\' => \'Show instagram\'
)
);
$socialOptions = new SocialOptions($options);
$socialOptions->buildSettingsPage();
add_action("admin_init", array($socialOptions, \'setOptions\') );
}
SocialOptions.class.php
class SocialOptions {
private $_optionsArray;
function __construct( $options = array() ) {
$this->_optionsArray = $options;
}
public function setOptions() {
add_settings_section("social_share_config_section", "", null, "social-share");
foreach ( $this->_optionsArray as $option) {
add_settings_field("social-share-facebook", $option[\'title\'], array($this, \'option\'), "social-share", "social_share_config_section", $option);
}
foreach ( $this->_optionsArray as $option) {
register_setting("social_share_config_section", $option[\'name\']);
}
}
public function option( $fieldData ){
?>
<input type="<?php echo $fieldData[\'type\'] ?> " name="<?php echo $fieldData[\'name\']; ?>" value="<?php echo $fieldData[\'value\'] ?>"<?php checked(1, get_option($fieldData[\'name\']), true)?> /><?php echo $fieldData[\'title\'] ?>
<?php
}
public function buildSettingsPage() {
$html = \'<div class="wrap social-admin-style">
<div class="title">
<h1>Social Sharing Options</h1>
</div>
<div class="main-content">
<form method="post" action="options.php">
\' . settings_fields("social_share_config_section") . \'
\' . do_settings_sections("social-share") . \'
\'. submit_button() . \'
</form>
</div>
</div>\';
echo $html;
}
}
与调试代码之前的状态一样,我看到add\\u action函数正在运行,但在某些情况下,它只是跳到函数的末尾,从不进入setOptions方法。
当我创建以下内容时,效果很好:
options.php
include_once(\'settings/SocialOptions.class.php\');
class Test {
function testing(){
return \'nothing\';
}
}
function socialShareOptions(){
$options = array(
...
);
$socialOptions = new SocialOptions($options);
$socialOptions->buildSettingsPage();
/*NOTE THIS PART*/
$test = new Test();
add_action("admin_init", array($test, \'testing\') );
}
这将在调试中正常运行。这就是为什么我不明白为什么另一种方法不起作用。
Additional information
希望你们能帮忙。谢谢你花时间读这篇文章。如果你需要更多信息,请告诉我。
EDIT
虽然最初的答案不是解决方案是什么,但我希望大家都参考B.Schuiling的asnwer。在评论中,他解释说add\\u操作被调用得很晚,因此没有运行。
以下是更改后的选项。php页面。(我省略了显而易见的代码以使其更简单)
ps 虽然这确实有效,但我打算将代码更改为单例方式。这也是基于B.Schuiling在下面关于自己答案的评论中发布的链接。
请注意,选项数组和类的安装现在位于socialShareOptions函数之外。
include_once(\'settings/SocialOptions.class.php\');
$options = array(
...
)
);
$socialOptions = new SocialOptions($options);
add_action("admin_init", array($socialOptions, \'setOptions\'));
function socialShareOptions(){
global $socialOptions;
$socialOptions->buildSettingsPage();
}