当我写这个答案时,@chrisguitarguy已经添加了一个超过有效值的答案,这里是对其他两个答案的简单添加。
这个return
的值wp_setup_nav_menu()
函数具有a filter, 其中$menu_item
作为唯一提供的值–正好在返回之前–它是类型object
和a\\stdClass
具有以下内容public
可以检查的属性:
ID
: 如果菜单项表示分类术语,则为term\\u idattr_title
: 此菜单项的链接元素的标题属性classes
: 此菜单项的链接元素的类属性值数组db_id
: 此项的DB ID作为nav\\U menu\\U项对象(如果存在)(如果不存在,则为0)description
: 此菜单项的说明menu_item_parent
: nav\\U menu\\u项的DB ID,该项是该项的菜单父项(如果有)。否则为0object
: 最初表示的对象类型,例如“类别”、“帖子”或“附件”object_id
: 此菜单项表示的原始对象的DB ID,例如帖子的ID和类别的term\\u IDpost_parent
: 原始对象的父对象的DB ID(如果有)(否则为0)post_title
: 如果菜单项表示缺少标题的帖子,则为“无标题”标签target
: 此菜单项的链接元素的目标属性title
: 此菜单项的标题type
: 最初表示的对象族,例如“post\\u type”或“taxonomy”type_label
: 用于描述此类菜单项的单数标签url
: 此菜单项指向的URLxfn
: 此菜单项链接中表示的XFN关系_invalid
: 菜单项是否表示不再存在的对象
因此,一个简单的回调将允许您使用一些条件逻辑,然后可能会排除一个项:
add_filter( \'wp_setup_nav_menu\', function( \\stdClass $item ) {
# Check conditionals, and invalidate an item in case
$item->_invalid = is_user_logged_in()
&& \'post\' === $item->object
&& \'post_type\' === $item->type
# && … whatever you need to check for your invalidation of an item
;
return $item;
} );
排除逻辑存在于
_invalid
并由
_is_valid_nav_menu_item( $item )
在以下情况下使用的回调函数
nav menu items are retrieved. 它在一个
array_filter()
根据此标志减少项目数。
作为@MD Sultan Nasir Uddin解决方案的扩展:虽然只使用CSS的解决方案可以工作,但目标应该是在该请求、数据库查询和渲染管道中都不包含数据。要获得完整的答案,下面仍然是如何使用的示例wp_add_inline_style()
内联样式和PHP heredoc syntax 为了便于阅读:
<?php
/** Plugin Name: Hide menu items for logged in users */
# Add class:
add_filter( \'wp_nav_menu_args\', function( Array $args ) {
if ( is_user_logged_in() )
$args[\'menu_class\'] .= \' logged-in\';
return $args;
} );
# Add inline styles
add_action( \'wp_enqueue_scripts\', function() {
$styles = <<<STYLES
.logged-in .special-item {
display: none;
}
STYLES;
wp_add_inline_style( \'custom-style\', $styles );
} );
你可以用
body
要查找的类
logged-in
或者为更具体的目标添加类似的类,而不是像上面那样添加额外的类。