Intereting Posts
изменить верхний баннер на определенной странице Как изменить формат ссылки на файл (<a url="file_link"> Имя </a>) при вставке из медиаплеера Плагин для автоматического форматирования сообщения после отправки Как создать эскизы с фиксированной шириной, поэтому все они будут иметь одинаковую ширину? могу ли я заказать по одному настраиваемому полю и meta_query другой в том же запросе Как добавить поле списка в поле мета-поля? SQL для заказа по результатам CPT пользователем -> имя_файла w / only user-> ID известен Как изменить изображения медиабиблиотеки Как WordPress сообщает, какая почта находится на каком-либо сайте в многоуровневой настройке? Настройка отображаемого изображения при создании сообщения WP REST API: фильтр по категориям 1 и категории 2 Как отображать виджет на странице без темы? пользовательские переменные сеанса теряются в FF Заказ по пользовательскому атрибуту поля Показать все товары по категориям с WooCommerce

Передача аргументов в обратный вызов страницы меню администратора?

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

class MyPlugin { function __construct() { add_action('admin_menu', array(&$this, 'myplugin_create_menus'); } //I don't want to write a function for every options page I create //so I prefer to just load the content from an external file. function load_view($filename) { $view = require(dirname(__FILE__).'/views/'.$filename.'.php'); return $view; } //Here is where the problem comes function myplugin_create_menus() { add_menu_page( 'Plugin name', 'Plugin name', 'manage_options', 'my-plugin-settings', array(&$this, 'load_view') // Where do I specify the value of $filename?? ); } }#end of class 

Я пробовал кучу разных вариантов, но ничего не работает, может быть, я перед этим, но я не вижу этого.

Конечно, это воссоздание, я префиксировал все мои функции, и они не совсем так, как я писал здесь, но я надеюсь, что у вас есть идея, о которой я прошу.

Заранее спасибо.

PD: Если вы хотите увидеть исходный код, я буду рад вставить его и дать вам ссылку.

Solutions Collecting From Web of "Передача аргументов в обратный вызов страницы меню администратора?"

Вы не можете передать аргумент функции обратного вызова. add_menu_page() добавляет его как обработчик действий , а admin.php запускает действие без каких-либо аргументов.

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

 class WPSE16415_Plugin { protected $views = array(); function load_view() { // current_filter() also returns the current action $current_views = $this->views[current_filter()]; include(dirname(__FILE__).'/views/'.$current_views.'.php'); } function myplugin_create_menus() { $view_hook_name = add_menu_page( 'Plugin name', 'Plugin name', 'manage_options', 'my-plugin-settings', array(&$this, 'load_view'), ); $this->views[$view_hook_name] = 'options'; } } 

Другой – пропустить аргумент обратного вызова, поэтому WordPress будет включать файл, указанный самим именем slug, как предлагает Брэди в своем ответе.

Вы всегда можете использовать анонимную функцию (или закрытие). Что-то к влиянию:

 add_menu_page( $page, $menu, $capability, $slug, function() { print_my_admin_page($with_args); }, $icon, $position); 

функция load_view должна быть такой:

 function load_view($filename) { include(dirname(__FILE__).'/views/'.$filename.'.php'); } 

и в вашем файле include он должен отображать все содержимое отображаемой страницы.

РЕДАКТИРОВАТЬ:

Вот что говорит код по этому поводу:

$menu_slug (string) (required) Имя slug для ссылки на это меню (должно быть уникальным для этого меню). До версии 3.0 это называлось параметром file (или handle). Если параметр функции опущен, menu_slug должен быть файлом PHP, который обрабатывает отображение содержимого страницы меню. По умолчанию: нет

$function Функция, отображающая содержимое страницы для страницы меню. Технически параметр функции является необязательным, но если он не указан, то WordPress будет в основном предполагать, что в том числе PHP-файл будет генерировать экран администрирования без вызова функции. Большинство авторов плагинов ставят код генерации страницы в функцию в своем основном файле плагина. В том случае, если указан параметр функции, можно использовать любую строку для параметра файла. Это позволяет использовать страницы, такие как? Page = my_super_plugin_page вместо? Page = my-super-plugin / admin-options.php.

Поэтому я могу понять, что если вы оставите функцию пустой, она попытается включить php-файл на основе того, на что вы установили menu_slug .

EDIT 2

 function load_view() { include(dirname(__FILE__).'/views/'.$this->filename.'.php'); } function myplugin_create_menus() { $this->filename = "something"; add_menu_page( 'Plugin name', 'Plugin name', 'manage_options', 'my-plugin-settings', array(&$this, 'load_view') ); $this->filename = "somethingelse"; add_menu_page( 'Plugin name', 'Plugin name', 'manage_options', 'my-plugin-settings', array(&$this, 'load_view') ); } 

Я решил эту проблему, просто добавив идентификатор (или любые данные, которые вам нужны) в пул меню.

Например:

  add_menu_page( 'Plugin name', 'Plugin name', 'manage_options', 'my-plugin-settings-' . $identifier, 'setting-function-callback' ); 

Затем это создаст URL-адрес с «my-plugin-settings-filename» (как пример), и я могу просто проанализировать эту часть URL-адреса (с помощью $ _GET или filter_input).