Добавление произвольной ссылки в меню админ-панели WordPress
Есть ли способ добавить произвольную гиперссылку в меню админ-панели 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 - Невозможно изменить информацию заголовка).

Если вы добавите свой элемент в меню, напрямую добавив его в массив $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.

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

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

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

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

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

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

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

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

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

Привет, @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;
}
}
Примечания:
Я использовал конструкцию
switch
/case
в хукеafter_setup_theme
/ функцииredirect_from_admin_menu()
, чтобы было проще добавить дополнительные редиректы дляgoto
, если это понадобится — просто добавь новые условияcase
.Функции
wp_redirect()
иwp_safe_redirect()
сами по себе не завершают выполнение; нужно явно вызватьexit
, чтобы WordPress остановился и не переопределил твой редирект.
Надеюсь, это поможет!

Я добился того же самого с помощью этого кода:
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 и перенаправляем на нужную страницу.
