it-swarm.com.de

Wie kann ich die Position der von Plugins hinzugefügten Elemente im Admin-Menü steuern?

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

Ich benutze bereits eine Funktion, die solche Untermenüpunkte in den "Einstellungen" zu behandeln scheint, und eine andere Funktion, um die Standardpunkte (Beiträge, Seiten, Themen, Plugins, Einstellungen usw.) der "obersten Ebene" neu zu ordnen - aber die Positionierung ändert sich 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 darunter angezeigt. Es wäre hilfreich, sie entsprechend neu zu ordnen - und außerdem in der Lage zu sein, Elemente besser neu zu ordnen die keine Menüposition erzwingen und stattdessen unten erscheinen.

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

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

Und eine ('edit.php? Post_type = shop_order') der WooCommerce-CPTs ordnet sich nicht neu - obwohl die andere ('edit.php? Post_type = product') dies tut.

7
glvr

Um die Reihenfolge der Admin-Menüelemente auf oberster Ebene zu ändern, benötigen Sie zwei hooks, zwei filters und eine function. Fügen Sie den folgenden Code in den functions.php Ihres aktuellen Themas ein:

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 zurückgegebene Array der Admin-Menüelemente der obersten Ebene oben stellt die Menüelemente dar, die von core in ihrer Standardreihenfolge eingefügt wurden. Um von Plugins hinzugefügte Menüelemente einzuschließen, müssen diese zu diesem Array hinzugefügt werden. Nehmen wir an, wir haben zwei Plugins hinzugefügt und aktiviert (zum Beispiel: Wordfence und NextCellent Gallery). Wir müssen zuerst die Namen dieser Menüpunkte finden. Wenn wir auf den Menüpunkt der obersten Ebene von Wordfence klicken, endet die resultierende URL mit ?page=Wordfence. Der Teil nach ?page= ist unser Name (Wordfence). Für NextCellent Gallery lautet der Name nextcellent-gallery-nextgen-legacy. Fügen wir nun die folgenden 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 den Admin Menu Editor Plugin auch für einfache Drag & Drop-Aktionen verwenden.

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

menu_position (Ganzzahl) (optional) Die Position in der Menüreihenfolge, an der der Beitragstyp angezeigt werden soll. show_in_menu muss true 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 möglicherweise für viele von ihnen einsteckbar, oder Sie können ihre Anrufe bearbeiten.

5
rudtek

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 Ihren $new_positions in der my_new_menu_order Funktion:

/**
 * 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;
};
5
rassoh