停止在Foreach循环中重复术语

时间:2015-05-26 作者:Huw Rowlands

我有一个foreach循环,可以打印出使用自定义分类法的自定义帖子。然后,用户可以在每篇文章中添加他们喜欢的任何术语。然后在自定义模板页面上打印出术语列表;并将它们全部链接到过滤器。

我的问题是,当两个职位的任期相同时;它输出/打印两次术语。我如何解决这个问题?

以下是一个临时示例:http://website-test-lab.com/sites/zuludawn/video-archive/

以下是我的整页模板代码:

<?php
// WP_Query arguments
$args = array (
    \'post_type\'          => \'cpt-video-arc\',
    \'posts_per_page\' => \'-1\'
);

// The Query
$query = new WP_Query( $args );
?>

<div class="entry-content units-row group">

    <div class="category-list category-list-video-archive">
                Filter by tags:
                <button class="filter" data-filter="all">Show All</button>

                <?php $terms = array(); ?>

                <?php while ( $query->have_posts() ) : $query->the_post(); ?>

                    <?php $terms_tags = wp_get_post_terms( $query->post->ID, array( \'video-arc-tags-taxonomy\' ) ); ?>

                    <?php foreach ( $terms_tags as $term_tag ) { ?>
                        <?php $terms[$term_tag->slug] = \'<button class="filter" data-filter=".\'.$term_tag->slug.\'">\'.$term_tag->name.\'</button>\'; ?>
                        <?php echo implode($terms,\' \'); ?>
                    <?php } ?>

                <?php endwhile; ?>

    </div><!-- .category-list -->

</div><!-- .entry-content -->

<?php wp_reset_postdata(); ?>

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

我倾向于这样做:

$terms = array();
$terms_tags = wp_get_post_terms( $query->post->ID, array( \'post_tag\' ) ); 
foreach ( $terms_tags as $term_tag ) {
  $terms[$term_tag->slug] = \'<button class="filter" data-filter=".\'.$term_tag->slug.\',">\'.$term_tag->name.\'</button>\';
}
echo implode($terms,\', \');
它利用了PHP不允许重复的数组键这一事实,从而避免了函数调用的开销。

在您的情况下,它应该是这样的(没有所有的PHP标记垃圾邮件):

$query = new WP_Query( $args ); ?>
<div class="entry-content units-row group">
  <div class="category-list category-list-video-archive">
    Filter by tags:
    <button class="filter" data-filter="all">Show All</button><?php 
    $terms = array(); 
    while ( $query->have_posts() ) : 
      $query->the_post();
      $terms_tags = wp_get_post_terms( $query->post->ID, array( \'video-arc-tags-taxonomy\' ) );
      foreach ( $terms_tags as $term_tag ) { 
        $terms[$term_tag->slug] = \'<button class="filter" data-filter=".\'.$term_tag->slug.\'">\'.$term_tag->name.\'</button>\';  
      }
    endwhile; 
    echo implode($terms,\' \'); // this goes outside the while loop ?>
  </div><!-- .category-list -->
</div><!-- .entry-content -->

SO网友:websupporter

这个怎么样:

<?php 
$already_used = array();
foreach ( $terms_tags as $term_tag ) : 
    if( ! in_array( $term_tag, $already_used ): ?>
        <button class="filter" data-filter=".<?php echo $term_tag->slug; ?>"><?php echo $term_tag->name; ?></button>
        <?php 
        $already_used[] = $term_tag; 
    endif;
 endforeach; 
?>
说明:创建一个数组,保存已使用的术语。如果当前术语在此数组中,则不会打印它。否则,它将被打印并放入阵列中。

编辑:您必须将$already_used = array(); 在while之前( $query->have_posts() ) 当然

结束

相关推荐

被锁定在WordPress之外,无法通过PHPMyAdmin重置

我被一个很久没有登录的安装锁定,似乎找不到返回的方法。我尝试了标准的丢失密码对话框,它只是告诉我在单击重置链接时有一个无效的密钥。我已尝试登录以下内容this thread 使用第三方MD5哈希生成器,但仍然一无所获。我已经用两种方法对其进行了测试,可以看出MD5哈希与PHPMyAdmin生成的哈希相同,所以这不是问题所在。这里有没有更险恶的事情?我通过cPanel使用Softaculous更新到Wordpress的最新版本。该网站本身看起来不错,但我只是担心它可能会被某种类型的恶意软件破坏,阻止我登录。