无法让简单的插件管理页面正常工作

时间:2022-02-03 作者:helgew

尽管我有多年的软件开发经验,但我对WP&;PHP开发,所以请大家耐心等待。

通读后the plugin manual, 我从一个WP plugin boiler plate, 进行了所有必需的字段和名称更改,添加了自定义功能,并且作为第一个真正的功能,尝试为插件添加一个简单的管理界面,如下所示:

<?php

class Plugin_Name_Admin {

    // some code ommitted, the actual code uses my plugin\'s name, slugs, and fields

    public function init() {
        add_action(\'admin_menu\', array($this, \'add_plugin_admin_menu\'));
    }

    function add_plugin_admin_menu() {
            add_menu_page(
                \'Plugin Name\',
                \'Plugin Menu\',
                PLUGIN_USER_CAPABILITY,
                \'plugin-name-admin\',
                array( $this, \'admin_page\' ),
                null,
                1
            );
        }
    
    function admin_page() {
        if ( current_user_can( PLUGIN_USER_CAPABILITY ) ) {
            require_once plugin_dir( __FILE__ ) . \'partials/plugin-name-admin-display.php\';
        }
    }
}
菜单将显示具有指定功能的用户,URL如下所示http://wp.localhost/wp-admin/admin.php?page=plugin-name-admin 但无论是管理员还是其他用户PLUGIN_USER_CAPABILITY 可以访问该页面。错误消息为;抱歉,不允许您访问此页面"E;错误发生在wp-admin/includes/plugin.php 在函数中user_can_access_admin_page 如果WP检查以下各项:

        if ( ! isset( $_registered_pages[ $hookname ] ) ) {
            return false;
        }
它使用的hookname是admin_page_plugin-name-admin-admin.

我错过了什么?

此外,任何关于如何在PhpStorm中正确调试WP代码的指针都将不胜感激。到目前为止,我只是在处理添加的错误消息。

EDIT: 这个Plugin_Name_Admin 类在样板代码的主类中实例化define_admin_hooks 函数,它还为init 功能:

    private function define_admin_hooks() {

        $plugin_admin = new Plugin_Name_Admin( $this->get_plugin_name(), $this->get_version() );

        $this->loader->add_action( \'admin_enqueue_scripts\', $plugin_admin, \'enqueue_styles\' );
        $this->loader->add_action( \'admin_enqueue_scripts\', $plugin_admin, \'enqueue_scripts\' );
        $this->loader->add_action( \'admin_init\', $plugin_admin, \'init\' );

    }
此函数从main类的构造函数调用,并使用boiler plate的loader方法创建挂钩。

正如我在下面的回答中提到的,将呼叫更改为add_plugin_admin_menu 从一个钩子admin_menu 直接调用解决了权限错误。

EDIT2: 我要和PhpStorm合作XDebug 使用this write-up.

1 个回复
SO网友:helgew

嗯,就像往常一样,昨天我在这个问题上撞了几个小时,最后决定寻求帮助,几分钟内我就解决了。以下是我需要更改的内容:

    public function init() {
        // add_action(\'admin_menu\', array($this, \'add_plugin_admin_menu\'));
        $this-> add_plugin_admin_menu();
    }
显然,关于WP中的调用链,我还有很多需要学习的地方。