我想通过当前的post ID获取导航菜单名称。在我的数据库中搜索了几个小时后,我发现导航菜单基本上只是分类法“nav\\u menu”的术语。但由于某些原因,它们的工作原理不同。
我尝试使用get\\u the\\u terms()函数获取术语(导航菜单),但这不会返回任何结果。
global $post;
get_the_terms( $post->ID, \'nav_menu\' );
我找不到其他函数来获取“nav\\U菜单”分类法的“术语”。
wp_get_nav_menu_items 例如,返回菜单中的帖子,这不是我需要的。
我想我需要创建自己的功能,但我找不到导航菜单的数据库结构是如何工作的。。
EDIT:
我做了以下功能,但@Rars给了我一个更快更干净的选择。
function get_post_menu( $post_id = null, $output = \'term_id\' ) {
if( ! isset( $post_id ) ) {
global $post;
$post_id = $post->ID;
}
global $wpdb;
$menu = $wpdb->get_results( "
SELECT term_taxonomy_id
FROM $wpdb->term_relationships
WHERE object_id =
(SELECT post_id
FROM $wpdb->postmeta
WHERE meta_key = \'_menu_item_object_id\'
AND meta_value = $post_id)"
, OBJECT
);
$term = get_term_by( \'term_taxonomy_id\', $menu[0]->term_taxonomy_id, \'nav_menu\' );
return $term->$output;
}
最合适的回答,由SO网友:Rarst 整理而成
您缺少一个链接。帖子不会直接分配给菜单。有一个post类型nav_menu_item
在里面nav_menu
将帖子(或其他类型的目的地)链接到其在菜单中的位置的分类法。
此代码段可以帮助您开始检索:
$menu_items = get_posts( [
\'post_type\' => \'nav_menu_item\',
\'meta_query\' => [
[
\'key\' => \'_menu_item_object_id\',
\'value\' => get_the_ID(),
]
],
] );
foreach ( $menu_items as $menu_item ) {
var_dump( get_the_terms( $menu_item->ID, \'nav_menu\' ) );
}