Wie kann ich die Position von Elementen, die von Plugins hinzugefügt wurden, im Admin-Menü steuern?

8

Nachdem ich an anderer Stelle im Stapel von zwei WP-Plugins gelesen habe, die identische Menüpositionen erzwingen (mit der Wahrscheinlichkeit, dass eines dann nicht angezeigt wird), frage ich mich, wie ich die Position von Menüelementen steuern kann, die von Plugins hinzugefügt werden.

Ich verwende bereits eine Funktion, die solche Untermenüelemente in 'Einstellungen' zu behandeln scheint, und eine andere Funktion, um Standardeinstellungen (Beiträge, Seiten, Themen, Plugins, Einstellungen usw.) 'Elemente der obersten Ebene' neu anzuordnen - die Positionierung ändert sich jedoch nicht von solchen Elementen durch Plugins hinzugefügt.

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

Als Beispiel für die beiden von WooCommerce hinzugefügten Menüelemente der obersten Ebene wird eines über dem von ContactForm7 hinzugefügten Element und das andere unten angezeigt, und es wäre schön, sie entsprechend neu anzuordnen - und auch Elemente besser neu anordnen zu können die keine Menüposition erzwingen und stattdessen unten erscheinen.

Ich finde, dass es normalerweise gut funktioniert, wenn Standard- und 'edit.php? Post_type = ...' Elemente neu bestellt werden, aber diejenigen mit 'admin.php? Page = ...' werden nicht neu bestellt.

Wenn meine Nachbestellungsfunktion deaktiviert ist, werden die beiden WooCommerce-Elemente ('edit.php? Post_type = product' und 'edit.php? Post_type = shop_order') wie beabsichtigt gruppiert, aber wenn die Funktion reaktiviert wird, werden sie aufgeteilt von ContactForm7 ('admin.php? page = wpcf7').

Und einer ('edit.php? Post_type = shop_order') der WooCommerce-CPTs wird nicht neu angeordnet - der andere ('edit.php? Post_type = product') jedoch.

glvr
quelle

Antworten:

8

Um die Reihenfolge der Admin-Menüelemente der obersten Ebene zu ändern, benötigen Sie zwei hooks, zwei filtersund eins function. Fügen Sie den folgenden Code in Ihr aktuelles Thema ein 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 );

Das oben zurückgegebene Array von Admin-Menüelementen der obersten Ebene repräsentiert Menüelemente, die vom Kern in ihrer Standardreihenfolge eingefügt wurden. Um Menüelemente einzuschließen, die von Plugins hinzugefügt wurden, müssen wir sie diesem Array hinzufügen. Angenommen, wir haben zwei Plugins hinzugefügt und aktiviert (zum Beispiel: Wordfenceund NextCellent Gallery). Wir müssen zuerst die Namen dieser Menüpunkte finden. Wenn wir auf Wordfenceden Menüpunkt der obersten Ebene klicken , endet die resultierende URL mit ?page=Wordfence. Der Teil danach ?page=ist unser Name ( Wordfence). Denn NextCellent Galleryder Name wird sein nextcellent-gallery-nextgen-legacy. Fügen wir nun folgende Elemente zu unserem Array hinzu:

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

Wir können jetzt Elemente dieses Arrays nach oben und unten verschieben, um die endgültige Reihenfolge zu erhalten.

Hinweis : Sie können das Admin-Menü-Editor- Plugin auch für einfache Drag & Drop-Aktionen verwenden.

Frank P. Walentynowicz
quelle
1
@ Frank P. Walentynowicz ... danke für die umfassende Antwort. Ich habe meinen ursprünglichen Beitrag aktualisiert, um dies zu verdeutlichen. Ihr Vorschlag, "das Teil nach? Page =" zu verwenden, ist sehr hilfreich und löst mein Problem - mit Ausnahme eines der beiden WooCommerce-Elemente.
Glvr
Schnelle Ergänzung zu meinem obigen Kommentar: Ich hatte zuvor den Admin-Menü-Editor verwendet, bevorzuge jedoch eine fest codierte Funktion.
Glvr
11

Die vorhandenen Antworten sind in Ordnung, aber wenn Sie einen neuen benutzerdefinierten Beitragstyp hinzufügen würden, müssten Sie diese Funktionen immer wieder neu bearbeiten.

Um dies zu beheben, habe ich diese kleine Funktion entwickelt. Definieren Sie einfach Ihr $new_positionsInneres in der my_new_menu_orderFunktion:

/**
 * 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
quelle
1
Das ist großartig - wenn also neue Elemente als Menüelement hinzugefügt werden sollen, z. B. ein benutzerdefinierter Beitragstyp (wie von Ihnen vorgeschlagen) oder ein neues Plugin oder sogar eine neue integrierte Option in der Zukunft, werden sie wie gewohnt hinzugefügt ?
Brett
@Brett Es sieht so aus, als würde es so funktionieren.
Davey
6

Wenn Sie einen Beitragstyp mit register_post_type () erstellen, können Sie die Menüposition festlegen:

menu_position (integer) (optional) Die Position in der Menüreihenfolge, in der der Beitragstyp angezeigt werden soll. show_in_menu muss wahr sein.

    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

Wenn Elemente dieselbe Menüposition haben, werden sie alphabetisch sortiert.

In deinem eigenen Plugin kannst du den Level einstellen. Wenn Sie versuchen, die Menüposition eines Plugins zu ändern, das Sie nicht erstellt haben, ist es für viele Plugins möglicherweise steckbar, oder Sie können ihre Aufrufe bearbeiten.

rudtek
quelle
@ Rudtek ... danke. In meinen eigenen CPTs habe ich es vermieden, Menüpositionen festzulegen. Stattdessen habe ich es vorgezogen, eine Menü-Neuordnung zu verwenden und somit „alles am selben Ort zu haben“ und später leichter zu ändern. Da ich keine eigenen Plugins habe, für die ich die Menüposition festlegen möchte, handelt es sich um Plugins von Drittanbietern, für die ich nicht genug über "Pluggable" weiß oder deren Aufrufe bearbeiten kann (die beim Update vermutlich überschrieben würden).
Glvr