Abrufen von Seiten-IDs von Navigationselementen

11

Ich versuche, alle IDs in meiner Navigation abzurufen und in eine Zeichenfolge zu konvertieren, damit ich wp_querydamit die Seiten abrufen kann, die nur in der Navigation aufgeführt sind. Der Code zum Abrufen der IDs:

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

Aber es werden die falschen Zahlen zurückgegeben. Wenn ich zum Administrationsbereich gehe und mit der Maus über die Seiten fahre, stimmt die Nummer, die in der Adressleiste am unteren Bildschirmrand angezeigt wird, nicht überein. Was mache ich falsch?

Jamie
quelle

Antworten:

13

Menüpunkte werden in der postsTabelle mit einem post_typevon gespeichert nav_menu_item. Sie geben also die ID des Menüelements selbst zurück, nicht das, worauf es verweist.

Die Seiten- / Beitrags-ID, auf die sich der Menüpunkt bezieht, wird in der postmetaTabelle gespeichert , wobei eine post_idmit dem Menüpunkt IDund meta_key= übereinstimmt _menu_item_object_id. Der einfachste Weg, um die meta_value(dh die Seite, auf die der Menüpunkt zeigt) zu erhalten, besteht darin, Folgendes zu verwenden:

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

anu
quelle
Es hat eine Weile gedauert, bis der Code, den ich oben gepostet habe, funktioniert hat. Ich habe versucht, Ihren Code hinzuzufügen, aber ich konnte ihn nicht zum Laufen bringen. Ich nahm die foreach-Schleife heraus und versuchte Ihre Linie oben, bekam aber nichts. Wie verwende ich Ihr Beispiel?
Jamie
@ Jamie Ersetzen Sie einfach Ihre Zeile: $numbers[] = $menu_item->ID;durch die in meiner Antwort.
Anu
1

Ich kann Ihnen nicht sagen, wann diese Änderung stattgefunden hat, aber ab WordPress Version 5.2.4 können Sie die Seiten-ID verwenden objectund object_idabrufen. So würde ich das machen:

/**
 * 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
quelle
Interessant. Vielen Dank
Jamie