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


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

Author: mrwweb, 2010-08-30

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;
  }
}

Примечания:

  1. Я решил использовать switch/case оператор в функции after_setup_theme hook/redirect_from_admin_menu(), чтобы было проще добавлять дополнительные перенаправления goto, если вам нужно; просто добавьте больше операторов case.

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

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

 13
Author: MikeSchinkel, 2010-08-31 09:15:33

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

 22
Author: t31os, 2010-11-09 17:14:48

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

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, и перенаправляете в нужное вам место.

 3
Author: Bobz, 2015-01-21 21:15:46