Отображение пользовательского типа записи по первой букве с помощью пользовательской таксономии


Я пытаюсь создать страницу на своем веб-сайте WordPress, чтобы отображать все виды продуктов питания через 26 циклов.

Каждый цикл должен содержать букву алфавита, и в верхней части страницы у меня есть ссылки, которые будут ссылаться на поля привязки вокруг циклов.

Итак, я хочу, чтобы отображалось что-то вроде этого:

НАВИГАТОР:

а б в д е...(и так далее)... z

А

Все элементы, начинающиеся с буквы А

В

Все элементы, начинающиеся с буквы B

И так далее..


Прочитав эту тему: Отобразить все сообщения, начинающиеся с данной буквы? Я решил использовать разные термины для букв.

Для этого я создал пользовательский тип записи под названием "waaier" Там у меня есть пользовательская таксономия под названием "waaier_abc" И там разные термины для каждой буквы, называемые "waaier_a", "waaier_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>

У кого-нибудь есть идея для другого цикла, в котором также отображаются термины из определенного типа сообщений ИЛИ для отображения сообщений с определенной первой буквой определенного типа сообщений.

Извините, если мой английский выглядит странно

Author: Community, 2013-10-17

1 answers

Что я могу сказать о вашем коде:

  • 26 циклов действительно много для страницы, эта страница будет загружаться очень медленно, если вы не настроите некоторый кэш
  • Пожалуйста, не используйте query_posts он очень плохо работает при вызове один раз, 26 раз - это ад производительности
  • Если вы настроили таксономию только для отображения этой страницы, вам вообще не нужна эта таксономия

Что я предлагаю:

Выполните только один запрос, используя 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_anchors и fill_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, и вам не нужно настраивать правильную таксономию для почтового письма, все делается автоматически.

 2
Author: gmazzap, 2013-10-17 10:35:01