Отримуйте ідентифікатори сторінки з елементів навігації


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таблиці, а post_idцей номер відповідає пункту меню IDта meta_key= _menu_item_object_id. Найпростіший спосіб отримати meta_value(тобто сторінку, на яку вказує пункт меню), - використовувати щось подібне:

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


Мені знадобилося деякий час, щоб отримати код, який я розмістив вище, щоб працювати. Я намагався додати ваш код, але мені не вдалося змусити його працювати. Я вийняв цикл foreach і спробував вашу лінію вище, але нічого не отримав. Як я можу використовувати ваш приклад?
Джеймі

@Jamie Просто замініть свій рядок: $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
) );

Цікаво. Дякую
Джеймі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.