ADD_ACTION未调用回调函数

时间:2017-11-03 作者:Controvi

我目前正在尝试为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();
}

1 个回复
SO网友:B. Schuiling

在类中,函数名为“public function setOption()”而不是setOptionS。检查错误日志以了解此类问题。

此外,在您的代码中,我没有看到函数“socialShareOptions”实际上在任何地方被调用。

结束

相关推荐

使用Apply_Filters帮助输出POST类

我不熟悉脚本,这是一个插件,我想修改它来输出post类。当我尝试使用时:apply_filters( \'post_class\', $page->post_class ) it仅输出array=\" \". 我是否需要一个附加函数来连接到post类?在我的研究中,我无法判断我的语法是否错误,或者我在类中缺少了一个要“拉”的函数apply_filters 抓住。非常感谢你的帮助。 var $db_fields = array (\'parent\' => \'post_parent\',