Размещение меню пользовательского типа сообщения над меню сообщений Использование menu_position?

17

Я только что выяснил параметр menu_position, кажется, что вы можете разместить меню своего пользовательского типа поста почти везде. За исключением выше меню сообщений!

Как я могу это сделать?

janoChen
источник
Хороший вопрос, кажется, это единственное место, куда он не пойдет.
jnthnclrk

Ответы:

14

Позиции для основных пунктов меню

  • 2 Панель инструментов
  • 4 разделитель
  • 5 сообщений
  • 10 СМИ
  • 15 ссылок
  • 20 страниц
  • 25 комментариев
  • 59 Сепаратор
  • 60 Внешний вид
  • 65 плагинов
  • 70 пользователей
  • 75 инструментов
  • 80 настроек
  • 99 Сепаратор

Описание параметра для «позиции меню»

$position( целое число ) ( необязательно ). Положение в меню должно отображаться в этом меню. По умолчанию, если этот параметр не указан, меню будет отображаться в нижней части структуры меню. Чем выше число, тем ниже его позиция в меню.

ПРЕДУПРЕЖДЕНИЕ: если два элемента меню используют один и тот же атрибут позиции, один из элементов может быть перезаписан, так что отображается только один элемент! Риск конфликта можно уменьшить, используя десятичные вместо целочисленных значений, например, 63,3 вместо 63.

По умолчанию: нижняя часть структуры меню

Майкл Эклунд
источник
4

Новый плагин JetPack размещает свою ссылку меню прямо под ссылкой на панель инструментов. Это делается путем установки порядка меню в 0, путем фильтрации массива $ menu_order :

function jetpack_menu_order( $menu_order ) {
        $jp_menu_order = array();

        foreach ( $menu_order as $index => $item ) {
            if ( $item != 'jetpack' )
                $jp_menu_order[] = $item;

            if ( $index == 0 )
                $jp_menu_order[] = 'jetpack';
        }

        return $jp_menu_order;
    }

Из любопытства, что произойдет, если вы попробуете 0 в качестве menu_position?

Чип Беннетт
источник
2

Я использовал 'menu_postion' => 0, 1,2,3,4.

На самом деле не имеет значения. Если вы поэкспериментируете с этим, вы можете легко понять это.

Использование 'menu_position' => 1 должно разместить его под элементом меню Dashboard над разделителем. 0 Следует разместить его над приборной панелью

jaredwilli
источник
2

Ищите решение в сети, но не нашли. Просто делает этот трюк (например). Здесь у вас есть родной список позиций:

  • 2 Панель инструментов
  • 4 разделитель
  • 5 сообщений
  • 10 СМИ
  • 15 ссылок
  • 20 страниц
  • 25 комментариев
  • 59 Сепаратор
  • 60 Внешний вид
  • 65 плагинов
  • 70 пользователей
  • 75 инструментов
  • 80 настроек
  • 99 Сепаратор

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

global $menu; 
print_r($menu); 

Так что, если я хорошо понимаю, ничто не может помешать нам изменить порядок меню так, как мы хотим:

function re_order_menu () {
    // ------- Put away items 
    $dashboard = $menu[2]
    $separator1 = $menu[4]
    $posts = $menu[5]
    $media = $menu[10]
    $links = $menu[15]
    $pages = $menu[20]
    $comments = $menu[25]
    $separator2 = $menu[59]
    $appearance = $menu[60]
    $plugins = $menu[65]
    $users = $menu[70]
    $tools = $menu[75]
    $settings = $menu[80]
    $separator3 = $menu[99]

    // -------- Reset menu  
    unset($menu[2]);
    unset($menu[4]);
    unset($menu[5]);
    unset($menu[10]);
    unset($menu[15]);
    unset($menu[20]);
    unset($menu[25]);
    unset($menu[59]);
    unset($menu[60]);
    unset($menu[65]);
    unset($menu[70]);
    unset($menu[75]);
    unset($menu[80]);
    unset($menu[99]);

    // -------- Re-order menu as you want
    $dashboard = $menu[2];
    $separator1 = $menu[4]
    $posts = $menu[5];
    $books = $menu[6];
    /* my tons of custom items */
    $authors  = $menu[7];
    $requests = $menu[8];
    $clients = $menu[9];
    $sellers  = $menu[10];
    $services = $menu[11];
    $schedules = $menu[12];
    /* let some space after */ 
    $media = $menu[30];
    $links = $menu[31];
    $pages = $menu[32];
    $comments = $menu[33];
    $separator2 = $menu[59];
    $appearance = $menu[60];
    $plugins = $menu[65];
    $users = $menu[70];
    $tools = $menu[75];
    $settings = $menu[80]
    $separator3 = $menu[99];

} 
add_action('admin_menu', 're_order_menu');

У меня это нормально работает, так что, думаю, это законно, я не прав?

Нолан Крочо
источник
Очень хрупкое решение, которое опирается на магические числа . Он сломается, как только будет добавлен / удален какой-то другой плагин, который помещает элемент среди других.
Уолф
1

Вы можете использовать это:

function my_move_post () {
    global $menu;
    $menu[6] = $menu[5]; //move post from post 5 to 6
    unset($menu[5]); //free the position 5 so you can use it!
}
add_action('admin_menu', 'my_move_post');

Теперь вы можете использовать положение 5, чтобы добавить ваше меню над меню Post.

eduardogoncalves
источник
Это не сработало для меня. Я поместил его в свой плагин sitewide, где мой файл custom-post-type.php
Даниэль
1

вот предостережение ко всему вопросу ...

WordPress 4.9.2

сор-админ / menu.php:

// If we're to use $_wp_last_object_menu, increment it first.
$ptype_menu_position = is_int( $ptype_obj->menu_position ) ? $ptype_obj->menu_position : ++$_wp_last_object_menu; 

ВНИМАНИЕ: должно быть целым числом, а НЕ уже установлено, в противном случае оно попадает в конец списка.

Artistan
источник
1

Для рабочего решения в WordPress 5 и ниже переместите его с помощью следующего кода:

add_filter('custom_menu_order', '__return_true');
add_filter('menu_order', function($menu_order) {
    if (
        false !== ($k1 = array_search($v1 = 'edit.php', $menu_order))
        && false !== ($k2 = array_search($v2 = 'edit.php?post_type=foo', $menu_order))
    ) {
        array_splice($menu_order, $k1, 0, $v2);
        array_splice($menu_order, $k2 + 1, 1);
    }
    return $menu_order;
});

Это предполагает, что у вас не более одного пункта меню, претендующего на позицию полюса.

WALF
источник
0

На той же ссылке, на которую вы ссылаетесь, написано:

menu_position
(integer) (optional) The position in the menu order the post type should appear.
Default: null - defaults to below Comments
5 - below Posts
10 - below Media
20 - below Pages
60 - below first separator
100 - below second separator

Так что, если вы установите menu_positionчто-то подобное 4, то оно должно быть выше сообщения.

Позиция -1ставит его выше Dashboardссылки.

Zack
источник
Я пробовал 4, но это точно так же, как 5.
janoChen
Хмм. Пробовал 1-3? Я думаю, что, возможно, «1» (или «0») является приборной панелью. Возможно, что-то 2-3 будет работать
Зак
0 1 2 3 Идет до панели инструментов и 4 идет ниже сообщений. Это действительно невозможно!
января
Вау. много сломал WordPress? Я не знаю тогда. : - /
Зак
Я думаю, что 4 - это разделитель прямо над сообщениями, а 5 - это сообщения, поэтому, если вы установите в меню позицию 3, это будет прямо перед разделителем. С настройками по умолчанию, конечно. Установка моей страницы плагина на 4 перезаписала разделитель, но появилась над сообщениями. хммм ...
золотые яблоки
0

Вы можете использовать десятичные значения (как строки). Например, у меня есть несколько пользовательских типов записей, которые я поместил в последнюю позицию в меню (100001, 100002, 100003).

Затем просто поместите этот код, чтобы переместить их над сообщениями и под пунктами меню панели инструментов .

function reorder_admin_menu() {

  global $menu;

  // Add one separator

  $menu["3.1"] = array(
    0 =>  '',
    1 =>  'read',
    2 =>  'separator_' . "anything_unique",
    3 =>  '',
    4 =>  'wp-menu-separator'
    );

  // I have put my menu items waay at the end (exactly these values), so move them up

  $menu["3.2"] = $menu[100001];
  $menu["3.3"] = $menu[100002];
  $menu["3.4"] = $menu[100003];

  unset($menu[100001]);
  unset($menu[100002]);
  unset($menu[100003]);

  // move Media menu (position 10) item to front, in the same group
  $menu["3.5"] = $menu[10];
  unset($menu[10]);

  // Debug: ksort($menu); error_log( var_export( $menu, true ) );
}

add_action( 'admin_menu', 'reorder_admin_menu', 999 );
Vladan
источник