以下方法可行,但需要注意以下几点。会的run for every menu, 但它会的not run for wp_page_menu
, 如果找不到菜单,通常是默认回调。
最后,菜单项不是必需的页面,因此您可能需要执行一些逻辑来检查您正在处理的菜单项是否是要从中获取元数据的页面/帖子。
代码如下:
add_filter( \'wp_setup_nav_menu_item\',\'my_item_setup\' );
function my_item_setup($item) {
//Use the following to conduct logic;
$object_id = (int) $item->object_id; //object ID.
$object_type = $item->type; //E.g. \'post_type\'
$object_type_label = $item->type_label; //E.g. \'post\' or \'page\';
//You could, optionally add classes to the menu item.
$item_class = $item->classes;
//Make sure $item_class is an array.
//Alter the class:
$item->classes= $item_class;
//Alter the title:
$pack_meta_value = get_post_meta($object_id, \'test\', true );
if($pack_meta_value ){
$item->title = $item->title.\'<span>\' . $pack_meta_value . \'</span>\';
}
return $item;
}
我很想知道是否有更好的方法可以做到这一点,最好是有一种方法可以让你检查这些项目是为哪个菜单。。。
我从评论中删除了这个。如果希望将此功能限制在特定菜单中,可以try 以下内容这尚未测试。
首先移除add_filter
从上面的代码。相反,插入到添加到早期挂钩上的函数中,并有条件地添加过滤器(例如,当菜单为“primary”时):
add_filter( \'wp_nav_menu_args\',\'add_my_setup_function\' );
function add_my_setup_function($args) {
if( $args[\'theme_location\'] == \'primary\' ):
add_filter( \'wp_setup_nav_menu_item\',\'my_item_setup\' );
endif;
return $args;
}
最后,在加载项目后删除过滤器,以便不会对辅助菜单调用它:
add_filter(\'wp_nav_menu_items\',\'remove_my_setup_function\', 10, 2);
function remove_my_setup_function( $nav, $args ) {
remove_filter( \'wp_setup_nav_menu_item\', \'my_item_setup\' );
return $nav;
}