Добавление страницы администратора – подход ООП не работает

У меня есть родительский класс, который содержит следующее:

use app\My_Dashboard; class My_Class { public function __construct() { add_action('admin_menu', array($this, 'setup_dashboard_page')); } public function setup_dashboard_page() { My_Dashboard::add_dashboard_page(); } } 

И класс, который имеет функцию администратора:

 class My_Dashboard { public static function add_dashboard_page() { add_menu_page('My Settings', 'My Settings', 'my-settings', array($this, 'dashboard_page_cb')); } public function dashboard_page_cb() { //The markup } } 

Этот подход не работает, и я не могу видеть, что добавлен пункт меню и страница администратора. Второй подход, который я пробовал:

 use app\My_Dashboard; class My_Class { public function __construct() { add_action('admin_menu', array($this, 'setup_dashboard_page')); } public function setup_dashboard_page() { //Not very sure of the syntax, bad at OOP add_menu_page('My Settings', 'My Settings', 'my-settings', 'My_Dashboard::dashboard_page_cb'); } } 

Как мне заставить его работать? Моя идея состоит в том, чтобы отделить все связанные с приборной панелью вещи другому классу.

Обновление: первый подход работал, и элемент меню добавлен. Но функция обратного вызова, которая выводит разметку страницы, похоже, не работает. Я проверил для опечаток, но все выглядит хорошо.

Solutions Collecting From Web of "Добавление страницы администратора – подход ООП не работает"

Я ненавижу ООП, смешанный в функциональной структуре wordpress (здесь идут downvotes …..). Если вы используете ООП только для межстрочного интервала, просто используйте функцию межстрочного интервала PHP, ставя функцию в класс – это лишь малая часть того, что должно быть ООП.

Во всяком случае, ваши проблемы в том, что есть только два способа ссылаться на метод класса, либо когда он связан с конкретным объектом, либо является статичным в классе (в основном связанном с классом, но не с объектами). В коде вы пытаетесь обрабатывать связанную с объектом функцию, как если бы она была статичной (я уверен, что если вы проверите свой журнал ошибок, вы увидите некоторую соответствующую ошибку). Есть два возможных способа исправить это: 1. Сделать соответствующие функции статичными и использовать синтаксис во втором варианте. 2. использовать singleton patter, создать экземпляр объекта класса панели мониторинга, сохранить его как глобальный и использовать его вместо класса имя в вашем первом варианте. вместо

 public function setup_dashboard_page() { My_Dashboard::add_dashboard_page(); } 

делать

 global $dashboard; $dashboard = new my_dashboard() ..... public function setup_dashboard_page() { global $dashboard; $dashboard->add_dashboard_page(); } 

И всегда отлаживайте код с полной отчетностью об ошибках и исправляйте все ошибки и уведомления;)

Рабочий пример

 class PluginSkeleton { public function __construct(){ add_action('admin_menu',array($this,'pluginskeleton_menu')); } public function pluginskeleton_menu(){ add_menu_page( 'Application Users', 'Application Users', 'manage_options', 'application-users.php',array($this,'application_users_page')); } public function application_users_page(){ echo 'i am here'; } } 

используйте $ this с функцией обратного вызова

 add_menu_page( 'Application Users', '...', ...', '...',array($this,'application_users_page'));