php 从不同的类触发WP操作钩子函数

ozxc1zmp  于 2023-02-18  发布在  PHP
关注(0)|答案(1)|浏览(126)

在一个自定义插件中,我正在WP中创建一个自定义菜单页面,在主Asset加载器类中有一个admin_menu钩子。在一个单独的文件中,我有另一个名为Leads_UI的类,它包含public static function leads_html(),用于输出标记以显示在此自定义管理页面上。
如果您在下面的代码中看到register_leads_dashboard函数,如果我通过同一个类而不是Leads_UI类调用leads_html函数,它将按预期工作,并在您位于Leads页面时输出html。
但如果我尝试使用来自单独Leads_UILeads_UI::leads_html()public static function leads_html(),则会导致2个错误:

  1. html在 Jmeter 板中的每一页上输出,并显示在主要内容后面的左上角,
    1.当我单击 Jmeter 板中的“潜在客户”页面时,它会抛出404页面未找到错误。
    可能是什么问题?我是OOP的新手。
namespace MWS_PLUGIN\Inc;

use MWS_PLUGIN\Inc\Traits\Singleton;

class Assets {

    use Singleton;

    protected function __construct() {
        // Load all critical functions
        $this->setup_hooks();
    }

    protected function setup_hooks() {
        //Add a new screen for 'Leads' CPT
        add_action( 'admin_menu', [$this, 'register_leads_dashboard'] );
    }

    public function register_leads_dashboard() {
        // This causes unexpected behaviour
        add_menu_page( __( 'Leads', 'my-plugin' ), __( 'Leads', 'my-plugin' ), 'manage_options', 'leads-list', Leads_UI::leads_html(), 'dashicons-admin-users', 50 );

        // This works perfectly!
        //add_menu_page( __( 'Leads', 'my-plugin' ), __( 'Leads', 'my-plugin' ), 'manage_options', 'leads-list', [ $this, 'leads_html' ], 'dashicons-admin-users', 50 );
    }

    public function leads_html() {
        esc_html_e( 'Leads page test', 'my-plugin' );
    }
}

Lead_UI类位于单独的文件中:

namespace MWS_PLUGIN\Inc;
    
class Leads_UI {
        
    private function __construct(){
    }
        
    public static function leads_html() {
        esc_html_e( 'Leads page test', 'my-plugin' );
    }
}

mzmfm0qo

mzmfm0qo1#

add_menu_page()函数的第五个参数具有 callable 类型。
但是,你的代码并没有传递这个可调用对象,而是调用了你的void Leads_UI::leads_html()函数,然后把这个函数缺少的返回值传递给add_menu_page(),所以这个函数在你调用add_menu_page()的时候被调用了,这不是你想要的。

add_menu_page( __( 'Leads', 'my-plugin' ), __( 'Leads', 'my-plugin' ), 
               'manage_options', 'leads-list',
               Leads_UI::leads_html(),         /* NOT a callable! */
               'dashicons-admin-users', 50 );

您需要将静态函数指定为可调用函数,如下所示:

[ Leads_UI::class, 'leads_html' ]

给出这样的代码。

add_menu_page( __( 'Leads', 'my-plugin' ), __( 'Leads', 'my-plugin' ), 
               'manage_options', 'leads-list',
               [ Leads_UI::class, 'leads_html' ], /* Callable! */
               'dashicons-admin-users', 50 );

相关问题