wp_nav_menu 过滤器,删除特定 link
wp_nav_menu filter, removing a specific link
我正在尝试从我的 wordpress 菜单中删除特定的 link:
<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' );
我要删除的 link 具有附加到 li
元素的 .ubermenu-item-3
。我该怎么做?
以下两个版本。阅读评论!这取决于 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' );
您应该改用 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
如果您要排除某个页面,请试试这个:
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');
我正在尝试从我的 wordpress 菜单中删除特定的 link:
<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' );
我要删除的 link 具有附加到 li
元素的 .ubermenu-item-3
。我该怎么做?
以下两个版本。阅读评论!这取决于 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' );
您应该改用 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
如果您要排除某个页面,请试试这个:
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');