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?

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


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

Interesante. Gracias
Jamie
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.