tom
  • 0
Учитель

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

  • 0

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

Share
  1. Привет @Том,

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

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

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

    Используйте «слаг меню», чтобы вы могли проверить его в хуке

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

    Хотя для четвертого параметра мы могли бы выбрать буквально что угодно, учитывая, что мы собираемся перенаправлять I на ту же страницу ( 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.case after_setup_theme redirect_from_admin_menu() goto

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

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

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

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

      • 0
    • Этот конкретный ответ помог мне с пунктами меню статуса сообщений моего плагина (вы, наверное, догадались, что он делает). В любом случае, поскольку я не знал, какие другие плагины будут добавлять что-то в какие меню, я подумал, что просто добавлю, что я использовал array_push() для добавления пунктов меню, чтобы избежать конфликтов с любыми другими плагинами.

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

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

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

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

    • 0

Оставить ответ

You must login to add an answer.