Wp导航菜单中的$Variable(计数器)

时间:2016-06-15 作者:kiarashi

我的WP菜单结构如下(简化)

<ul>
<li class="dashboard menu-item ... menu-item-56"><a href=#link">WP link</a></li>
<li class="messages menu-item ... menu-item-57"><a href=#custom-link">Messages</a></li>
<li class="profile menu-item ... menu-item-58"><a href=#link">WP link 2</a></li>
</ul>
现在,它想添加一个带有计数器的标签/徽章,但只有在使用css类“messages”时。

计数器将是variable, 所以这个。。。

<li class="messages menu-item ... menu-item-57"><a href=#link">Messages</a></li>
。。。应该成为。。。

<li class="messages menu-item ... menu-item-57">
     <a href=#link">Messages</a><span class="counter">\'. $counter .\'</span>
</li>
[![在此输入图像描述][1][1]

我的初学者代码。。。

function add_counter_comments($items, $args) {

  if ($args->theme_location == \'my_custom_menu\' ) {

   //what code should I add?

  }

  return $items;
}
add_filter(\'wp_nav_menu_items\', \'add_counter_comments\', 10, 2); 

Update:

我的计数器看起来像这样,但我不明白为什么它没有被添加。

$current_user = wp_get_current_user();

$args = array(
    \'post_author\'   => $current_user->ID,
    \'status\'        => \'approve\',
    //...
);

$comments_query = new WP_Comment_Query;
$comments       = $comments_query->query( $args );

$comment_count  = 0;

foreach ($comments as $comment) { 
    $comment_count++;       
} 

$counter = $comment_count;
然后换一行

$item_output .= sprintf( \' <span class="counter">%d</span>\', $counter );
我甚至用这个测试过,但也没用。

$item_output .= $counter;

1 个回复
最合适的回答,由SO网友:birgire 整理而成

计数器-内部菜单链接,例如,您可以使用nav_menu_item_titleCodex过滤器以调整菜单标题:

add_filter( \'nav_menu_item_title\', function( $title, $item, $args, $depth )
{
    static $instance = 0;

    // Append an increasing counter to the menu title for menu items
    // within a given menu location and menu class

    if(    \'my-custom-location\' === $args->theme_location 
        && in_array( \'my-custom-class\', (array) $item->classes ) 
    )
        $title .= sprintf( \' <span class="counter">%d</span>\', ++$instance );

    return $title;

}, 10, 4 );
您应该将其调整到主题位置和菜单类。

计数器-外部菜单链接

上述方法将在链接标题中添加计数器。如果我们想在菜单链接之后添加它呢?然后我们可以使用walker_nav_menu_start_elCodex过滤器:

add_filter( \'walker_nav_menu_start_el\', function( $item_output, $item, $depth, $args )
{
    static $instance = 0;

    // Append an increasing counter to the menu link for menu items
    // within a given menu location and menu class

    if(    \'my-custom-location\' === $args->theme_location 
        && in_array( \'my-custom-class\', (array) $item->classes ) 
    )
        $item_output .= sprintf( \' <span class="counter">%d</span>\', ++$instance );

    return $item_output;

}, 10, 4 );
内联文档上的注释我注意到inline documentation 对于nav_menu_item_title 表示$args 是一个数组,但它似乎是stdClass 对象所以这有点令人困惑!

如果我们退房Walker::display_element() 然后我们看到$args 输入参数实际上是一个数组,它与输出、元素和深度的数组合并为:

$cb_args = array_merge( array(&$output, $element, $depth), $args);
call_user_func_array(array($this, \'start_el\'), $cb_args);
但是在这里$cb_args 是一个数组,其中第四个元素是stdClass 对象(不是数组),这是Walker_Nav_Menu::start_el() 方法

这个inline documentation 对于Walker_Nav_Menu::start_el() 还表示它的第三个输入参数是一个数组。当它是一个物体时。

我将考虑为此创建一个trac票证。

更新

如果计数器是注释数,则可以使用count 属性下面是一个示例:

$counter = get_comments( 
    [ 
        \'count\'         => true,
        \'post_author\'   => $current_user->ID,
        \'status\'        => \'approve\',
        // ... etc
    ]
);
您可能还想检查用户是否已登录,以避免为其他访问者运行此查询。

相关推荐

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

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