Get page IDs from nav items

时间:2013-04-06 作者:Jamie

我正在尝试获取导航中的所有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);
但它返回了错误的数字。当我转到管理区域并将鼠标悬停在页面上时,屏幕底部地址栏中显示的数字不匹配。我做错了什么?

2 个回复
最合适的回答,由SO网友:anu 整理而成

菜单项存储在posts 带有post_type 属于nav_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 );

SO网友:Howdy_McGee

我无法告诉您此更改是何时发生的,但从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
) );

结束

相关推荐

get post by nav id

我试图通过导航id获取帖子id,以便在循环中使用。我做了一个新的查询来获取帖子。我在一个页面上使用多个查询,因为我需要。其中一个查询获取页面模板,该模板包含您发布到的类别,并由该模板显示。我的问题是,如果我输入查询以获取帖子,那么我最终会得到两次主题中的数据。所以我想让它只显示一个有导航链接的帖子。它仍然可以链接到帖子,但我只希望查询得到一个包含导航项目的帖子。每次我尝试,我都会得到一堆这样的东西 bool(true) 我读到的一些功能,有些来自这个网站,并没有按照我理解的方式工作。我直接从抄本