按字母顺序显示标签列表,每个字母都有一个部分,包括没有术语的空字母

Posted

技术标签:

【中文标题】按字母顺序显示标签列表,每个字母都有一个部分,包括没有术语的空字母【英文标题】:Display Tag List alphabetically with a sections for each letter, including the empty letters that have no terms 【发布时间】:2020-06-26 08:29:24 【问题描述】:

我想用对应的字母按字母对标签列表进行排序。包括空的。

目前,我仅列出具有标签但无法按字母顺序显示/排序的字母。然后我也有它没有在字母表中显示空字母的问题。另外值得一提的是,我添加了 asort(),因为它没有正确排序。

工作:

添加字母分隔符并将其标签嵌套在其下

不工作:

按字母顺序排序 添加空的字母数字以及文本“No tags to display for this letter”

这是我目前所拥有的:

<?php
   $args = array(
     'taxonomy' => 'post_tag',
     'hide_empty' => false,
     'order' => 'ACS',
     'orderby' => 'slug'
    );
    $terms = get_terms($args);

                       
    $term_list = [];    
    foreach ( $terms as $term )
      $first_letter = strtoupper($term->name[0]);
      $term_list[$first_letter][] = $term;
    
    unset($term); 
    asort($term_list );?>
                    
   <div class="tag-wrap">

     <ul>
      <?php foreach ( $term_list as $key=>$value ) : ?>
         <li class="border-radius">
           <a href="#<?php echo $key; ?>"><h3><?php echo $key; ?></h3></a>
         </li>
      <?php endforeach; ?>
     </ul>
  </div>

 <div class="tag-list">
    <?php
      asort($term_list );

      foreach ( $term_list as $key=>$value ) : ?>
         <div class="term-row" id="<?php echo $key; ?>">
            <div class="term-letter">
                <h3><?php echo $key; ?></h3>
            </div>
                                
            <div class="tag-items">
               <?php foreach ( $value as $term ): ?>
                    <div class="tag-item">
                        <a href="<?php echo get_term_link( $term );?>"><?php echo $term->name;?></a>
                    </div>
               <?php endforeach;?>
             </div>
         </div>
      <?php endforeach;?>
 </div>

目前显示如下: 标签包装: Tagwrap output

标签列表: 与上面的排序顺序相同,几乎使用相同的php。

【问题讨论】:

嗨 LadyX,您在条款查询中拼错了订单值,它是“ASC”而不是“ACS”,此外,要按字母顺序排序,您必须使用订单值“DESC”。请参阅此相关帖子:wordpress.stackexchange.com/questions/210817/… LadyX,我在下面添加了一个答案,说明如何在保持“空”字母的同时使其工作。让我知道这是否适合您! 【参考方案1】:

对术语进行排序不会对您尝试做的事情产生影响。如果您想包含不在结果中的字母,那么无论结果如何排序,您都不能将结果用于循环,因为它只能循环遍历那里的内容。

相反,我们可以简单地循环字母表并使用字母作为键从您的数组中获取术语。

首先,遍历字母表以显示tag-wrap div 中的字母:

$alphabet = range('A', 'Z');   // 1. use range to get the alphabet

<div class="tag-wrap">
   <ul>
     <?php
     // 2. display the regular alphabet instead of the letters from your results
     foreach ( $alphabet as $letter ) : ?>
         <li class="border-radius">
           <a href="#<?php echo $letter; ?>"><h3><?php echo $letter; ?></h3></a>
         </li>
    <?php endforeach; ?>
   </ul>
</div>

现在我们将再次循环遍历字母表,这次使用字母作为键从您的$term_list 获取结果。如果没有条款,那么您可以显示一条消息,否则您可以像以前一样显示列表。

<div class="tag-list">
    <?php
      // 3. display the results by looping through the alphabet to ensure all letters are included
      foreach ( $alphabet as $letter) : ?>
         <div class="term-row" id="<?php echo $letter; ?>">
            <div class="term-letter">
                <h3><?php echo $letter; ?></h3>
            </div>
                                
            <div class="tag-items">
               <?php
                    // 4. Get the terms for this letter, if there are none show a message
                    $termsforletter = $term_list[$letter];
                    if (empty($terms for letter))  ?>
                         <p>No Results for this letter</p>
                    <?php  
                    else 
                        foreach ( $termsforletter as $term  ): ?>
                            <div class="tag-item">
                                <a href="<?php echo get_term_link( $termsforletter  );?>"><?php echo $term->name;?></a>
                           </div>
                       <?php endforeach;
                     ?>
             </div>
         </div>
      <?php endforeach;?>
 </div>

(注意:此代码未经测试,但大体思路已经存在)

这也意味着您不必担心对数组进行任何排序,因为我们使用字母循环对显示进行排序/

【讨论】:

for 循环不起作用,但我对其进行了一些修改,以达到相同的结果。非常感谢您的帮助。【参考方案2】:

这是基于 FluffyKitten 的答案的工作,只是更改了检查以显示文本,如果没有字母的条款。

<?php
$alphabet = range('A', 'Z'); 

$args = array(
    'taxonomy' => 'post_tag',
    'hide_empty' => false,
    'order' => 'DESC',
    'orderby' => 'slug'
);
$terms = get_terms($args);

   
$term_list = [];    
foreach ( $terms as $term )
    $first_letter = strtoupper($term->name[0]);
    $term_list[$first_letter][] = $term;

unset($term); ?>
                
<div class="tag-wrap">

 <ul>
   <?php foreach ( $alphabet as $letter ) : ?>
     <li>
       <a href="#<?php echo $letter;  ?>"><h3><?php echo $letter;  ?></h3></a>
     </li>
   <?php endforeach; ?>
 </ul>
</div>

<div class="tag-list">
<?php
 foreach ( $alphabet as $letter) : ?>
  <div class="term-row" id="<?php echo $letter; ?>">
    <div class="term-letter">
       <h3><?php echo $letter;?></h3>
    </div>
                    
    <div class="tag-items">
      <?php 
       $termsforletter = $term_list[$letter]; 
       if (empty($termsforletter )): ?>
          <div class="tag-item">
            <p>No topics matching this letter </p>
          </div>
       <?php else:
        foreach ( $termsforletter as $term ): ?>
           <div class="tag-item">
             <a href="<?php echo get_term_link( $term );  ?>"><?php echo  $term->name;  ?></a>
           </div>
                                        
        <?php endforeach;?>
      <?php endif; ?>
    </div>
  </div>
  <?php endforeach; ?>
</div>

【讨论】:

以上是关于按字母顺序显示标签列表,每个字母都有一个部分,包括没有术语的空字母的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义模型类按部分按字母顺序对 tableView 中的数据进行排序?

按数字(最高优先)然后按字母(字母顺序)对对象集合进行排序

在桌子视图的按字母顺序的部分在迅速

PHP:将数据数组拆分为字母顺序

根据字符串属性按字母顺序对对象数组进行排序

显示按字母顺序排列的搜索结果时如何修改行数