从wp_NAV_MENU()在项目标题中添加自定义文本

时间:2012-01-26 作者:Simon

我需要在wp\\u nav\\u menu()调用的特定菜单的每个标题后添加一些内容

我试过了

add_filter(\'wp_nav_title\', \'testing_stuff\');
使用

function testing_stuff() {
$item->title = $item->title . \' testing\';
return $item->title;
}

没有任何成功,我对勾搭还不够熟悉。

我的目的:

当我调用menu ID=4时

  • 对于每个项目的每个标题,我从当前页面meta中提取数据,其中$meta\\u value=get\\u post\\u meta($post->ID,$meta\\u key,true)
  • 我将此数据添加到a中的锚文本之后,这样菜单的每个项目都将有一个特定的数据添加到其内容中,我可以从自定义字段操作数据。

    如果有任何线索能让我走上正确的道路,我将不胜感激。

    非常感谢。

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

    以下方法可行,但需要注意以下几点。会的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;
    }
    

    SO网友:Simon

    感谢Stephen:这是代码的工作形式(我从最初的提议中删除了我不使用的选项)。我只是测试元数据是否有非空值,这样我就不会将空值传播到html中。

    function packaging_setup($item) {
    //Alter the title:
    $ala_page = get_page_by_title( $item->title ); // getting the page itself
    $ala_page_id = $ala_page->ID; // the page ID the item is refering to
    $pack_meta_key = \'box_packaging_meta\'; // my meta key
    $pack_meta_value = get_post_meta($ala_page_id, $pack_meta_key, true ); // getting data
        if (!empty($pack_meta_value)) { //so I do not add empty spans
        $item->title = $item->title.\'<span>\' . $pack_meta_value . \'</span>\'; //altering
        }
        return $item; 
    }
    
    add_filter(\'wp_setup_nav_menu_item\', \'packaging_setup\');
    

    结束

    相关推荐

    Menu API not switching menus?

    我正在使用菜单API,我想切换到其他菜单,但出于某种原因,它保留了第一个菜单这是我的密码在函数中。php add_action( \'init\', \'register_my_menus\',10 ); function register_my_menus() { register_nav_menu(\'main-navigation\', \'Main Navigation\'); } 下面是我的主题文件(header.ph