Timber / Twig: страница архива категории не сортируется

У меня есть шаблон архива категории CPT ("место"), в котором я хотел бы отображать все связанные сообщения в альфа-порядке. Следующее в основном работает - я получаю описание категории и фотографии (данные ACF) и список сообщений, связанных с конкретной категорией, но сортировка не работает.

PHP:

$context = Timber::get_context();

$term = new TimberTerm();
$context['current_cat'] = $term;

$templates = array( 'category.twig', 'archive.twig', 'index.twig' );
Timber::render( $templates, $context );

Ветка:

<section class="places ">
    <div class="places-list">
            <h3>Places in: {{current_cat.name}}</h3>
            <div class="places-container">
                <ul>
                {% for post in current_cat.posts(-1, '')|sort %}
                    <li id="wpgmza_marker_{{post.get_field('map_marker_id')}}" mid="{{post.get_field('map_marker_id')}}" mapid="1" class="wpgmaps_blist_row">
                        <div>{{post.title}}</div>
                    </li>
                {% endfor %}
                </ul>

Спасибо!


person Al Avery    schedule 27.03.2018    source источник


Ответы (2)


Попробуйте вместо этого (замените первые пять строк кода выше):

$args = new WP_Query( array(
 'posts_per_page' => -1,
 'orderby' => 'title',
 'order' => 'ASC',
) );
person Richard Zack    schedule 28.03.2018
comment
Спасибо, Роберт. К сожалению, новый WP_Query, похоже, не влияет на список сообщений. Исходный код, который я опубликовал, тоже не изменился. то есть изменение posts_per_page на что-то вроде 3 не повлияло. - person Al Avery; 30.03.2018

Что касается фильтра сортировки Twig и вашего случая, я подозреваю, что два вещи: 1. Поскольку порядок не определен, по умолчанию используется ASC, и, возможно, результаты вашего запроса уже такие. 2. Вы явно не указываете, по чему сортировать, и я могу представить, что почтовый запрос - это не простой список.

Альтернативный вариант: сортировка по запросу

Хотя фильтр сортировки Twig удобен и может работать в некоторых случаях, лучше всего определить сортировку в исходном запросе PHP вместе с другими свойствами запроса. Это дает вам полный контроль и возможность использовать переменные, передаваемые между страницами через GET или POST.

Ниже работает для меня:

archive.php

$templates = array( 'pages/archive.twig', 'pages/index.twig' );

if ( ! isset( $paged ) || ! $paged ) {
    $paged = 1;
}

$context = Timber::context();

$args = array(
    'posts_per_page' => 10,
    'paged'          => $paged,
    'post_type' => get_post_type(),

    // Ordering option 1: based on regular field
    // 'orderby' => 'desc',
    // 'order'   => title,

    // Ordering option 2: based on ACF field
    'meta_key' => 'my_custom_field',
    'orderby'  => array('meta_value' => 'DESC'),
);

$context['title'] = 'Archive';

if ( is_tag() ) {
    $context['title'] = single_tag_title( '', false );
} elseif ( is_category() ) {
    $context['title'] = single_cat_title( '', false );
    array_unshift( $templates, 'pages/archive-' . get_query_var( 'cat' ) . '.twig' );
} elseif ( is_post_type_archive() ) {
    $context['title'] = post_type_archive_title('', false );
    array_unshift( $templates, 'pages/archive-' . get_post_type() . '.twig' );
}

$context['posts'] = new \Timber\PostQuery($args);

Timber::render( $templates, $context );

archive-book.twig (например)

{% extends 'layouts/base.twig' %}

{% block content %}

    {% include 'partials/page-controls.twig' %}

    <div>    
        {% for post in posts %}
            <div>
                {% include 'partials/post-tease-card.twig' %}
            </div>
        {% endfor %}    
    </div>

    {% include 'partials/pagination.twig' %}

{% endblock %}
person MarsAndBack    schedule 28.11.2019