Obtener ID de página de elementos de navegación

11

Estoy tratando de obtener todos los ID en mi navegación y convertirlos en una cadena para poder usarlos wp_querypara obtener las páginas que solo se enumeran en la navegación. El código para obtener las 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);

Pero está devolviendo los números equivocados. Cuando voy al área de administración y paso el mouse sobre las páginas, el número que aparece en la barra de direcciones en la parte inferior de la pantalla no coincide. ¿Qué estoy haciendo mal?

Jamie
fuente

Respuestas:

13

Los elementos del menú se almacenan en la poststabla con un post_typede nav_menu_item. Entonces, lo que está devolviendo es la ID del elemento del menú en sí, no lo que señala.

El ID de página / publicación al que hace referencia el elemento del menú se almacena en la postmetatabla, con un elemento post_idque coincide con el elemento del menú IDy meta_key= _menu_item_object_id. La forma más fácil de obtener meta_value(es decir, la página a la que apunta el elemento del menú) es usar algo como esto:

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

anu
fuente
Me tomó un tiempo obtener el código que publiqué anteriormente para que funcione. He estado tratando de agregar su código pero no he podido hacerlo funcionar. Saqué el bucle foreach y probé tu línea arriba pero no obtuve nada. ¿Cómo uso tu ejemplo?
Jamie
@Jamie Solo reemplaza tu línea: $numbers[] = $menu_item->ID;con la de mi respuesta.
anu
1

No podría decirte cuándo ocurrió este cambio, pero a partir de la versión 5.2.4 de WordPress puedes usar objecty object_idrecuperar la ID de la página. Así es como haría esto:

/**
 * 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
fuente
Interesante. Gracias
Jamie