Получить идентификаторы страниц из элементов навигации

11

Я пытаюсь получить все идентификаторы в моей навигации и преобразовать его в строку, чтобы я мог использовать его wp_queryдля получения страниц, которые перечислены только в навигации. Код для получения идентификаторов:

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

Но он возвращает неправильные цифры. Когда я захожу в админку и наводю указатель мыши на страницы, число, отображаемое в адресной строке внизу экрана, не совпадает. Что я делаю неправильно?

Джейми
источник

Ответы:

13

Пункты меню хранятся в postsтаблице с post_typeо nav_menu_item. Итак, вы возвращаете идентификатор самого пункта меню, а не то, на что он указывает.

Идентификатор страницы / записи, на который ссылается данный пункт меню, сохраняется в postmetaтаблице, где a post_idсоответствует элементу меню IDи meta_key= _menu_item_object_id. Самый простой способ получить meta_value(то есть страницу, на которую указывает пункт меню), это использовать что-то вроде этого:

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

ана
источник
Мне потребовалось некоторое время, чтобы заставить код, который я отправил выше, работать. Я пытался добавить ваш код, но я не смог заставить его работать. Я вынул цикл foreach и попробовал твою строчку выше, но ничего не получил. Как мне использовать ваш пример?
Джейми
@ Джейми Просто замени свою строчку: $numbers[] = $menu_item->ID;той, что в моем ответе.
ана
1

Я не смог бы сообщить вам, когда произошло это изменение, но начиная с WordPress версии 5.2.4 вы можете использовать objectи object_idдля получения идентификатора страницы. Вот как бы я это сделал:

/**
 * 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
источник
Интересно. Спасибо
Джейми