通过自定义分类按首字母显示自定义邮政类型

时间:2013-10-17 作者:Maartje

我正试图在我的WordPress网站上创建一个页面,通过26个循环显示各种食物。

每个循环都必须循环字母表中的一个字母,在页面顶部我有链接,链接到循环周围的锚定框。

所以我想展示的是这样的:

NAV:

a b c d e。。。(等等)。。。z

A

以字母A开头的所有项目

B

以字母B开头的所有项目

等等

阅读本主题后:Display all posts starting with given letter? 我决定对这些字母使用不同的术语。

为此,我制作了一个名为“waaier”的自定义帖子类型,在那里我有一个名为“waaier\\u abc”的自定义分类法,在那里,每个字母都有不同的术语,分别称为“waaier\\u a”、“waaier\\u b”等等

我认为最合乎逻辑的方法是将26个循环置于彼此下方,因为我希望每个字母也位于不同的div中。

我尝试了这个循环,但它没有显示任何内容,也没有显示else语句。。

<div class="waaier_a_object">
                    <?php query_posts(array(\'post_type\' => \'waaier\', \'waaier_abc\' => $term->waaier_a ) ); ?>
                    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
                    <?php endwhile; else: ?>
                    <p><?php _e(\'Sorry, de letter a bevat nog geen inhoud.\'); ?></p>
                    <?php endif; ?>
                </div>
是否有人有其他循环的想法,也可以显示来自某个帖子类型的术语,或显示带有某个帖子类型的某个首字母的帖子。

抱歉,如果我的英语看起来很奇怪

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

我可以对您的代码说什么:

对于一个页面来说,26个循环确实很多,该页面的加载速度很低,除非您设置了一些缓存。请不要使用query_posts 当调用一次时,它的性能非常糟糕,26次是性能地狱。如果您将分类设置为仅显示此页面,则可以not 需要那种分类法吗?我的建议是:

使用仅执行一个查询WP_Query 例子

$args = array(
   \'post_type\' => \'waaier\',
   \'posts_per_page\' => -1
);
$query = new WP_Query($args);
此查询将返回waaier类型的所有帖子。

之后,您可以开始循环,将所有帖子保存在助手数组中,以字母顺序排列,只需取帖子的第一个字母:

$by_letter = array();
while( $query->have_posts() ) { $query->the_post();
  global $post;
  $letter = substr($post->post_name, 0, 1);
  if ( ! isset($by_letter[$letter]) ) $by_letter[$letter] = array();
  $by_letter[$letter][] = $post;
}
wp_reset_postdata();
完成此循环后,您将获得数组$by_letter 填充按字母排序的帖子,所以您可以循环此数组以显示帖子:

if ( ! empty( $by_letter ) ) {

  ksort($by_letter); // order the array

  // fill the array with letters have no posts
  $by_letter = fill_by_letter_array( $by_letter );

  display_letters_anchors( array_keys( $by_letter ) );

  foreach( $by_letter as $letter => $posts ) {
  ?>
    <div id="waaier_<?php echo $letter; ?>" class="waaier_<?php echo $letter; ?>_object">
    <?php
    if ( ! empty($posts) ) {
      foreach ( $posts as $post ) {
        setup_postdata($post);
        // just an example of post output
        echo \'<p><a href="\' . get_permalink() . \'">\' . get_the_title() . \'</a></p>\';
      }
    } else {
       echo \'<p>\' . __(\'Sorry, de letter a bevat nog geen inhoud.\') . \'</p>\';
    }
    ?>
    </div>
  <?php
  }
  wp_reset_postdata();
}
在这段代码中,我使用了2个函数display_letters_anchorsfill_by_letter_array, 首先显示指向每个字母div的链接,然后填充没有贴子的字母的数组。

功能(可插入functions.php) 应该是这样的:

function display_letters_anchors( $letters ) {
   if ( empty($letters) ) return;
   echo \'<ul class="waaier_letters_list">\';
   foreach ( $letters as $letter ) {
     echo \'<li><a href="#waaier_\' . $letter . \'">\';
     echo strtoupper($letter) . \'</a></li>\';
   }
   echo \'</ul>\';
}

function fill_by_letter_array( $by_letter ) {
  $keys = range(\'a\', \'z\');
  $values = array_fill(0, count($keys), array());
  $empty = array_combine($keys, $values);
  return wp_parse_args( $by_letter, $empty);
}
这更有效:只需一个查询而不是26个查询,并且您不需要为邮件设置正确的分类法,所有操作都是自动完成的。

结束

相关推荐

如何使用wp_set_Object_Terms为帖子设置分层术语

我有一个称为“位置”的分层自定义分类法。父类别是国家名称,子类别是国家下的领土。如何通过编程将这些术语附加到帖子?$country = \'Egypt\'; $territory = \'Hurghada\'; 因此,如果埃及类别不存在,我需要创建它,并且需要在埃及下的子类别中附加$territory。这就是我目前所处的位置:$post_id = 10; $country_term_id = term_exists( $country, \'locations\' );