Solicitar itens do submenu Admin?

4

Estou adicionando itens a um menu CPT Admin usando add_submenu_page , o que funciona muito bem, mas eles são adicionados à parte inferior do submenu após as opções de CPT. Eu quero ser capaz de tê-los no topo, mas eu suponho que esta pergunta também pode ser aplicada para encomendar todos os itens de sub-menu baseados em Admin.

O que tentei (não funciona, tentei várias variações)

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

Isso seria porque o filtro menu_order não leva em conta o submenu?

    
por Wyck 19.09.2011 / 02:44

3 respostas

3

O filtro 'custom_menu_order' não funcionará na ordem do menu porque apply_filters em wp-admin / includes / menu.php fornece falso como o conteúdo filtrado. Você pode tentar mudar o menu falso para $ e o filtro funciona bem.

Como obviamente não podemos tocar no núcleo, eis como o fiz para funcionar:

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');
    
por Brian Fegter 19.09.2011 / 03:37
3

Eu sei que sou necro-post, mas recentemente tive o mesmo problema. Observe que usei a solução de SO da Rao para obter essa resposta.

Supondo que o seu CPT é chamado de "notas".

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

Comente o echo '<pre>'.print_r($submenu,true).'</pre>'; se você tiver problemas. Lembre-se também que você pode definir manualmente a matriz também na função 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;

Espero que isso ajude alguém!

    
por StephanieQ 13.07.2017 / 22:15
0

Outro necro para um problema mais simples.

Eu só queria mover meu link personalizado para o final (acrescentei um comentário sobre como ele poderia ser usado para abordar a pergunta original também):

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;
}
    
por Camwyn 03.10.2018 / 22:38