web-dev-qa-db-fra.com

Ordre Admin sous-menu des éléments?

J'ajoute des éléments à un menu d'administration CPT à l'aide de add_submenu_page, ce qui fonctionne très bien, mais ils sont ajoutés au bas du sous-menu après les options CPT. Je veux pouvoir les avoir en haut, mais je suppose que cette question peut également s'appliquer à la commande de tous les éléments de sous-menus basés sur l'administrateur.

Ce que j’ai essayé (ne fonctionne pas, j’ai essayé plusieurs variantes),

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

       return array( 

         'edit.php?post_type=page' =>array(
                                      'edit.php?post_type=note',
                                      'edit_pages',
                                      'notes',
                                      )   
                    );
}

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

Serait-ce parce que le filtre menu_order ne prend pas en compte les sous-menus?

4
Wyck

Le filtre 'custom_menu_order' ne fonctionnera pas dans l'ordre du menu, car apply_filters dans wp-admin/includes/menu.php fournit false comme contenu filtré. Vous pouvez essayer de changer false en $ menu et le filtre fonctionne à merveille.

Puisque nous ne pouvons évidemment pas toucher au cœur, voici comment je l’ai fait:

function custom_menu_order(){
    global $submenu;

    $find_page = 'edit.php';
    $find_sub = 'Post Tags';

    foreach($submenu as $page => $items):
        if($page == $find_page):
            foreach($items as $id => $meta):
                if($meta[0] == $find_sub):
                    $submenu[$find_page][0] = $meta;
                    unset ($submenu[$find_page][$id]);
                    ksort($submenu[$find_page]);
                endif;
            endforeach;
        endif;
    endforeach;
}
add_action('_admin_menu', 'custom_menu_order');
3
Brian Fegter

Je sais que je suis en train de necro-poster mais j'ai récemment eu le même problème. Veuillez noter que j'ai utilisé la solution de Rao sur SO pour obtenir cette réponse.

En supposant que votre CPT s'appelle "notes".

/**
 * @see https://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order
 */
add_filter( 'custom_menu_order', 'change_note_submenu_order' );

/**
 * Change the submenu order for the Note CPT in the Admin panel
 * 
 * @param  [type] $menu_ord I don't think this is actually used for anything...
 * @return [type]           $menu_ord
 * @see https://stackoverflow.com/questions/18766477/wordpress-change-admin-submenu-order
 */
function change_note_submenu_order( $menu_ord ) {
  global $submenu;

  /* Uncomment the line below to see all menu orders */
  // echo '<pre>'.print_r($submenu,true).'</pre>';

  /**
   * NOTE: Original note submenu order should be:
   *  5 (note list),
   * 10 (Add new),
   * 15 (Categories),
   * 16 (Tags),
   * 17 (Your Custom Page added via add_submenu_page) */
  $arr = array();
  $arr[] = $submenu['edit.php?post_type=note'][17]; // Custom menu page (Omit if unused)
  $arr[] = $submenu['edit.php?post_type=note'][5];  // Note List
  $arr[] = $submenu['edit.php?post_type=note'][10]; // Add New Note
  $arr[] = $submenu['edit.php?post_type=note'][15]; // Categories
  $arr[] = $submenu['edit.php?post_type=note'][16]; // Tags
  $submenu['edit.php?post_type=note'] = $arr;

  return $menu_ord;
}

Commentez définitivement la echo '<pre>'.print_r($submenu,true).'</pre>'; si vous rencontrez des problèmes. Rappelez-vous également que vous pouvez également définir manuellement le tableau dans la fonction change_note_submenu_order.

$notes_list  = array("Notes", "edit_posts", "edit.php?post_type=notes");
$custom_page = array("Custom Menu Page Title", "Capability", "Menu Slug", "Page Title");
$new_note    = array("Add New", "edit_posts", "post-new.php?post_type=note");
$arr         = array($custom_page, $notes_list, $new_note);
$submenu['edit.php?post_type=note'] = $arr;

J'espère que ça aide quelqu'un!

3
StephanieQ

Une autre nécro pour un problème plus simple.

Je voulais juste déplacer mon lien personnalisé vers le bas (ajout d'un commentaire sur la façon dont il pourrait également être utilisé pour traiter la question initiale):

public function change_wc_submenu_order( $menu_order ) {
    global $submenu;

    foreach ( $submenu['woocommerce'] as $index => $item ) {
        if ('My Custom Submenu Title' === $item[0] ) {
            $custom = $item;
            unset( $submenu['woocommerce'][$index] );
            break;
        }
    }

    if ( ! empty( $custom ) ) {
        // If we want it at the beginning, use array_unshift() instead
        array_Push( $submenu['woocommerce'], $custom );
    }

    return $menu_order;
}
0
Camwyn