创建管理插件-页面的内容也在全局范围内显示

时间:2015-06-12 作者:Boris Lapouga

我已经开始创建一个WP插件,它应该只在管理区域工作。

我已经设法创建了带有所需子菜单项的顶级菜单,但当我尝试打印页面内容时,它会在管理面板的全局范围内和页面本身内打印两次。

主插件文件加载菜单设置和单独的页面类:require\\u once(\'settings.php\');

require_once(\'pages/VmSettingsPage.php\');
require_once(\'pages/VmTradersPage.php\');

$settingsPage = new VmSettingsPage();
$tradersPage = new VmTradersPage();
菜单设置:

add_action(\'admin_menu\', \'cvmAdminMenu\');
function cvmAdminMenu() {
    add_menu_page(\'VM Tool\', \'VM Tool\',
        \'manage_options\', \'camden-vmtool\', [\'VmSettingsPage\',\'pageInit\']);

    add_submenu_page(\'camden-vmtool\', \'Traders Pages\', \'Traders Pages\', \'manage_options\',
        \'camden-vmtool-traders\', [\'VmTradersPage\',\'pageInit\']);
    add_submenu_page(\'camden-vmtool\', \'Style Pages\', \'Style Pages\', \'manage_options\',
        \'camden-vmtool-style\', \'cvmRenderStyle\');
    add_submenu_page(\'camden-vmtool\', \'Cat Navs\', \'Cat Navs\', \'manage_options\',
        \'camden-vmtool-cat-navs\', \'cvmRenderCatnavs\');
}
设置页面类:

<?php

class VmSettingsPage {
    private $options;

    public function __construct()
    {
        add_action(\'admin_init\', [$this, \'pageInit\']);
    }

    public function pageInit() {
        echo 23123;
    }
}
问题#1-上述代码将输出23123两次,访问插件页面时和未访问插件页面时。如何使其仅在页面为当前屏幕时打印页面内容?基本上:http://localhost/wp-admin/admin.php?page=camden-vmtool

问题#2-如何基于当前打开的页面仅预加载一个页面类?我将有大约4个页面,一次加载类感觉很糟糕,只是为了启动类实例。

顺便说一句,获取\\u current\\u屏幕的基本参数!=$_获取[\'page\',因此我甚至无法匹配这些内容来打印正确的内容。

Check the output

谢谢

1 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

问题#1-上述代码将输出23123两次,访问插件页面时和未访问插件页面时。如何使其仅在页面为当前屏幕时打印页面内容?基本上:http://localhost/wp-admin/admin.php?page=camden-vmtool

初始化类时,您正在挂接pageInit() 方法转换为在所有管理页面上激发的挂钩。然后在add_menu_page() 参数。

老实说,我不明白这一点:

问题#2-如何基于当前打开的页面仅预加载一个页面类?我将有大约4个页面,一次加载类感觉很糟糕,只是为了启动类实例。

至于第一个问题,我不知道是什么PageInit() 需要这样做,但由于信息有限,因此无需事先实例化该类。其工作原理如下:

class VmSettingsPage {
    private $options;

    public function __construct()
    {
        add_action(\'admin_init\', array($this, \'pageInit\'));
    }

    public function pageInit() {
        echo 23123;
    }
}
// $settingsPage = new VmSettingsPage();

add_action(\'admin_menu\', \'cvmAdminMenu\');
function cvmAdminMenu() {
    add_menu_page(\'VM Tool\', \'VM Tool\',
        \'manage_options\', \'camden-vmtool\', array(\'VmSettingsPage\',\'pageInit\'));

}
该类将自动实例化。如果确实需要实例化该类,则回调应该不同:

class VmSettingsPage {
    private $options;

    public function __construct()
    {
//         add_action(\'admin_init\', array($this, \'pageInit\'));
    }

    public function pageInit() {
        echo 23123;
    }
}
global $settingsPage;
$settingsPage = new VmSettingsPage();

add_action(\'admin_menu\', \'cvmAdminMenu\');
function cvmAdminMenu() {
  global $settingsPage;
    add_menu_page(\'VM Tool\', \'VM Tool\',
        \'manage_options\', \'camden-vmtool\', array($settingsPage,\'pageInit\'));
}
如果你这样做,那么你就不能使用admin_init 但没有明显的理由使用它admin_init 不管怎么说,都是钩子。

我进一步建议您将所有内容封装到类中:

class VmSettingsPage {
    private $options;

    public function __construct()
    {
//         add_action(\'admin_init\', array($this, \'pageInit\'));
      add_action(\'admin_menu\', array($this,\'cvmAdminMenu\'));

    }

    function cvmAdminMenu() {
        add_menu_page(\'VM Tool\', \'VM Tool\',
            \'manage_options\', \'camden-vmtool\', array($this,\'pageInit\'));
    }

    public function pageInit() {
        echo 23123;
    }
}
$settingsPage = new VmSettingsPage();

结束

相关推荐

200未登录时返回代码‘post/wp-admin/admin-ajax.php’

我注意到以下日志条目:111.22.3.444 - - [13/Mar/2015:08:31:00 +0100] \"POST /wp-admin/admin-ajax.php HTTP/1.1\" 200 618 \"https://cap5.nl/veiligheidstips-en-voorkom-hacken-van-je-wachtwoord/\" \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chro