如何向已注销的用户隐藏菜单中的项目(无需插件)

时间:2016-07-31 作者:Iqbal Mahmud

如果用户注销,我想从菜单中隐藏一个项目。

我目前正在使用下面的代码,通过使用两个单独的菜单来实现这一点,但为了避免重复,我只想管理一个nav菜单。

function my_wp_nav_menu_args( $args = \'\' ) {

    if ( is_user_logged_in() ) { 
        $args[\'menu\'] = \'logged-in\';
    } else { 
        $args[\'menu\'] = \'logged-out\';
    }

    return $args;
}
add_filter( \'wp_nav_menu_args\', \'my_wp_nav_menu_args\' );
是否可以只为注销的用户隐藏一个项目,而不是像我现在这样做?

5 个回复
最合适的回答,由SO网友:MD Sultan Nasir Uddin 整理而成

查找要隐藏的菜单项的类或id。假设该菜单的类为logged-in-menu

然后在标题中。关闭head标记之前,请使用以下代码创建主题的php文件

<style>
<?php if(! is_user_logged_in() ) : ?>
    .logged-in-menu{
        display: none;
    }
<?php endif; ?>
</style>

SO网友:chrisguitarguy

滤器wp_nav_menu_objects. 它将包含要渲染的导航菜单项的排序列表。看看wp_setup_nav_menu_item 对于可以使用的某些属性。

下面是一个快速(未经测试)的示例。

add_filter( \'wp_nav_menu_objects\', function( array $items, array $args ) {

    if ( \'someThemeLocation\' !== $args->theme_location ) {
        return $items;
    }

    return array_filter( $items, function( $item ) {
        return \'/user-specific-thingy\' === $item->url 
            && ! is_user_logged_in();
    } );

}, 10, 2 );

SO网友:kaiser

当我写这个答案时,@chrisguitarguy已经添加了一个超过有效值的答案,这里是对其他两个答案的简单添加。

这个return 的值wp_setup_nav_menu() 函数具有a filter, 其中$menu_item 作为唯一提供的值–正好在返回之前–它是类型object 和a\\stdClass 具有以下内容public 可以检查的属性:

  • ID: 如果菜单项表示分类术语,则为term\\u id
  • attr_title: 此菜单项的链接元素的标题属性
  • classes: 此菜单项的链接元素的类属性值数组
  • db_id: 此项的DB ID作为nav\\U menu\\U项对象(如果存在)(如果不存在,则为0)
  • description: 此菜单项的说明
  • menu_item_parent: nav\\U menu\\u项的DB ID,该项是该项的菜单父项(如果有)。否则为0
  • object: 最初表示的对象类型,例如“类别”、“帖子”或“附件”
  • object_id: 此菜单项表示的原始对象的DB ID,例如帖子的ID和类别的term\\u ID
  • post_parent: 原始对象的父对象的DB ID(如果有)(否则为0)
  • post_title: 如果菜单项表示缺少标题的帖子,则为“无标题”标签
  • target: 此菜单项的链接元素的目标属性
  • title: 此菜单项的标题
  • type: 最初表示的对象族,例如“post\\u type”或“taxonomy”
  • type_label: 用于描述此类菜单项的单数标签
  • url: 此菜单项指向的URL
  • xfn: 此菜单项链接中表示的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 或者为更具体的目标添加类似的类,而不是像上面那样添加额外的类。

SO网友:Iqbal Mahmud

之后,我使用css第n个子项完成了这个过程

add_action(\'wp_head\',\'hide_menu\');

function hide_menu() { 
    if ( is_user_logged_in() ) {
        //
    } else {
        $output="<style> .menu li:nth-child(3) { display: none; } </style>";
    }
    echo $output;
}
感谢大家的努力:)

SO网友:Mohannad Najjar
<?php
//Then in header.php file of your theme before closing head tag use the below code
//https://wordpress.stackexchange.com/questions/233667/how-to-hide-an-item-from-a-menu-to-logged-out-users-without-a-plugin
    <?php
 if ( is_user_logged_in() ) {
       $output="<style>.menu-item-8685 {display: none !important;}</style>";
echo $output;
    } else {  
         echo \'<script>alert("Welcome vistor")</script>\';
    }
     ?>

相关推荐

用标准的干净文件替换NAV-menus.php文件?

我是一个自学成才的wordpress网站设计师,请原谅我的无知。我为一个客户开发的几个网站最近被一个印尼黑客组织破坏了(很有趣!)。客户端没有更新wordpress安装和其他一些危及安全的事情。遗憾的是,没有网站的清理备份。网络主机给了我一个包含恶意软件扫描结果的文本文件。看起来很多受影响的文件都是导航菜单。网站的php文件。文本文件中显示的扫描结果示例如下:“[主目录]/[网站文件夹名称]/wp includes/nav-menu.php:SL-php-INJECTOR-1-ejw.UNOFFICIAL