Отображение пользовательского типа записи по первой букве с помощью пользовательской таксономии
Я пытаюсь создать страницу на своем веб-сайте 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>
У кого-нибудь есть идея для другого цикла, в котором также отображаются термины из определенного типа сообщений ИЛИ для отображения сообщений с определенной первой буквой определенного типа сообщений.
Извините, если мой английский выглядит странно
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, и вам не нужно настраивать правильную таксономию для почтового письма, все делается автоматически.