Вопрос или проблема
С помощью этого цикла я отображаю одиночные записи на архивной странице. Записи сортируются по категории «Банки». В дополнение к этому, как я могу отобразить их в алфавитном порядке? Я пытался использовать WP_Query
, но не могу заставить его работать; он каждый раз ломает мой цикл.
<h3>Банки и кредитные союзы</h3>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post();
if ( in_category( 'Banks' ) ) { ?>
<li>
<a href="https://wordpress.stackexchange.com/questions/210817/<?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
.
Это не лучший код, который я когда-либо писал, но если вы хотите создать список, такой как:
- A
- Америка
- B
- Бразилия
- Багамские Острова
Вы можете использовать..
<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="https://wordpress.stackexchange.com/questions/210817/<?php echo get_the_permalink(); ?>"><?php echo get_the_title(); ?></a></li>
<?php endwhile;?>
</ul>
Как я уже говорил – это не лучший подход.. но вы можете привести его в порядок и работать отсюда 🙂
query_posts
Эта функция полностью переопределит основной запрос и не предназначена для использования плагинами или темами. Его чрезмерно упрощенный подход к изменению основного запроса может быть проблематичным и должен избегаться, где это возможно. В большинстве случаев есть более эффективные варианты изменения основного запроса, такие как действие «pre_get_posts» в WP_Query.
Это не должно использоваться внутри цикла WordPress.
Ответ или решение
Для отображения записей по алфавитному порядку с использованием WordPress, можно воспользоваться классом WP_Query
или функцией get_posts()
. Ваша изначальная реализация использует цикл для отображения записей категории ‘Banks’. Давайте рассмотрим, как можно изменить ваш код, чтобы обеспечить сортировку по алфавиту.
Шаг 1: Создание нового запроса
Сначала вам понадобится создать аргументы для вашего запроса, чтобы упорядочить записи сначала по заголовку (title), а затем указать порядок сортировки. Вы можете выбрать либо восходящий (‘ASC’), либо нисходящий (‘DESC’) порядок. Вот как это можно сделать:
$args = array(
'post_type' => 'post', // Укажите нужный тип записей
'posts_per_page' => -1, // Количество записей; -1 означает все
'orderby' => 'title', // Сортировка по заголовку
'order' => 'ASC', // Сортировка в восходящем порядке
'category_name' => 'Banks' // Фильтрация по категории 'Banks'
);
$query = new WP_Query($args);
Шаг 2: Обновление вашего цикла
Затем вам нужно использовать созданный объект $query
для отображения записей. Вместо стандартного цикла WordPress, вы будете использовать цикл для вашего пользовательского запроса:
<h3>Банки и кредитные союзы</h3>
<ul>
<?php if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>">
<img src="<?php the_field('biller_logo'); ?>" alt="<?php the_field('biller_name'); ?>">
<?php the_field('biller_name'); ?>
</a>
</li>
<?php endwhile; endif; ?>
</ul>
<?php wp_reset_postdata(); ?>
Шаг 3: Использование get_posts()
Если вы хотите избежать изменения глобального запроса WordPress, вы можете использовать функцию get_posts()
:
$posts = get_posts($args);
?>
<h3>Банки и кредитные союзы</h3>
<ul>
<?php if ($posts) : foreach ($posts as $post) : setup_postdata($post); ?>
<li>
<a href="<?php the_permalink(); ?>">
<img src="<?php the_field('biller_logo'); ?>" alt="<?php the_field('biller_name'); ?>">
<?php the_field('biller_name'); ?>
</a>
</li>
<?php endforeach; endif; ?>
</ul>
<?php wp_reset_postdata(); ?>
Уточнения по работе с pre_get_posts
Если вам нужно изменить главный запрос перед его выполнением, вы можете воспользоваться хук pre_get_posts
. Это позволяет вам управлять запросом более гибко и безопасно:
function modify_main_query( $query ) {
if ( is_archive() && $query->is_main_query() ) {
$query->set('orderby', 'title');
$query->set('order', 'ASC');
$query->set('category_name', 'Banks');
}
}
add_action('pre_get_posts', 'modify_main_query');
Итоговая рекомендация
Используйте подходящий метод в зависимости от ваших целей: если вам нужно просто вывести записи на специфической странице без изменения главного запроса, используйте WP_Query
или get_posts()
. Если вы хотите изменять основной запрос во всем приложении, используйте pre_get_posts
. Эти подходы обеспечат, что ваш код соответствует стандартам WordPress, оптимизирован и легко поддерживаем.