Добавление произвольной ссылки в меню администратора?
Есть ли способ добавить произвольную гиперссылку в меню администратора WordPress (я имею в виду меню слева, когда вы входите в панель администратора)? Например, можно ли добавить ссылку на Google?
В моем конкретном случае я хотел бы добавить страницу руководства по стилю для темы Wordpress, над которой я работаю, чтобы я мог показать пользователю, как различные HTML-элементы стилизуются в соответствии с темой, и продемонстрировать, как красиво стилизовать различные вещи.
Это код, который у меня есть до сих пор ( примечание: это неполно): В functions.php Я добавил новый пункт меню в разделе Внешний вид:
add_action('admin_menu', 'create_theme_style_page');
function create_theme_style_page() {
add_theme_page('Theme Styleguide', 'Theme Styleguide', 'administrator', basename(__FILE__),'build_styleguide_page');
}
function build_styleguide_page() {
echo "Not sure what goes here to redirect admin to a arbitrary url?";
}
В build_styleguide_page()
попытка перенаправления с помощью header()
приводит к ошибке ( Не удается изменить информацию заголовка).
3 answers
Привет @Том,
Если я правильно понял ваш вопрос, вам не так уж и нужно знать, как добавить ссылку в меню (кажется, вы это уже знаете), но вместо этого вам нужно научиться правильно перенаправлять вашу ссылку, верно?
Перенаправление на внешний URL-адрес из пункта меню администратора
Если это так, то вам нужно не использовать функцию пункта меню, а вместо этого "подключить" WordPress достаточно рано, чтобы он ничего не выводил за исключением, возможно, HTTP-заголовков. Самый ранний хук при вызове /wp-admin/themes.php
, по-видимому, after_setup_theme
, и, похоже, он работает хорошо.
Используйте "Слизняк меню", Чтобы вы могли проверить его в крючке
Но чтобы заставить его работать, нам сначала нужно изменить ваш вызов на add_theme_page
в функции admin_menu
hook/your create_theme_style_page()
. Мы удалили пятый параметр (функцию, вызываемую для реализации опции администратора), потому что он нам не нужен, и изменили четвертый параметр ( "слизняк меню") на 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(
'Theme Styleguide',
'Theme Styleguide',
'administrator',
'themes.php?goto=build-styleguide-page'
);
}
Кстати, мы избавились от вашей функции build_styleguide_page()
, потому что она нам не нужна для этого решения.
Перенаправление в самом раннем крючке для themes.php
: after_setup_theme
В качестве нашего последнего бита кода мы реализуем наш хук after_setup_theme
в нашей функции redirect_from_admin_menu()
. У нас есть тест, чтобы проверить, является ли текущая страница themes.php
, и убедиться, что параметр URL goto
был передан по URL. Затем он проверяет значение goto
, используя switch
/case
заявление, чтобы узнать, имеет ли оно значение 'build-styleguide-page'
; если это так, оно перенаправляется на указанный вами гипотетический, например, 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
hook/redirect_from_admin_menu()
, чтобы было проще добавлять дополнительные перенаправленияgoto
, если вам нужно; просто добавьте больше операторов case.Функции
wp_redirect()
иwp_safe_redirect()
на самом деле не завершаются; вам нужно явно выдать инструкцию exit, чтобы WordPress остановился и не переопределял ваше перенаправление.
Надеюсь, это поможет!
Если вы добавите свой элемент в меню, добавив его непосредственно в массив $submenu
, вы избавитесь от необходимости выполнять перенаправление и сможете использовать полный внешний URL-адрес в качестве ссылки на меню (я делаю это сам).
add_action( 'admin_menu' , 'admin_menu_new_items' );
function admin_menu_new_items() {
global $submenu;
$submenu['index.php'][500] = array( 'Menu item name', 'manage_options' , 'http://example.com' );
}
index.php
представляет ключ/ссылку родительского меню, поэтому в примере я в основном добавляю элемент в Панель мониторинга меню..
Конечно, это не так красиво, как использование функций add_{type}_page
, но это позволяет обойти тот факт, что WordPress предотвращает удаленные URL-адреса в ссылки на меню администратора..
Я использую нечто подобное для добавления различных виртуальных хостов в меню, чтобы я мог переключаться на другие установки непосредственно из меню администратора (все делается с помощью скрипта, но в основном используется улучшенная версия вышеупомянутого кода).
ПРИМЕЧАНИЕ: Если вы решите использовать код, просто будьте осторожны, чтобы не назначить используемый ключ (ключ массива 500 в примере кода).
СОВЕТ: Вы действительно можете использовать отрицательные значения в клавишах меню, чтобы, таким образом, вы могли заставьте пункты меню располагаться перед любым из собственных элементов WordPress.
Я добился того же с помощью этого:
function add_custom_menu_item(){
add_menu_page( 'Menu Item Title', 'Page Title', 'manage_options', 'page_slug', 'function', 'dashicons-icon', 1 );
}
add_action( 'admin_menu', 'add_custom_menu_item' );
function custom_menu_item_redirect() {
$menu_redirect = isset($_GET['page']) ? $_GET['page'] : false;
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, и перенаправляете в нужное вам место.