php - admin_init 没有被触发

标签 php wordpress

我正在编写一个 WordPress 插件,首先,我将菜单添加到 WordPress,然后每个菜单回调首先触发 admin_init 并需要所需的页面。这是我的逻辑

<?php

class EasySEO
{

    public function __construct()
    {

        $this->wp_easy_seo_register_menu_page();
    }

    public function wp_easy_seo_register_menu_page()
    {
        add_menu_page('Easy SEO : General Setting', 'Easy SEO', 'manage_options', 'wp-easy-seo-dashboard', array(
            $this,
            'wp_easy_seo_general_cb'
        ));
        add_submenu_page('wp-easy-seo-dashboard', 'Easy SEO : General Setting', 'General', 'manage_options', 'wp-easy-seo-dashboard', array(
            $this,
            'wp_easy_seo_general_cb'
        ));
        add_submenu_page('wp-easy-seo-dashboard', 'Title & Metas - Easy SEO', 'Title & Metas', 'manage_options', 'wp_easy_seo_title', array(
            $this,
            'wp_easy_seo_title_cb'
        ));
        add_submenu_page('wp-easy-seo-dashboard', 'Verify Domain Ownership - Easy SEO', 'Domain Verification', 'manage_options', 'wp_easy_seo_domain_ownership_verify', array(
            $this,
            'wp_easy_seo_domain_ownership_verify_cb'
        ));
        add_submenu_page('wp-easy-seo-dashboard', 'Web Traffic Statistics - Easy SEO', 'Traffic Statistics', 'manage_options', 'wp_easy_seo_traffic_statistics', array(
            $this,
            'wp_easy_seo_traffic_statistics_cb'
        ));

    }

    function wp_easy_seo_general_cb()
    {



    }

    function wp_easy_seo_title_cb()
    {
        add_action('admin_init', function()
        {
            require 'wp_easy_seo_title.php';
        });


    }

    function wp_easy_seo_domain_ownership_verify_cb()
    {
        require 'wp_easy_seo_domain_ownership_verify.php';
    }


    function wp_easy_seo_traffic_statistics_cb()
    {
        require 'wp_easy_seo_traffic_statistics.php';
    }


}

add_action('admin_menu', function()
{   
    new EasySEO;   
});
?>

Admin_init 没有被触发,这就是下一页没有加载的原因。我试过 echo 1;exit;相反,要求检查代码是否流向我的 echo 1;仍然失败。

这是我的 wp_easy_seo_title 页面:

<?php

class EasySEO_Options {

    public $options;

    public function __construct() {

        $this->options=  get_option('wp_easyseo_homepage_options');

        $this->easy_seo_display_options_page();
         $this->wp_easy_seo_register_settings_and_field();

    }

    public function easy_seo_display_options_page() {

        ?>
        <div class='wrap'>
            <h2>Title & Metas - Easy SEO</h2>
            <form action="options.php" enctype="multipart/form-data" method="POST">
        <?php


       settings_fields('wp_easyseo_homepage_options');
       do_settings_sections('wp_easy_seo_title');

        ?>

                <p class="submit">
                    <input name='submit' type='submit' class='button-primary' value='Save Changes'/>

                </p>
            </form>

        </div>
        <?php

    }



    public function wp_easy_seo_register_settings_and_field() {


        register_setting('wp_easyseo_homepage_options', 'wp_easyseo_homepage_options');
        add_settings_section('wp-easyseo-main-settings', 'Title & Metas', array($this, 'wp_easyseo_main_settings_cb'), 'wp_easy_seo_title');
        add_settings_field('wp-easy-seo-title', 'Meta Title', array($this, 'wp_easy_seo_title_cb'), 'wp_easy_seo_title', 'wp-easyseo-main-settings');
        add_settings_field('wp-easy-seo-description', 'Meta Description', array($this, 'wp_easy_seo_description_cb'), 'wp_easy_seo_title', 'wp-easyseo-main-settings');
    }

    public function wp_easyseo_main_settings_cb() {

    }

    /**
     * Inputs
     */
    public function wp_easy_seo_title_cb() {

       echo "<input name='wp_easyseo_homepage_options[wp-easy-seo-title]' value='{$this->options['wp-easy-seo-title']}' type='text'/>";
    }

    public function wp_easy_seo_description_cb() {
        echo "<input name='wp_easyseo_homepage_options[wp-easy-seo-description]' value='{$this->options['wp-easy-seo-description']}' type='text'/>";
    }

}

new EasySEO_Options;


?>

最佳答案

现在,您对 add_action('admin_init'... 的调用位于函数 wp_easy_seo_title_cb 内部,直到渲染菜单时才会调用该函数。是在 admin_init 已经发生之后,所以注册得太晚了。

尝试将对 add_action 的所有调用移至类的构造函数中。

我发现最好在构造函数中注册所有操作,以便使事情井井有条并确保所有内容都及时注册。

<?php

class SomePlugin {

    public function __construct() {
        add_action('admin_init', array($this, 'some_callback'));
        add_action('transition_post_status', array($this, 'other_callback'));
        // etc
    }

    public function some_callback() {
        // Do something
    }

    public function other_callback() {
        // Do something
    }
}

new SomePlugin();

这样,当文件加载时,它会立即注册所有的操作 Hook 。除了注册钩子(Hook)之外,构造函数中不应该发生太多其他事情,因为构造函数将在每个页面加载时运行。

关于php - admin_init 没有被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38906370/

相关文章:

html - 如何让用户在 WordPress 所见即所得文本编辑器中更改文本字体和颜色

php - 如何验证在本地主机中运行的 HTML/CSS?

php - WordPress 无法识别简单的 Javascript 文件

javascript - 使用 onclick 函数加载 Bootstrap Modal

wordpress - 修改 WordPress Roots 主题时遇到问题

php - 如何在每篇文章下方添加 'read more' 按钮?

php - 从表中生成唯一的配对——一个 "Fixture"

javascript - 从 Bootstrap DropDown 中选择具有特定 ID 的项目值

PHP/JS : Posting input value with js function and echoing through php

mysql - WordPress 数据库问题