Отображение записей в алфавитном порядке в цикле WordPress
С помощью этого цикла я отображаю отдельные записи на странице архива. Записи сортируются по категории 'Banks'. Как дополнительно можно отобразить их в алфавитном порядке? Я пробовал использовать WP_Query
, но не могу заставить его работать; каждый раз он ломает мой цикл.
<h3>Банки и кредитные союзы</h3>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post();
if ( in_category( 'Banks' ) ) { ?>
<li>
<a href="<?php the_permalink() ?>">
<img src="<?php the_field( 'biller_logo' )?>">
<?php the_field( 'biller_name' ) ?>
</a>
</li>
<?php }
endwhile; endif; ?>
</ul>
Для отображения записей в обратном алфавитном порядке добавьте это в массив args
(взято из WP Codex)
'orderby' => 'title',
'order' => 'DESC',
Для отображения записей в прямом алфавитном порядке просто замените DESC
на ASC
.
Полный код будет выглядеть так:
$args = array(
'orderby' => 'title',
'order' => 'DESC',
);
$query = new WP_Query( $args );
Параметры сортировки WP_Query
Либо, если вы не хотите изменять основной цикл, используйте get_posts
. WP_Query изменяет основной цикл, модифицируя переменные глобального объекта $wp_query. В то время как get_posts просто создает новый объект WP_Query, не влияя на основной цикл. Используется аналогично, но вместо $query = new WP_Query( $args );
нужно написать что-то вроде $query = get_posts( $args );
.
Если вам нужно изменить основной запрос до его выполнения, вы можете использовать хук pre_get_posts.

из вопроса неясно, является ли это дополнительным запросом - pre_get_posts
был бы более уместен в случае основного запроса, хотя параметры, которые вы бы установили, были бы теми же.

Не самый лучший код, который я когда-либо писал, но если вам нужно создать список вроде:
- A
- America
- B
- Brazil
- Bahamas
Вы можете использовать...
<ul>
<?php
query_posts(array(
'post_type' => 'franchise',
'showposts' => 100,
'orderby'=>'title','order'=>'ASC'
) );
$title_2 = 'A';
?>
<?php while (have_posts()) : the_post(); ?>
<?php
$title = get_the_title();
$title_1 = $title[0];
if ($title_1 !== $title_2){
echo '<li> </li><li><h3>' . $title_1 . '</h3></li><li> </li>';
$title_2 = $title_1;
}
?>
<li><a href="<?php echo get_the_permalink(); ?>"><?php echo get_the_title(); ?></a></li>
<?php endwhile;?>
</ul>
Как я уже сказал - не лучшая практика.. но вы можете привести в порядок и доработать этот код :)

query_posts
Эта функция полностью переопределяет основной запрос и не предназначена для использования в плагинах или темах. Её чрезмерно упрощённый подход к изменению основного запроса может вызвать проблемы, и по возможности его следует избегать. В большинстве случаев существуют более эффективные и производительные способы изменения основного запроса, например, через действие pre_get_posts
в WP_Query
. Эту функцию нельзя использовать внутри цикла WordPress (WordPress Loop).

обратите внимание, что если вы хотите изменить запрос, то это нужно делать через фильтр pre_get_posts
, иначе query_posts
удваивает количество запросов и ломает пагинацию без дополнительных исправлений. Если вы всё же настаиваете на её использовании, вам необходимо очистить запрос после цикла с помощью wp_reset_query()
, иначе всё после цикла будет использовать неправильную запись
