Category Alphabet List Broken

时间:2014-06-13 作者:Constantino_A_

在3.6.1及以下版本中,这一点很有效。将WordPress更新到3.9.1版后,我的类别列表被破坏

在版本3.6.1中,我的类别列表如下所示

A|B|C

(A)    (B)    (C)
Apple  Bat    Cat
升级到3.9.1版后,如下所示

A|B|C

(A)    (B)    (C)
Apple  Apple  Apple
Bat    Bat    Bat
Cat    Cat    Cat
这是3.6.1中的代码。有人能提出一个解决方案,使其在3.9.1版中发挥作用吗?

<?php 
$a = array(\'name__like\' => "a", \'order\' => \'ASC\', \'title_li\' => \'0\', \'use_desc_for_title\' => \'0\');
$b = array(\'name__like\' => "b", \'order\' => \'ASC\', \'title_li\' => \'0\', \'use_desc_for_title\' => \'0\');
?>
<div class="menu-alpha">
<ul>
<li><a href="#A">A</a></li>
<li><a href="#B">B</a></li>
</ul>
</div>


<div id="left-side">
<div class="alpha"><a name="A">A</a></div>
<ul>
<?php wp_list_categories($a); ?>
</ul>
<div class="alpha"><a name="B">B</a></div>
<ul>
<?php wp_list_categories($b); ?>
</ul>

2 个回复
SO网友:Pieter Goosen

ANSWER REVISITED

我刚刚在SO上做了相同类型的答案,并选择了另一条比我原来的答案快得多的路线。我想,为了这个网站的利益,重新审视这个答案并发布我的新方法会很好。

这个name__like 的参数get_terms 已在Wordpress 3.7中更改。它不再检索具有指定首字母的术语名称,而是检索名称中任何位置具有指定字母的术语名称

此外,如果您要尝试运行代码26次,那么页面加载时间就会出现问题

这是我的方法和测试结果

Test results: 0.01074秒内查询1次。

Test output:请注意,我的测试地点是南非荷兰语,所有名称都是术语名称)

enter image description here

Here is the code that makes it happen

$terms = get_terms(\'pa_manufacturer\');

if ( !empty( $terms ) && !is_wp_error( $terms ) ){    
$term_list = [];    
foreach ( $terms as $term ){
    $first_letter = strtoupper($term->name[0]);
    $term_list[$first_letter][] = $term;
}
unset($term);

echo \'<ul class="my_term-archive">\';

    foreach ( $term_list as $key=>$value ) {
        echo \'<h2 class="term-letter">\' . $key . \'</h2>\';

        foreach ( $value as $term ) {
            echo \'<li><a href="\' . get_term_link( $term ) . \'" title="\' . sprintf(__(\'View all post filed under %s\', \'my_localization_domain\'), $term->name) . \'">\' . $term->name . \'</a></li>\';
        }
    }

echo \'</ul>\';
}

HOW THE CODE WORKS

这里最好的方法是一次性获得所有术语,以避免不必要的db命中。现在可以通过get_terms 通过foreach

在这里,你要诉诸你的条款。首先要做的是创建一个新数组,$term_list, 获取每个术语名称的第一个字母,然后将此字母指定为新数组中的键。每个键的值将包含一个术语信息数组

这个新数组将用于显示每个字母下的术语名称,如上图所示。

SO网友:cybmeta

您正在使用wp_list_categories() 带参数的函数name__like 但是这个参数对这个函数无效(我认为你的代码不像你在WP 3.6+中描述的那样工作)。您可以使用get_terms. 例如:

 <?php

 function cyb_get_categories_list_name_like($letter) {

     $categories = get_terms( \'category\', array(\'name__like\' => $letter) ) ;

     $list = \'\';  

     if( !empty( $categories ) && !is_wp_error( $categories ) ) {

         $list = \'<ul>\';

         foreach( $categories as $cat ) {
              $list .= \'<li><a href="\'.get_term_link($cat).\'">\'.$cat->name.\'</a></li>\';
         }

         $list = \'</ul>\';

     }

     return $list;

 }

 <div class="menu-alpha">
      <ul>
           <li><a href="#A">A</a></li>
           <li><a href="#B">B</a></li>
      </ul>
 </div>

 <div id="left-side">
      <div class="alpha"><a name="A">A</a></div>
      <?php cyb_get_categories_list_name_like(\'a\'); ?>
      <div class="alpha"><a name="B">B</a></div>
      <?php cyb_get_categories_list_name_like(\'b\'); ?>
 </div>

 ?>
正如Pieter Goosen所指出的,需要一个过滤器来使name\\uu-like参数只匹配术语的第一个字母:

 //Credit here @s_ha_dum
 function old_style_name_like_wpse_123298($clauses) {
      remove_filter(\'term_clauses\',\'old_style_name_like_wpse_123298\');
      $pattern = \'|(name LIKE )\\\'%(.+%)\\\'|\';
      $clauses[\'where\'] = preg_replace($pattern,\'$1 \\\'$2\\\'\',$clauses[\'where\']);
      return $clauses;
 }
 add_filter(\'terms_clauses\',\'old_style_name_like_wpse_123298\');

结束

相关推荐

使用Get_Categories显示类别的图像,或显示任何子帖子中的图像

我正在使用get\\u categories列出父类别的子类别。我想使用get\\u categories输出将图像添加到子类别。我可以从我正在使用get\\u categories的类别的子类别(即父类别的子类别)的任何帖子中获取特色图像。我不想显示任何其他孙儿信息,只想从每组类别的孩子中获得一张特色图片我当前使用的代码是$args = array(\'child_of\' => 1 ); $categories = get_categories($args); forea