Obtenir les ID de page des éléments de navigation

11

J'essaie d'obtenir tous les identifiants dans ma navigation et de les convertir en une chaîne afin de pouvoir l'utiliser avec wp_querypour obtenir les pages qui ne sont répertoriées que dans la navigation. Le code pour obtenir les identifiants:

$menu_name = 'primary';

if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] )) {
    $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
    $menu_items = wp_get_nav_menu_items($menu->term_id);
}

foreach ( $menu_items as $menu_item ) {
    $numbers[] = $menu_item->ID;
}

$number = implode(',',$numbers);

Mais il renvoie les mauvais chiffres. Lorsque je vais dans la zone d'administration et que je passe la souris sur les pages, le nombre qui s'affiche dans la barre d'adresse en bas de l'écran ne correspond pas. Qu'est-ce que je fais mal?

Jamie
la source

Réponses:

13

Les éléments de menu sont stockés dans le poststableau avec un post_typede nav_menu_item. Donc, ce que vous retournez est l'ID de l'élément de menu lui-même, pas ce qu'il pointe.

L'ID de page / publication auquel l'élément de menu fait référence est stocké dans le postmetatableau, avec un post_idqui correspond à l'élément de menu IDet meta_key= _menu_item_object_id. La façon la plus simple d'obtenir le meta_value(c'est-à-dire la page pointée par l'élément de menu) est d'utiliser quelque chose comme ceci:

$numbers[] = get_post_meta( $menu_item->ID, '_menu_item_object_id', true );

anu
la source
Il m'a fallu un certain temps pour que le code que j'ai affiché ci-dessus fonctionne. J'ai essayé d'ajouter votre code mais je n'ai pas réussi à le faire fonctionner. J'ai sorti la boucle foreach et essayé votre ligne ci-dessus mais je n'ai rien obtenu. Comment utiliser votre exemple?
Jamie
@Jamie Remplacez simplement votre ligne: $numbers[] = $menu_item->ID;par celle de ma réponse.
anu
1

Je ne serais pas en mesure de vous dire quand ce changement s'est produit, mais à partir de la version 5.2.4 de WordPress, vous pouvez utiliser objectet object_idrécupérer l'ID de page. Voici comment je procéderais:

/**
 * The `0` is added as a default case.
 * In case our menu does not contain any pages this
 * will prevent our query from returning all pages
 */
$page_ids           = array( 0 );
$registered_menu    = 'my_registered_menu';
$locations          = get_nav_menu_locations();

if( ! empty( $locations ) && isset( $locations[ $registered_menu ] ) ) {

    $menu = wp_get_nav_menu_object( $locations[ $registered_menu ] );
    $menu_items = wp_get_nav_menu_items( $menu->term_id );

    if( ! empty( $menu_items ) ) {

        foreach( $menu_items as $item ) {

            // Only grab page IDs
            if( 'page' !== $item->object ) {
                continue;
            }

            $page_ids[] = $item->object_id;

        }

    }

}

$page_query = new WP_Query( array(
    'post_type'     => 'page',
    'post_status'   => 'publish',
    'no_found_rows' => true,
    'post__in'      => $page_ids,
    'posts_per_page'=> 100, // Large upper limit
) );
Howdy_McGee
la source
Intéressant. Merci
Jamie