Ottieni ID pagina da elementi di navigazione


11

Sto cercando di ottenere tutti gli ID nella mia navigazione e convertirli in una stringa in modo da poterlo utilizzare con wp_queryper ottenere le pagine che sono elencate solo nel menu di navigazione. Il codice per ottenere gli ID:

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

Ma sta restituendo i numeri sbagliati. Quando vado nell'area di amministrazione e passo il mouse sulle pagine, il numero che appare nella barra degli indirizzi nella parte inferiore dello schermo non corrisponde. Che cosa sto facendo di sbagliato?

Risposte:


13

Le voci di menu sono memorizzati nella poststabella con un post_typedi nav_menu_item. Quindi, ciò che stai restituendo è l'ID della voce di menu stessa, non ciò a cui punta.

L'ID pagina / post a cui fa riferimento la voce di menu è memorizzato nella postmetatabella, con un post_idcorrispondente alla voce di menu IDe meta_key= _menu_item_object_id. Il modo più semplice per ottenere meta_value(ovvero la pagina a cui punta la voce di menu) è usare qualcosa del genere:

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


Mi ci è voluto un po 'per far funzionare il codice che ho postato sopra. Ho provato ad aggiungere il tuo codice ma non sono riuscito a farlo funzionare. Ho tirato fuori il ciclo foreach e ho provato la tua linea sopra ma non ho ottenuto nulla. Come uso il tuo esempio?
Jamie,

@Jamie Basta sostituire la tua linea: $numbers[] = $menu_item->ID;con quella nella mia risposta.
anu,

1

Non sarei in grado di dirti quando è avvenuta questa modifica, ma a partire dalla versione 5.2.4 di WordPress puoi utilizzare objecte object_idrecuperare l'ID della pagina. Ecco come farei questo:

/**
 * 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
) );

Interessante. Grazie
Jamie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.