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

20

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

Том
источник

Ответы:

13

Привет @ Том ,

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

Перенаправление на внешний URL из пункта меню администратора

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

Используйте «Menu Slug», чтобы вы могли проверить его в Hook

Но чтобы заставить его работать, нам сначала нужно изменить ваш вызов add_theme_pageв admin_menuхуке / вашей 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()функции, потому что она нам не нужна для этого решения.

Перенаправление в самый ранний Hook для 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хуке / redirect_from_admin_menu()функции, чтобы было проще добавлять дополнительные gotoперенаправления, если это необходимо; просто добавьте больше случаев.

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

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

MikeSchinkel
источник
22

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

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

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

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

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

t31os
источник
ПРИМЕЧАНИЕ: я думаю, что вам нужно будет установить этот отрицательный ключ в виде строки, т.е. '-5'и нет -5, иначе ключ считается недействительным (я думаю) .. (хотя отрицательные строки работают, если я не ошибаюсь) ..
t31os
Спасибо, отстой, что вы не можете сделать это с реальными функциями, но это намного лучше, чем необходимость добавлять комбо ловушку / перенаправление только для того, чтобы иметь ссылку.
Эль Йобо
2
Этот конкретный ответ помог мне с моим плагином Пункты меню «Состояние сообщения» (вы можете догадаться, что он делает). В любом случае, поскольку я не знал, какие другие плагины будут добавлять какие- array_push()либо элементы в какие меню, я подумал, что просто добавлю, что я использовал для добавления пунктов меню, чтобы избежать столкновения с любыми другими плагинами.
mrwweb
Работает как шарм, плюс бонусное очко за использование такого маленького фрагмента.
Жуан
2
+1. Вместо того, чтобы выбирать ключ и надеяться, просто возьмите последний ключ и приращение. Например, при добавлении пункта подменю в меню «Инструменты» global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] = и т. Д.
webaware
3

Я достиг того же с этим:

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

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

Bobz
источник