Вопрос или проблема
Я пытаюсь получить список всех зарегистрированных метабоксов в админке WordPress, в частности, виджетов панели управления.
Сейчас это легко достигается с помощью глобальной переменной $wp_meta_boxes
и делает именно то, что мне нужно, но только когда я нахожусь на странице панели управления.
Если я нахожусь на пользовательской странице админки или странице настроек, например, я ничего не получаю. Я пытаюсь получить список виджетов панели управления и дать пользователям возможность разместить их на другой пользовательской странице админки / панели управления.
Есть несколько других похожих вопросов о получении этих метабоксов, и я aware о следующем коде, который был предоставлен в качестве ответа, однако у него та же проблема, и он возвращает пустой массив, если не находится на странице панели управления:
function get_meta_boxes( $screen = null, $context="advanced" ) {
global $wp_meta_boxes;
if ( empty( $screen ) )
$screen = get_current_screen();
elseif ( is_string( $screen ) )
$screen = convert_to_screen( $screen );
$page = $screen->id;
return $wp_meta_boxes[$page][$context];
}
У кого-нибудь есть идеи? Должна ли переменная $wp_meta_boxes
работать, и может быть что-то не так с моей настройкой? Или есть другой способ это сделать?
Любая помощь будет очень признательна!
Причина этого в том, что виджеты панели управления не используют API метабоксов напрямую, они используют API, который оборачивает его, и регистрируются только на wp_dashboard_setup
и wp_network_dashboard_setup
.
Они также называются виджетами панели управления, а не метабоксами, поэтому большинство пользователей не поймут, о чем вы говорите, если будете упоминать метабоксы. Метабоксы панели управления могут относиться к любому метабоксу в WP Admin.
Это означает, что на вашей пользовательской странице админки эти хуки не срабатывают, в результате чего глобальная переменная не содержит виджетов панели управления.
Кроме того, стандартные виджеты WP не отображают себя через эти хуки, а наоборот, добавляются в той же функции, которая отображает саму панель управления, wp_dashboard_setup
. Эта функция регистрирует основные виджеты панели управления, срабатывает хуки для плагинов, чтобы добавить свои, а затем вызывает API метабоксов, чтобы отобразить их.
Поэтому вам нужно:
- вызывать
wp_dashboard_setup
на ваших пользовательских страницах - переместить ваш код в хук
wp_dashboard_setup
и убедиться, что он выполняется последним/поздно - добавлять и удалять виджеты в зависимости от установленных вами опций
Может быть, будет проще полностью удалить и заменить основной интерфейс панели управления, API никогда не предназначался для того, чтобы его использовали для того, что вы пытаетесь с ним сделать.
Просто имейте в виду, что пользовательский интерфейс параметров экрана не отразит ваши изменения и может активно мешать тому, что вы делаете.
Ответ или решение
Как получить список всех зарегистрированных виджетов на панели управления WordPress
Введение
Получение списка всех зарегистрированных виджетов на панели управления WordPress — это задача, с которой часто сталкиваются разработчики. Несмотря на то, что доступ к виджетам панели управления можно получить через глобальную переменную $wp_meta_boxes
, это работает только на странице панели управления. В случае, если вы находитесь на пользовательской странице администрирования или на странице настроек, глобальная переменная будет пустой.
Проблема и ее причины
При регистрации виджетов панели управления используются хуки wp_dashboard_setup
и wp_network_dashboard_setup
. Эти хуки не срабатывают при загрузке пользовательских страниц администрирования, что и приводит к пустым массивам при попытке доступа к $wp_meta_boxes
.
Из-за того, что на пользовательских страницах не вызываются стандартные функции, которые добавляют виджеты, $wp_meta_boxes
не будет содержать информации о них. Более того, виджеты панели управления не являются экземплярами метабоксов API, а вместо этого используют обертку, что может ввести в заблуждение.
Решение
Для получения списка виджетов панели управления на пользовательских страницах вам нужно реализовать следующий подход:
- Вызов
wp_dashboard_setup
на вашем пользовательском экране. Это зарегистрирует все виджеты, как если бы вы находились на самой панели управления. - Переместите ваш код к хуку
wp_dashboard_setup
, чтобы он выполнялся в конце процесса. - Добавьте и удалите виджеты в зависимости от ваших настроек.
Пример кода
Вот пример того, как можно реализовать требуемый функционал:
add_action('admin_init', 'custom_dashboard_widgets');
function custom_dashboard_widgets() {
// Проверяем, находимся ли мы на нужной странице
if (isset($_GET['page']) && $_GET['page'] == 'your_custom_page') {
// Симуляция вызова основной функции регистрации виджетов
wp_dashboard_setup();
}
}
function get_dashboard_widgets() {
global $wp_meta_boxes;
// Убедимся, что глобальная переменная была инициализирована
if (!empty($wp_meta_boxes['dashboard']['normal']['core'])) {
return $wp_meta_boxes['dashboard']['normal']['core'];
}
return [];
}
// Пример использования
add_action('admin_menu', function() {
add_menu_page('Custom Dashboard', 'Custom Dashboard', 'manage_options', 'your_custom_page', 'custom_dashboard_page');
});
function custom_dashboard_page() {
$widgets = get_dashboard_widgets();
foreach ($widgets as $widget_id => $widget) {
echo '<h2>' . esc_html($widget->title) . '</h2>';
}
}
Заключение
Интеграция виджетов панели управления на пользовательские страницы требует извлечения данных из хука wp_dashboard_setup
. Этот подход позволяет использовать уже зарегистрированные виджеты, что упрощает процесс разработки кастомизированного интерфейса для администрирования.
Используйте описанные методы, чтобы гарантировать эффективное извлечение и отображение виджетов панели управления, обеспечивая удобство для пользователей и улучшая вашу административную панель.