Сделать цикл, отображающий посты в алфавитном порядке.

Вопрос или проблема

С помощью этого цикла я отображаю одиночные записи на архивной странице. Записи сортируются по категории «Банки». В дополнение к этому, как я могу отобразить их в алфавитном порядке? Я пытался использовать 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>&nbsp;</li><li><h3>' . $title_1 . '</h3></li><li>&nbsp;</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, оптимизирован и легко поддерживаем.

Оцените материал
Добавить комментарий

Капча загружается...