Cum pot controla poziția în meniul de administrare a elementelor adăugate de plugin-uri?

8 aug. 2017, 21:12:43
Vizualizări: 49.9K
Voturi: 16

După ce am citit în altă parte pe Stack despre două plugin-uri WP care forțează poziții identice în meniu (cu probabilitatea ca unul să nu mai apară), mă întreb cum pot controla poziția elementelor de meniu adăugate de plugin-uri.

Folosesc deja o funcție care pare să gestioneze astfel de submeniuri în 'settings' și o altă funcție pentru reordonarea elementelor implicite de nivel superior (articole, pagini, teme, plugin-uri, setări etc.) - dar care nu modifică poziționarea elementelor adăugate de plugin-uri.

function custom_menu_order() {
return array(
//Adaugă elementele aici în ordinea dorită.

);
}

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

Ca exemplu, dintre cele două elemente de meniu de nivel superior adăugate de WooCommerce, unul apare deasupra elementului adăugat de ContactForm7 și celălalt dedesubt, și ar fi frumos să le putem reordona corespunzător - și, de asemenea, să putem reordona mai bine elementele care nu forțează o poziție în meniu și apar în schimb la sfârșit.

Am observat că funcționează de obicei bine pentru reordonarea elementelor implicite și a celor de tip 'edit.php?post_type=...', dar cele cu 'admin.php?page=...' nu se reordonează.

Când funcția mea de reordonare este dezactivată, cele două elemente WooCommerce ('edit.php?post_type=product' și 'edit.php?post_type=shop_order') se grupează împreună după cum este intenționat, dar când funcția este reactivată, acestea sunt separate de ContactForm7 ('admin.php?page=wpcf7').

Și unul dintre CPT-urile WooCommerce ('edit.php?post_type=shop_order') nu se va reordona - deși celălalt ('edit.php?post_type=product') o face.

0
Toate răspunsurile la întrebare 4
3
23

Răspunsurile existente sunt bune, dar dacă ai adăuga un nou tip de postare personalizată, ar trebui să editezi din nou acele funcții iar și iar.

Pentru a rezolva această problemă, am dezvoltat această mică funcție. Doar definește-ți $new_positions în interiorul funcției my_new_menu_order:

/**
 * Activează filtrul 'menu_order' și apoi se conectează la 'menu_order'
 */
add_filter('custom_menu_order', function() { return true; });
add_filter('menu_order', 'my_new_admin_menu_order');
/**
 * Filtrează ordinea implicită a meniului din WordPress
 */
function my_new_admin_menu_order( $menu_order ) {
  // definește aici noile poziții dorite pentru meniu
  // de exemplu, mută 'upload.php' la poziția #9 și paginile integrate la poziția #1
  $new_positions = array(
    'upload.php' => 9,
    'edit.php?post_type=page' => 1
  );
  // funcție helper pentru a muta un element în interiorul unui array
  function move_element(&$array, $a, $b) {
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
  }
  // parcurge noile poziții și mută
  // elementele dacă sunt găsite în menu_order original
  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;
};
1 oct. 2018 15:47:53
Comentarii

Este minunat - deci atunci când vor fi adăugate elemente noi ca element de meniu, cum ar fi un tip de postare personalizat (așa cum ai sugerat) sau un nou plugin sau chiar o nouă opțiune integrată în viitor, acestea vor fi adăugate fără probleme, ca de obicei?

Brett Brett
2 ian. 2019 23:19:25

@Brett Se pare că va funcționa așa.

Davey Davey
17 iul. 2019 17:32:35

Încă funcționează perfect - mulțumesc

Hannah Smith Hannah Smith
21 dec. 2021 17:29:54
4
17

când creezi un tip de postare cu register_post_type() poți seta poziția în meniu:

menu_position (integer) (opțional) Poziția în ordinea meniului unde ar trebui să apară tipul de postare. show_in_menu trebuie să fie true.

    Implicit: null - implicit este sub Comentarii

    5  - sub Articole
    10 - sub Media
    15 - sub Legături
    20 - sub Pagini
    25 - sub Comentarii
    59 - sub primul separator
    60 - sub Aspect
    65 - sub Plugin-uri
    70 - sub Utilizatori
    75 - sub Unelte
    80 - sub Setări
    99 - sub al doilea separator

Dacă elementele au aceeași poziție în meniu, acestea sunt sortate alfabetic.

În propriul tău plugin poți seta nivelul. Dacă încerci să schimbi poziția în meniu a unui plugin pe care nu l-ai creat, multe dintre ele pot avea această opțiune configurabilă, sau poți să editezi apelurile lor.

9 aug. 2017 01:31:51
Comentarii

@ rudtek... mulțumesc. În propriile mele CPT-uri am evitat să setez pozițiile din meniu, preferând în schimb să folosesc o reordonare a meniului și astfel să „am totul în același loc” și să fie mai ușor de modificat ulterior. Neavând propriile plugin-uri pentru care încerc să setez poziția în meniu, este pentru plugin-uri de la terți - despre care nu știu suficient despre 'pluggable' sau pentru a le edita apelurile (care probabil ar fi suprascrise la actualizare).

glvr glvr
9 aug. 2017 12:48:16

Super, funcționează perfect

Jodyshop Jodyshop
25 oct. 2021 22:58:06

Poți folosi și numere zecimale: 25.3

Azamat Azamat
22 aug. 2022 09:39:30

Sursa fișierului de bază WordPress pentru a susține acest răspuns (și posibil a-l actualiza dacă se schimbă în timp): /wp-admin/menu.php

Talk Nerdy To Me Talk Nerdy To Me
28 iul. 2023 18:57:02
3
16

Pentru a schimba ordinea elementelor din meniul principal de administrare, veți avea nevoie de două hooks, două filters și o function. Introduceți următorul cod în fișierul functions.php al temei curente:

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

    return array(
        'index.php', // Panou de control
        'separator1', // Primul separator
        'edit.php', // Articole
        'upload.php', // Media
        'link-manager.php', // Legături
        'edit-comments.php', // Comentarii
        'edit.php?post_type=page', // Pagini
        'separator2', // Al doilea separator
        'themes.php', // Aspect
        'plugins.php', // Plugin-uri
        'users.php', // Utilizatori
        'tools.php', // Unelte
        'options-general.php', // Setări
        'separator-last', // Ultimul separator
    );
}
add_filter( 'custom_menu_order', 'wpse_custom_menu_order', 10, 1 );
add_filter( 'menu_order', 'wpse_custom_menu_order', 10, 1 );

Matricea returnată de elementele din meniul principal de administrare, de mai sus, reprezintă elementele de meniu adăugate de nucleu, în ordinea lor implicită. Pentru a include elementele de meniu adăugate de plugin-uri, trebuie să le adăugăm în această matrice. Să presupunem că avem două plugin-uri adăugate și activate (de exemplu: Wordfence și NextCellent Gallery). Mai întâi, trebuie să găsim numele acestor elemente de meniu. Când facem clic pe elementul de meniu principal al Wordfence, URL-ul rezultat va termina cu ?page=Wordfence. Partea după ?page= este numele nostru (Wordfence). Pentru NextCellent Gallery, numele va fi nextcellent-gallery-nextgen-legacy. Acum, să adăugăm aceste elemente în matricea noastră:

return array(
    'index.php', // Panou de control
    'separator1', // Primul separator
    'edit.php', // Articole
    'upload.php', // Media
    'link-manager.php', // Legături
    'edit-comments.php', // Comentarii
    'edit.php?post_type=page', // Pagini
    'separator2', // Al doilea separator
    'themes.php', // Aspect
    'plugins.php', // Plugin-uri
    'users.php', // Utilizatori
    'tools.php', // Unelte
    'separator3', // Al treilea separator
    'options-general.php', // Setări
    'separator-last', // Ultimul separator
    'Wordfence', // Wordfence
    'nextcellent-gallery-nextgen-legacy', // NextCellent Gallery
);

Acum putem muta elementele din această matrice în sus sau în jos pentru a obține ordinea finală dorită.

Notă: puteți utiliza și plugin-ul Admin Menu Editor, pentru acțiuni de tip drag and drop mai ușoare.

9 aug. 2017 01:40:36
Comentarii

@ Frank P. Walentynowicz ...mulțumesc pentru răspunsul detaliat. Am actualizat postarea originală pentru a clarifica, iar sugestia ta de a folosi 'partea de după ?page=' este foarte utilă și rezolvă problema mea - exceptând unul dintre cele două elemente WooCommerce.

glvr glvr
9 aug. 2017 12:44:18

O completare rapidă la comentariul meu de mai sus: am folosit anterior Admin Menu Editor, dar prefer o funcție hardcodată.

glvr glvr
9 aug. 2017 12:51:16

Care este semnificația lui 10,1? Ca în add_filter( 'menu_order', 'wpse_custom_menu_order', 10, 1 ); Nu găsesc nicio informație despre asta. Probabil ceva simplu. Dar, nu reușesc să mut WooCommerce și mă întreb dacă are legătură cu asta.

WebDude0482 WebDude0482
3 dec. 2020 20:16:54
0

Mulțumiri lui rassoh pentru o soluție elegantă.

Iată o versiune revizuită care conține o listă de pagini care ar trebui să rămână întotdeauna în partea de sus...

/**
 * Acești 2 filtre și 1 funcție mută paginile built-in din WordPress admin
 * în partea de sus, astfel încât să nu fie deplasate în jos la fiecare instalare de plugin.
 * Activează filtrul 'menu_order' și apoi se conectează la 'menu_order'
 */
add_filter('custom_menu_order', function() { return true; });
add_filter('menu_order', 'my_new_admin_menu_order');
/**
 * Filtrează ordinea implicită a meniului WordPress
 */
function my_new_admin_menu_order( $menu_order ) {
  // definește noile poziții dorite pentru meniu aici
  // de exemplu, mută 'upload.php' pe poziția #9 și paginile built-in pe poziția #1
  $new_positions = array(
    'index.php' => 1,  // Panou de bord
    'edit.php' => 2,  // Articole
    'upload.php' => 3,  // Media
    'edit.php?post_type=page' => 4,  // Pagini
    'edit-comments.php' => 5  // Comentarii
  );
  // funcție helper pentru a muta un element în interiorul unui array
  function move_element(&$array, $a, $b) {
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
  }
  // parcurge noile poziții și mută 
  // elementele dacă sunt găsite în menu_order original
  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;
};
30 iul. 2020 02:43:37