【问题标题】:wp_nav_menu filter, removing a specific linkwp_nav_menu 过滤器,删除特定链接
【发布时间】:2016-04-01 10:43:14
【问题描述】:

我正在尝试从我的 wordpress 菜单中删除特定链接:

<li class="ubermenu-item ubermenu-item-type-post_type ubermenu-item-object-page ubermenu-item-1 ubermenu-item-level-0 ubermenu-column ubermenu-column-auto" ><a class="ubermenu-target ubermenu-item-layout-default ubermenu-item-layout-text_only" href="/first/" tabindex="0"><span class="ubermenu-target-title ubermenu-target-text">First</span></a></li>

<li class="ubermenu-item ubermenu-item-type-post_type ubermenu-item-object-page ubermenu-item-2 ubermenu-item-level-0 ubermenu-column ubermenu-column-auto" ><a class="ubermenu-target ubermenu-item-layout-default ubermenu-item-layout-text_only" href="/second/" tabindex="0"><span class="ubermenu-target-title ubermenu-target-text">Second</span></a></li>

<li class="ubermenu-item ubermenu-item-type-post_type ubermenu-item-object-page ubermenu-item-3 ubermenu-item-level-0 ubermenu-column ubermenu-column-auto" ><a class="ubermenu-target ubermenu-item-layout-default ubermenu-item-layout-text_only" href="/third/" tabindex="0"><span class="ubermenu-target-title ubermenu-target-text">Third</span></a></li>


function remove_link( $menu ) {
    return str_replace( '<a href="', '<a>', $menu );
}
add_filter( 'wp_nav_menu', 'remove_link' );

我尝试删除的链接将.ubermenu-item-3 附加到li 元素。我该怎么做?

【问题讨论】:

  • 检查您的主题是否有任何菜单助行器并将其删除?还是去掉 ubermenu 插件?
  • 某些用户需要将其删除,因此请在运行时通过函数文件。
  • 你想删除父 li 之间的所有内容还是只删除链接?

标签: php regex wordpress preg-replace


【解决方案1】:

您应该改用wp_nav_menu_objects filter。无需使用可能会造成混乱的字符串替换或 DOM 解析,因为您可以在生成标记之前过滤菜单项数组。

这是来自http://hookr.io/filters/wp_nav_menu_objects/的一些骨架代码

// define the wp_nav_menu_objects callback 
function filter_wp_nav_menu_objects( $sorted_menu_items, $args ) { 
    // make filter magic happen here... 
    return $sorted_menu_items; 
}; 

// add the filter 
add_filter( 'wp_nav_menu_objects', 'filter_wp_nav_menu_objects', 10, 2 ); 

只需取消设置数组中适当的索引即可。

或者,只需使用专为此目的而设计的 UberMenu 条件扩展。 http://wpmegamenu.com/conditionals

【讨论】:

  • 注意:$sorted_menu_items 是一个索引为 1 的数组,而不是索引为 0 的数组。元素0没有设置,最后一个元素是“length”而不是“length-1”。
【解决方案2】:

以下两个版本。阅读cmets!这取决于 domdocument,大多数 php 安装都会有它,但一些自定义设置没有。

function remove_link( $html ) {
    $dom->loadHTML($html);
    $links= $dom->getElementsByTagName('li');

    foreach($links as $data){

        if(strpos($data->getAttribute('class'), 'ubermenu-item-3') !== false){

            //remove the entire li - comment out if just removing the href
            $data->parentNode->removeChild($data);

            //alternatively change the href as per your code (comment out if using remove the entire li) 
            //foreach($data->getElementsByTagName('a') as $as){
            //  $as->setAttribute('href', '');
            //}     
        }

    }

    $html= $dom->saveHTML();

    return $html;

}

add_filter( 'wp_nav_menu', 'remove_link' );

【讨论】:

    【解决方案3】:

    如果您要排除某个页面,请尝试以下方法:

    
    function exclude_menu_for_visitors($exclude_array){
        $page_id = 1; //id of page you want to exclude
        $exclude_array[]= $page_id;
        return $exclude_array;
    }
    
    add_filter('wp_list_pages_excludes', 'exclude_menu_for_visitors');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-28
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多