Как я могу контролировать положение в админке пунктов, добавляемых плагинами?

8

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

Я уже использую функцию, которая, кажется, обрабатывает такие элементы подменю в «настройках», и другую функцию, чтобы переупорядочить элементы «верхнего уровня» по умолчанию (сообщения, страницы, темы, плагины, настройки и т. Д.), Но не меняет расположение таких предметов добавляются плагинами.

function custom_menu_order() {
return array(
//Add items here in desired order.

);
}

add_filter( 'custom_menu_order', '__return_true' );
add_filter( 'menu_order', 'custom_menu_order' );

В качестве примера, из двух пунктов меню верхнего уровня, добавленных WooCommerce, один появляется над элементом, добавленным ContactForm7, а другой - ниже, и было бы неплохо изменить их порядок соответствующим образом - а также, чтобы иметь возможность лучше изменить порядок элементов которые не заставляют позицию меню и вместо этого появляются внизу.

Я нахожу, что это нормально работает для переупорядочения элементов по умолчанию и 'edit.php? Post_type = ...', но те, которые имеют 'admin.php? Page = ...', не переупорядочивают.

Когда моя функция повторного заказа отключена, два элемента WooCommerce ('edit.php? Post_type = product' и 'edit.php? Post_type = shop_order') объединяются вместе, как и предполагалось, но когда функция активируется, они разделяются by ContactForm7 ('admin.php? page = wpcf7').

И одна ('edit.php? Post_type = shop_order') из CPT WooCommerce не будет переупорядочена, хотя другая ('edit.php? Post_type = product') делает это не так.

glvr
источник

Ответы:

9

Для изменения порядка пунктов меню администратора верхнего уровня вам понадобятся два hooks, два filtersи один function. Поместите следующий код в вашу текущую тему functions.php:

function wpse_custom_menu_order( $menu_ord ) {
    if ( !$menu_ord ) return true;

    return array(
        'index.php', // Dashboard
        'separator1', // First separator
        'edit.php', // Posts
        'upload.php', // Media
        'link-manager.php', // Links
        'edit-comments.php', // Comments
        'edit.php?post_type=page', // Pages
        'separator2', // Second separator
        'themes.php', // Appearance
        'plugins.php', // Plugins
        'users.php', // Users
        'tools.php', // Tools
        'options-general.php', // Settings
        'separator-last', // Last separator
    );
}
add_filter( 'custom_menu_order', 'wpse_custom_menu_order', 10, 1 );
add_filter( 'menu_order', 'wpse_custom_menu_order', 10, 1 );

Возвращенный массив пунктов меню администратора верхнего уровня, представленных выше, представляет пункты меню, вставленные ядром, в их порядке по умолчанию. Чтобы включить пункты меню, добавленные плагинами, мы должны добавить их в этот массив. Допустим, у нас есть два плагина, добавленные и активированные (например: Wordfenceи NextCellent Gallery). Сначала мы должны найти названия этих пунктов меню. Когда мы нажимаем на Wordfenceэлемент меню верхнего уровня, результирующий URL-адрес заканчивается на ?page=Wordfence. Часть после ?page=нашего имени ( Wordfence). Ибо NextCellent Galleryимя будет nextcellent-gallery-nextgen-legacy. Теперь давайте добавим эти элементы в наш массив:

return array(
    'index.php', // Dashboard
    'separator1', // First separator
    'edit.php', // Posts
    'upload.php', // Media
    'link-manager.php', // Links
    'edit-comments.php', // Comments
    'edit.php?post_type=page', // Pages
    'separator2', // Second separator
    'themes.php', // Appearance
    'plugins.php', // Plugins
    'users.php', // Users
    'tools.php', // Tools
    'separator3', // Third separator
    'options-general.php', // Settings
    'separator-last', // Last separator
    'Wordfence', // Wordfence
    'nextcellent-gallery-nextgen-legacy', // NextCellent Gallery
);

Теперь мы можем перемещать элементы этого массива вверх и вниз, чтобы получить окончательный порядок.

Примечание : вы можете использовать плагин Admin Menu Editor , а также для простого перетаскивания мышью.

Фрэнк П. Валентинович
источник
1
@ Фрэнк П. Валентинович ... спасибо за исчерпывающий ответ. Я обновил свой исходный пост, чтобы уточнить, и ваше предложение использовать «часть после? Page =» очень полезно и решает мою проблему - за исключением одного из двух пунктов WooCommerce.
17
Быстрое добавление к моему комментарию выше: я раньше использовал редактор меню администратора, но предпочел жестко закодированную функцию.
17
11

Существующие ответы хороши, но если вы добавите новый пользовательский тип записи, вам придется снова и снова редактировать эти функции.

Чтобы исправить это, я разработал эту маленькую функцию. Просто определите ваш $new_positionsвнутри my_new_menu_orderфункции:

/**
 * Activates the 'menu_order' filter and then hooks into 'menu_order'
 */
add_filter('custom_menu_order', function() { return true; });
add_filter('menu_order', 'my_new_admin_menu_order');
/**
 * Filters WordPress' default menu order
 */
function my_new_admin_menu_order( $menu_order ) {
  // define your new desired menu positions here
  // for example, move 'upload.php' to position #9 and built-in pages to position #1
  $new_positions = array(
    'upload.php' => 9,
    'edit.php?post_type=page' => 1
  );
  // helper function to move an element inside an array
  function move_element(&$array, $a, $b) {
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
  }
  // traverse through the new positions and move 
  // the items if found in the original menu_positions
  foreach( $new_positions as $value => $new_index ) {
    if( $current_index = array_search( $value, $menu_order ) ) {
      move_element($menu_order, $current_index, $new_index);
    }
  }
  return $menu_order;
};
rassoh
источник
1
Это потрясающе - поэтому, когда новые элементы должны быть добавлены в качестве элемента меню, например, пользовательский тип записи (как вы предложили) или новый плагин или даже новый встроенный параметр в будущем, он будет добавлен просто нормально, как обычно ?
Бретт
@ Бретт Похоже, это будет работать так.
Дэйви,
6

когда вы создаете тип записи с помощью register_post_type (), вы можете установить позицию меню:

menu_position (integer) (необязательно) Позиция в порядке меню, в котором должен отображаться тип сообщения. show_in_menu должно быть правдой.

    Default: null - defaults to below Comments 

    5 - below Posts
    10 - below Media
    15 - below Links
    20 - below Pages
    25 - below comments
    60 - below first separator
    65 - below Plugins
    70 - below Users
    75 - below Tools
    80 - below Settings
    100 - below second separator

Если элементы имеют одинаковую позицию меню, они сортируются в алфавитном порядке.

в вашем собственном плагине вы можете установить уровень. Если вы пытаетесь изменить позицию меню плагина, который вы не создали, у многих из них он может быть подключаемым, или вы можете редактировать их вызовы.

rudtek
источник
@ rudtek ... спасибо. В моих собственных CPT я избегал установки позиций меню, предпочитая вместо этого использовать переупорядочение меню и, таким образом, «иметь все это в одном месте», и впоследствии его легче изменить. У меня нет собственных плагинов, для которых я пытаюсь установить позицию меню, это для сторонних плагинов - для которых я недостаточно знаю о «подключаемых» или редактировать их вызовы (которые, вероятно, будут перезаписаны при обновлении).
17