Отображение записей в алфавитном порядке в цикле WordPress

4 дек. 2015 г., 21:33:32
Просмотры: 47.1K
Голосов: 8

С помощью этого цикла я отображаю отдельные записи на странице архива. Записи сортируются по категории '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>
1
Комментарии

какая страница архива? это основной запрос или вторичный?

Milo Milo
4 дек. 2015 г. 22:16:29
Все ответы на вопрос 2
2
17

Для отображения записей в обратном алфавитном порядке добавьте это в массив 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.

4 дек. 2015 г. 22:33:08
Комментарии

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

Milo Milo
5 дек. 2015 г. 00:23:42

действительно, но просто get_posts было бы проще. Я обновил свой ответ, добавив get_posts.

thebigtine thebigtine
5 дек. 2015 г. 01:09:05
2

Не самый лучший код, который я когда-либо писал, но если вам нужно создать список вроде:

  • 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>&nbsp;</li><li><h3>' . $title_1 . '</h3></li><li>&nbsp;</li>';
                                        $title_2 = $title_1;
                                    }
                                ?>                              
                                    <li><a href="<?php echo get_the_permalink(); ?>"><?php echo get_the_title(); ?></a></li>
                                <?php endwhile;?>
                            </ul>

Как я уже сказал - не лучшая практика.. но вы можете привести в порядок и доработать этот код :)

2 апр. 2018 г. 18:09:56
Комментарии

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

Amit P Amit P
18 окт. 2024 г. 10:27:22

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

Tom J Nowell Tom J Nowell
24 окт. 2024 г. 18:56:36