Получение списка всех зарегистрированных виджетов панели управления

Вопрос или проблема

Я пытаюсь получить список всех зарегистрированных метабоксов в админке 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, а вместо этого используют обертку, что может ввести в заблуждение.

Решение

Для получения списка виджетов панели управления на пользовательских страницах вам нужно реализовать следующий подход:

  1. Вызов wp_dashboard_setup на вашем пользовательском экране. Это зарегистрирует все виджеты, как если бы вы находились на самой панели управления.
  2. Переместите ваш код к хуку wp_dashboard_setup, чтобы он выполнялся в конце процесса.
  3. Добавьте и удалите виджеты в зависимости от ваших настроек.

Пример кода

Вот пример того, как можно реализовать требуемый функционал:

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. Этот подход позволяет использовать уже зарегистрированные виджеты, что упрощает процесс разработки кастомизированного интерфейса для администрирования.

Используйте описанные методы, чтобы гарантировать эффективное извлечение и отображение виджетов панели управления, обеспечивая удобство для пользователей и улучшая вашу административную панель.

Оцените материал
Добавить комментарий

Капча загружается...