从导航项获取页面ID


11

我正在尝试获取导航中的所有ID,并将其转换为字符串,以便与之一起使用,wp_query以获取仅在导航栏中列出的页面。获取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);

但是它返回了错误的数字。当我转到管理区域并将鼠标悬停在页面上时,屏幕底部地址栏中显示的数字不匹配。我究竟做错了什么?

Answers:


13

菜单项以的形式存储在postspost_typenav_menu_item。因此,您返回的是菜单项本身的ID,而不是它所指向的。

菜单项引用的页面/帖子ID存储在postmeta表中,其中一个post_id与菜单项IDmeta_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;用我的答案中的那一行。
ANU

1

我无法告诉您何时发生此更改,但是从WordPress版本5.2.4开始,您可以使用objectobject_id检索页面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
) );

有趣。谢谢
杰米·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.