web-dev-qa-db-fra.com

Ordre par la structure du menu

Comme je fais un site Web d'une page. Voici la question que j'ai posée plus tôt:

Appel de pages spécifiques avec la requête wp Partie II

Comme j'appelle toutes les pages par WP_Query qui est "order by = ASC", je veux l'appeler "order by structure de menu" et non menu_order.

Pour E.g: screenshot

Maintenant, je veux rentrer chez moi au sommet, puis aux services, puis aux témoignages. dépend de la structure du menu ..

Comment puis-je y arriver .. Aide s'il vous plaît .. Merci d'avance!

2
Hussy571

Vous pouvez pouvez utiliser un WP_Query sur nav_menu_item puisqu'il s'agit de son propre type de publication. Je n'ai jamais fait ça, mais peut-être que ça marcherait comme vous en avez besoin, ça vaut le coup. Il y a trois autres possibilités:

Option 1 - Obtenez vos éléments de menu de navigation

Il existe une fonction appelée wp_get_nav_menu_items() qui vous renverra un tableau de vos éléments de menu que vous pourrez ensuite parcourir et afficher. Voici un exemple d'utilisation. Il y a quelques "Gotcha!" ici:

  • $item->ID est l'ID des éléments de navigation actuels not the post_id. L'ID de publication est maintenant $item->object_id.
  • $item->title est le titre actuel des éléments de navigation et pas nécessairement le post_title bien que, par défaut, il puisse toujours être modifié. Le moyen le plus fiable d'obtenir le titre du message consiste à utiliser le object_id et à le transmettre à la fonction get_the_title().

$nav_items = wp_get_nav_menu_items( 'Main Menu', array(
    'order'                  => 'ASC',                  // List ASCending or DESCending
    'orderby'                => 'title',                // Order by your usual, menu_order, post_title, etc. Check WP_Query
    'post_type'              => 'nav_menu_item',        // To be honest, I'm not sure why this is an option, leave it be.
    'post_status'            => 'publish',              // If there are private / draft posts in our menu, don't show them
    'output'                 => ARRAY_A,                // Return an Array of Objects
    'output_key'             => 'menu_order',           // Not sure what this does
    'nopaging'               => true,                   // Not sure what this does
    'update_post_term_cache' => false                   // Not sure what this does
) );

if( ! empty( $nav_items ) ) {
    foreach( $nav_items as $item ) {
        echo "{$item->title} - " . get_the_title( $item->object_id );
        echo "<br />\n";
    }
}

Option 2 - Nav Walker personnalisé

Vous pouvez simplement afficher votre menu tel quel à l'aide de wp_nav_menu() et passer un Fonction Walker personnalisée pour modifier sa sortie. Un exemple de ceci pourrait être de tirer automatiquement les pages enfants des éléments de menu, sans ajouter ces pages au menu physique. Classe Walker

Option 3 - Ordre du menu de la page

Habituellement, lorsque je crée un site Web pour un client, j'ai un menu WordPress et je reflète également l'ordre des pages des panneaux d'administration avec l'attribut de page menu_order. De cette façon, vous pouvez interroger des pages en utilisant WP_Query et orderby => 'menu_order'

Image Found on codeholic.in


En dehors de cela, il n'y a pas de orderby => 'My Menu' facile, vous devrez trouver une solution de rechange ou une solution de contournement.

3
Howdy_McGee

Vous pouvez utiliser la fonction wp_get_nav_menu_items () au lieu de wp_query () pour récupérer les éléments de menu d’un menu particulier dans l’ordre de la structure de menus. Une fois que vous avez fait cela, vous pouvez parcourir les éléments de menu un à un pour les utiliser à votre guise (y compris en les filtrant plus avant en fonction du type ou d’autres informations). Ceci suppose que toutes les pages sont dans le menu (ce qui est le cas si vous utilisez cela pour comprendre l'ordre).

2
Amanda Giles