Bagaimana saya bisa mengontrol posisi di menu admin item yang ditambahkan oleh plugin?

8

Setelah membaca di tempat lain tentang tumpukan dua plugin WP yang memaksa posisi menu yang sama (dengan kemungkinan satu maka tidak muncul), saya bertanya-tanya bagaimana saya bisa mengontrol posisi item menu yang ditambahkan oleh plugin.

Saya sudah menggunakan fungsi yang tampaknya menangani item submenu seperti itu di 'pengaturan', dan fungsi lain untuk menyusun ulang item default (posting, halaman, tema, plugin, pengaturan, dan sebagainya) item 'tingkat atas' - tetapi yang tidak mengubah posisi dari barang-barang tersebut ditambahkan oleh plugin.

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

Sebagai contoh, dari dua item menu tingkat atas yang ditambahkan oleh WooCommerce, satu muncul di atas item yang ditambahkan oleh ContactForm7 dan yang lainnya di bawah ini, dan akan menyenangkan untuk menyusun ulang item tersebut - dan juga, untuk dapat menyusun ulang item dengan lebih baik yang tidak memaksa posisi menu dan malah muncul di bagian bawah.

Saya menemukan ini biasanya berfungsi dengan baik untuk memesan kembali default dan item 'edit.php? Post_type = ...', tetapi item-item dengan 'admin.php? Halaman = ...' tidak memesan ulang.

Ketika fungsi pemesanan ulang saya dinonaktifkan, dua item WooCommerce ('edit.php? Post_type = product', dan 'edit.php? Post_type = shop_order') dikelompokkan bersama sebagaimana dimaksud, tetapi ketika fungsi diaktifkan kembali mereka terpecah oleh ContactForm7 ('admin.php? halaman = wpcf7').

Dan, satu ('edit.php? Post_type = shop_order') dari CPT WooCommerce tidak akan dipesan ulang - meskipun yang lain ('edit.php? Post_type = produk') tidak.

glvr
sumber

Jawaban:

8

Untuk mengubah urutan item menu admin tingkat atas, Anda perlu dua hooks, dua filters, dan satu function. Masukkan kode berikut ke dalam tema Anda saat ini 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 );

Array yang dikembalikan dari item menu admin tingkat atas, di atas, mewakili item menu yang dimasukkan oleh inti, dalam urutan defaultnya. Untuk memasukkan item menu yang ditambahkan oleh plugin, kita harus menambahkannya ke array ini. Katakanlah kita memiliki dua plugin yang ditambahkan dan diaktifkan (misalnya: Wordfencedan NextCellent Gallery). Kita harus menemukan nama item menu ini, pertama. Ketika kami mengklik pada Wordfenceitem menu tingkat atas, URL yang dihasilkan akan berakhir dengan ?page=Wordfence. Bagian selanjutnya ?page=adalah nama kami ( Wordfence). Sebab NextCellent Gallery, namanya akan nextcellent-gallery-nextgen-legacy. Sekarang, mari tambahkan item ini ke array kami:

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

Kita dapat, sekarang, memindahkan item dari array ini, ke atas dan ke bawah, untuk mendapatkan urutan terakhir.

Catatan : Anda dapat menggunakan plugin Editor Menu Admin , untuk tindakan seret dan lepas yang mudah.

Frank P. Walentynowicz
sumber
1
@ Frank P. Walentynowicz ... terima kasih atas jawaban komprehensifnya. Saya memperbarui posting asli saya untuk memperjelas, dan saran Anda untuk menggunakan 'bagian setelah? Halaman =' sangat membantu dan menyelesaikan masalah saya - kecuali untuk salah satu dari dua item WooCommerce.
glvr
Tambahan cepat untuk komentar saya di atas: Saya sebelumnya menggunakan Editor Menu Admin, tetapi lebih suka fungsi hardcoded.
glvr
11

Jawaban yang ada baik-baik saja, tetapi jika Anda ingin menambahkan jenis posting kustom baru, Anda harus mengedit kembali fungsi-fungsi itu lagi dan lagi.

Untuk memperbaikinya, saya mengembangkan fungsi kecil ini. Cukup tentukan fungsi $new_positionsdi dalam Anda 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
sumber
1
Ini luar biasa - jadi ketika item baru akan ditambahkan sebagai item menu seperti jenis posting kustom (seperti yang Anda sarankan) atau plugin baru atau bahkan opsi built-in baru di masa depan itu akan ditambahkan dengan baik seperti biasa ?
Brett
@ Brett Sepertinya akan bekerja seperti itu.
Davey
6

ketika Anda membuat jenis posting dengan register_post_type () Anda dapat mengatur posisi menu:

menu_position (integer) (opsional) Posisi dalam urutan menu jenis posting akan muncul. show_in_menu harus benar.

    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

Jika item memiliki posisi menu yang sama, mereka diurutkan berdasarkan abjad.

di plugin Anda sendiri, Anda dapat mengatur level. jika Anda mencoba mengubah posisi menu dari plugin yang belum Anda buat, banyak dari mereka mungkin memiliki pluguggable, atau Anda dapat mengedit panggilan mereka.

rudtek
sumber
@ rudtek ... terima kasih. Dalam CPT saya sendiri, saya telah menghindari pengaturan posisi menu, lebih suka menggunakan perintah ulang menu dan dengan demikian 'memiliki semuanya di tempat yang sama' dan lebih mudah untuk selanjutnya mengubah. Tidak memiliki plugin sendiri yang saya coba atur posisi menu, itu untuk plugin pihak ketiga - yang mana saya tidak cukup tahu tentang 'pluggable' atau untuk mengedit panggilan mereka (yang mungkin akan ditimpa saat pembaruan).
glvr