Добавление произвольной ссылки в меню админ-панели WordPress

30 авг. 2010 г., 20:39:48
Просмотры: 15.3K
Голосов: 21

Есть ли способ добавить произвольную гиперссылку в меню админ-панели WordPress (имеется в виду меню слева после входа в админку)? Например, можно ли добавить ссылку на Google?

В моём конкретном случае я хочу добавить страницу стилей для темы WordPress, над которой работаю, чтобы показать пользователю, как различные HTML-элементы стилизованы в теме, и продемонстрировать, как красиво оформить различные элементы.

Вот код, который у меня есть на данный момент (примечание: он неполный). В файле functions.php я добавил новый пункт меню в раздел Внешний вид:

add_action('admin_menu', 'create_theme_style_page');

function create_theme_style_page() {
  add_theme_page('Гайдлайн темы', 'Гайдлайн темы', 'administrator', basename(__FILE__), 'build_styleguide_page');
}

function build_styleguide_page() {
 echo "Не уверен, что здесь нужно добавить для перенаправления администратора на произвольный URL?";
}

В функции build_styleguide_page() попытка перенаправить с помощью header() вызывает ошибку (Cannot modify header information - Невозможно изменить информацию заголовка).

0
Все ответы на вопрос 3
9
22

Если вы добавите свой элемент в меню, напрямую добавив его в массив $submenu, вы избежите необходимости делать редирект и сможете использовать полный внешний URL в качестве ссылки меню (я сам так делаю).

add_action( 'admin_menu' , 'admin_menu_new_items' );
function admin_menu_new_items() {
    global $submenu;
    $submenu['index.php'][500] = array( 'Название пункта меню', 'manage_options' , 'http://example.com' ); 
}  

index.php представляет собой ключ/ссылку родительского меню, так что в примере я добавляю элемент в меню Консоль..

Конечно, это не так красиво, как использование функций типа add_{type}_page, но это обходит ограничение WordPress, которое запрещает внешние URL в ссылках админ-меню..

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

ПРИМЕЧАНИЕ: Если вы решите использовать этот код, будьте осторожны и не используйте ключи, которые уже заняты (как ключ массива 500 в примере).

СОВЕТ: Вы также можете использовать отрицательные значения в ключах меню, чтобы ваши пункты меню располагались перед нативными элементами WordPress.

9 нояб. 2010 г. 19:14:48
Комментарии

ПРИМЕЧАНИЕ: Думаю, вам нужно будет задать этот отрицательный ключ как строку, то есть '-5', а не -5, иначе ключ будет считаться недействительным (кажется).. (отрицательные строки работают, если я не ошибаюсь)..

t31os t31os
10 дек. 2010 г. 01:52:33

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

El Yobo El Yobo
13 сент. 2011 г. 02:39:59

Этот конкретный ответ помог мне с моим плагином Post Status Menu Items (вы, наверное, догадываетесь, что он делает). В любом случае, поскольку я не знал, какие другие плагины могут добавлять элементы в меню, я подумал, что упомяну, что использовал array_push() для добавления пунктов меню, чтобы избежать конфликтов с другими плагинами.

mrwweb mrwweb
29 апр. 2012 г. 00:42:40

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

João João
7 нояб. 2012 г. 12:44:56

+1. Вместо того чтобы выбирать ключ наугад, просто берем последний ключ и увеличиваем его. Например, при добавлении пункта подменю в меню "Инструменты": global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] = и т.д.

webaware webaware
29 мая 2013 г. 10:19:44

Большое спасибо :) Пробовал использовать и Jquery, и редирект, но были проблемы. Этот вариант идеален.

user1632018 user1632018
23 нояб. 2013 г. 04:43:58

У меня есть один вопрос: как добавить еще одну ссылку? Я пробовал использовать многомерный массив, но это не разрешено.

user1632018 user1632018
23 нояб. 2013 г. 05:25:28

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

t31os t31os
24 янв. 2014 г. 20:55:09

Чтобы открыть ссылку в новой вкладке / новой странице (target="_blank"), прочитайте это: https://stackoverflow.com/questions/23036664/how-to-open-target-blank-in-a-custom-admin-sub-menu-page

Cypher Cypher
29 дек. 2022 г. 05:13:33
Показать остальные 4 комментариев
0
13

Привет, @Tom,

Если я правильно понял твой вопрос, тебе нужно не столько узнать, как добавить ссылку в меню (похоже, ты это уже умеешь), а скорее разобраться, как сделать корректный редирект по этой ссылке, верно?

Редирект на внешний URL из пункта меню админки

Если это так, то тебе нужно не использовать стандартную функцию пункта меню, а "подключиться" ("hook") к WordPress настолько рано, чтобы он еще не успел ничего вывести, кроме, возможно, HTTP-заголовков. Самым ранним хуком при вызове /wp-admin/themes.php оказывается after_setup_theme, и он отлично подходит для этой задачи.

Используй "Menu Slug", чтобы проверить его в хуке

Но чтобы это заработало, сначала нужно изменить вызов add_theme_page в хуке admin_menu / функции create_theme_style_page(). Мы убрали пятый параметр (функцию для обработки опции админки), так как он нам не нужен, и изменили четвертый параметр ("menu slug") на themes.php?goto=build-styleguide-page.

Хотя для четвертого параметра можно было выбрать почти что угодно, учитывая, что мы делаем редирект, я использовал ту же страницу (themes.php), что и другие опции внешнего вида, для единообразия. Также я произвольно выбрал имя goto, потому что WordPress его не использует, и оно кажется логичным в данном контексте.

add_action('admin_menu', 'create_theme_style_page');
function create_theme_style_page() {
  add_theme_page(
    'Руководство по стилю темы',  
    'Руководство по стилю',  
    'administrator',  
    'themes.php?goto=build-styleguide-page'  
  );
}

Кстати, мы убрали твою функцию build_styleguide_page(), так как она не нужна для этого решения.

Редирект в самом раннем хуке для themes.php: after_setup_theme

В последнем фрагменте кода мы реализуем хук after_setup_theme в функции redirect_from_admin_menu(). Мы проверяем, является ли текущая страница themes.php, и убеждаемся, что параметр goto был передан в URL. Затем с помощью конструкции switch/case проверяем значение goto: если оно равно 'build-styleguide-page', то делаем редирект на указанный URL (например, Google), в противном случае перенаправляем обратно в админку:

add_action('after_setup_theme', 'redirect_from_admin_menu');
function redirect_from_admin_menu($value) {
  global $pagenow;
  if ($pagenow=='themes.php' && !empty($_GET['goto'])) {
    switch ($_GET['goto']) {
      case 'build-styleguide-page':
        wp_redirect("http://www.google.com");  
        break;
      default:
        wp_safe_redirect('/wp-admin/');  
        break;
    }
    exit;
  }
}

Примечания:

  1. Я использовал конструкцию switch/case в хуке after_setup_theme / функции redirect_from_admin_menu(), чтобы было проще добавить дополнительные редиректы для goto, если это понадобится — просто добавь новые условия case.

  2. Функции wp_redirect() и wp_safe_redirect() сами по себе не завершают выполнение; нужно явно вызвать exit, чтобы WordPress остановился и не переопределил твой редирект.

Надеюсь, это поможет!

30 авг. 2010 г. 21:46:17
0

Я добился того же самого с помощью этого кода:

function add_custom_menu_item(){
    // Добавляем пункт меню в админ-панель
    add_menu_page( 'Заголовок пункта меню', 'Заголовок страницы', 'manage_options', 'page_slug', 'function', 'dashicons-icon', 1 );
}
add_action( 'admin_menu', 'add_custom_menu_item' );

function custom_menu_item_redirect() {
    // Проверяем параметр 'page' в URL
    $menu_redirect = isset($_GET['page']) ? $_GET['page'] : false;

    // Если параметр соответствует нашему slug, выполняем редирект
    if($menu_redirect == 'page_slug' ) {
        wp_safe_redirect( home_url('/my-page') );
        exit();
    }

}
add_action( 'admin_init', 'custom_menu_item_redirect', 1 );

Здесь мы добавляем пункт меню и определяем его slug, затем в хуке 'admin_init' проверяем наличие этого slug и перенаправляем на нужную страницу.

21 янв. 2015 г. 23:15:46