是否将类名添加到_ategory()函数?

时间:2013-03-17 作者:mathiregister

是否可以使用add_filter 或类似于添加slug 类别的the_category() 作用

现在使用时the_category() 输出如下所示…

<ul class="post-categories">
    <li>
        <a href="http://mysite.com/something" title="" rel="category tag">News</a>
    </li>
</ul>
有没有可能得到这个…

<ul class="post-categories">
    <li class="category-news">
        <a href="http://mysite.com/something" title="" rel="category tag">News</a>
    </li>
</ul>
或者类似的东西,至少一些类名slug 这样我就可以通过CSS选择它了?

事先谢谢你,马特。

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

第一次定位the_category()Codex. 向下滚动至页面底部至“源代码”。有一个链接“the_categfory() 位于。。。。单击该链接,您将被重定向到source code. 交替打开文件wp-includes/category-template.php 在IDE或编辑器中。

现在搜索function the_category(). 您将看到该函数调用另一个函数get_the_category_list(). 也搜索此函数。现在阅读代码并搜索apply_filters()add_action()

正如你所看到的,只有一个apply_filters() 在函数末尾调用。如果仔细阅读代码,您现在就会知道,您只能过滤由创建的完整htmlthe_category().

有几种方法可以修改html。DOMDocument就是其中之一preg_replace_callback() 另一个。

function add_class_callback( $result ) {

  $class = strtolower( $result[2] );
  $class = str_replace( \' \', \'-\', $class );
  // do more sanitazion on the class (slug) like esc_attr() and so on

  $replacement = sprintf( \' class="%s">%s</a>\', $class, $result[2] );
  return preg_replace( \'#>([^<]+)</a>#Uis\', $replacement, $result[0] );

}

function add_category_slug( $html ) {

  $search  = \'#<a[^>]+(\\>([^<]+)\\</a>)#Uuis\';
  $html = preg_replace_callback( $search, \'add_class_callback\', $html );

  return $html;
}

add_filter( \'the_category\', \'add_category_slug\', 99, 1 );
这很容易,不是吗?在上应用筛选器the_category 钩搜索<a followed by some chars but not >[group the chars until <]</a>, 将结果传递给回调函数。回调函数检索一个包含所有搜索结果的数组,我们选择最后一个,这是链接的文本。然后从文本中创建一个类,请(自己)很好地进行清理。最后,插入class属性并将生成的结果返回给preg_replace_callback() weher它将替换为搜索结果。

是的,我非常喜欢DOM操作。。。不是;)

哦,我忘了。您也可以使用jQuery来实现这一点。搜索类“”。post categories(发布类别),grep list标记中的所有链接标记,遍历结果并获取href属性,将其转换为propper classname,添加带有.addClass(class) 链接标记。

SO网友:Thomas Fellinger

虽然在某些语言中对类名进行清理可能非常困难,但我更喜欢@powerboulg的评论,并发现:

function yourTheme_category_class($thelist){
  $categories = get_the_category();

  if ( !$categories || is_wp_error($categories) ) {
    return $thelist;
  }

  $output = \'<ul class="post-categories">\';
  foreach ( $categories as $category ) {
    $output .= \'<li class="category-\' . $category->slug . \'"><a href="\' . esc_url(get_category_link($category->term_id)) . \'">\' . $category->name . \'</a></li>\';
  }
  $output .= \'</ul>\';

  return $output;
}
add_filter( \'the_category\', \'yourTheme_category_class\');
我希望这会有帮助,干杯

结束