0

我正在尝试建立我的分类法的字母索引。我正在提取该术语的第一个字母并将其显示在页面上。但是,我只想显示第一个字母,如果它是一个新字母。这样我就可以将所有 a 组合在一起,然后将 b 组合在一起,依此类推。我想我可以使用帖子计数来做到这一点,但它只适用于第一个和第二个帖子。任何其他帖子都会输出第一个字母。任何帮助将不胜感激谢谢!

$post_type = 'book';

// Get all the taxonomies for this post type
$taxonomies = get_object_taxonomies( array( 'post_type' => $post_type ) 
);

foreach( $taxonomies as $taxonomy ) :

 // Gets every "category" (term) in this taxonomy to get the respective 
    posts

    $terms = get_terms( $taxonomy );
    $count = 0;

    foreach( $terms as $term ) :
            $count++;
    $current_letter = '';
    if ($count == 1) :
    $title_letter1 = strtoupper(substr($term->name,0,1));
    if ($title_letter1 != $current_letter) {
    echo "<h3>$title_letter1</h3>";
    $current_letter = $title_letter1;
    }
    ?>
    <?php echo $term->name; ?>

    <?php elseif ($count >= 2) :
    $title_letter2 = strtoupper(substr($term->name,0,1));
    if ($title_letter2 != $title_letter1 and $title_letter2 != 
    $current_letter ) {
    echo "<h2>$title_letter2 </h2>";
    $current_letter = $title_letter2;
    }?>
    <?php echo $term->name; ?></div>

   <?php else : ?>
   <?php endif; ?>
4

1 回答 1

0

主要问题是您正在$current_letter为每个新术语重置,因此当您尝试在这一行中检查它时,您会失去价值。您需要将其移到 foreach 循环之外 - 请参见下面的代码。

其余代码可能正在工作,但很难说清楚,尤其是if ($title_letter2 != $title_letter1 and $title_letter2 != $current_letter )条件检查。只是关于编写代码以便更容易调试的提示:基本上越少越好:-) 因为它更容易更改和调试,因为出错的事情更少!

您可以简化代码以删除引入额外检查需要的重复和不必要的变量:

foreach( $taxonomies as $taxonomy ) :

    $terms = get_terms( $taxonomy );
    $count = 0;
    $current_letter = ''; // move this outside of the loop so you don't reset it every time

    foreach( $terms as $term )
        $count++;

        // you need to do this regardless of the count, so just do it once here
        $title_letter = strtoupper(substr($term->name,0,1));

        if ($count == 1):
            if ($title_letter != $current_letter) 
                echo "<h3>$title_letter</h3>";

        elseif ($count >= 2):
            if ($title_letter != $current_letter ) 
                echo "<h2>$title_letter </h2>";
        endif;

        // you need to do this regardless of the count, so just do it once here
        $current_letter = $title_letter;
        echo $term->name;

    endforeach;

endforeach;

笔记:

  • 您也不需要 2 个单独的变量作为字母 - 事实上,包括第二个变量意味着您必须在if语句中添加额外的检查 count >=2
  • 不重复你正在做的事情也是一个很好的做法(它在编程中称为DRY原则 - 不要重复你自己)。例如,count==1and下的代码count >=2除了显示字母的方式外,所做的事情完全相同。

我希望这听起来不像我在批评你现有的代码,因为我不是,但我需要简化它只是为了看看有什么问题,而且当需要更少的代码来做一样!

养成使用DRY & KISS 软件原则 原则的习惯可能会帮助您(或我们!)解决您可能发布的任何未来问题。

希望这可以帮助 :)

于 2017-09-04T19:34:08.280 回答