Obter IDs de página de itens de navegação


11

Estou tentando obter todos os IDs na minha navegação e convertê-lo em uma string para que eu possa usá-lo wp_querypara obter as páginas listadas apenas na navegação. O código para obter os 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);

Mas está retornando os números errados. Quando vou à área administrativa e passo o mouse sobre as páginas, o número que aparece na barra de endereços na parte inferior da tela não corresponde. O que estou fazendo de errado?

Respostas:


13

Os itens de menu são armazenados na poststabela com um post_typede nav_menu_item. Então, o que você está retornando é o ID do item de menu em si, não o que ele aponta.

O ID da página / postagem ao qual o item de menu se refere é armazenado na postmetatabela, com um post_idque corresponda ao item de menu IDe meta_key= _menu_item_object_id. A maneira mais fácil de obter meta_value(ou seja, a página apontada pelo item de menu) é usar algo como isto:

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


Demorei um pouco para que o código que eu publiquei acima funcionasse. Estou tentando adicionar seu código, mas não consegui fazê-lo funcionar. Tirei o loop foreach e tentei sua linha acima, mas não obtive nada. Como uso seu exemplo?
Jamie

@ Jamie Basta substituir sua linha: $numbers[] = $menu_item->ID;com a da minha resposta.
quer

1

Eu não seria capaz de dizer quando essa alteração ocorreu, mas a partir da versão 5.2.4 do WordPress, você pode usar objecte object_idrecuperar o ID da página. Aqui está como eu faria isso:

/**
 * 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. Obrigado
Jamie
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.