Как отображать определенные связанные сообщения с помощью Timber & ACF?

В настоящее время я новичок в Timber.

Вот код:

view.twig

{# mobile related list #}
{% if related %}
<div class="hide-for-large">
  {% include 'project/_related-list.twig' %}
</div>
{% endif %}
{% endblock %}

_related-list.twig

<aside class="related-projects">
  <h2 class="related-projects__header">Related {{plural_post_type|default('Projects')}}</h2>
  <ul>
    {% for post in related %}
    <li class="related-projects__thumb tease--{{post.post_type}} tease tease--caption tease--show-caption-on-hover tease--show-overlay-on-hover tease--has-overlay">
      {% include 'partials/tease.twig' %}
    </li>
    {% endfor %}
  </ul>
</aside>

tease.twig

  <a href="{{post.link}}" class="tease__wrap">
  {% block content %}
    <div class="tease__caption">
      <h3 class="tease__title">
        {{post.title}}
      </h3>
    </div>
    {% if post.get_thumbnail %}
      <img class="tease__thumb b-lazy" data-object-fit="cover" data-pin-nopin="true" data-srcset="{{post.thumbnail.srcset}}"   data-src="{{post.thumbnail.src('large')}}" sizes="(min-width: 64em) 25vw, 100vw" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" />
    {% else %}
      <img class="tease__thumb"  src="{{theme.link}}/assets/img/ph-800x535.png">
    {% endif %}
  {% endblock %}
  </a>

Текущая настройка отображает соответствующий пост в случайном порядке. Как мне изменить это, чтобы отобразить выбранный связанный пост?

образец изображения тестовой публикации


person dev-newbie    schedule 27.04.2020    source источник
comment
Не могли бы вы также показать нам, как выглядит ваш PHP-файл? Особенно та часть, где вы определяете related.   -  person Gchtr    schedule 27.04.2020
comment
Вот код: codehare.io/arABYZ   -  person dev-newbie    schedule 30.04.2020
comment
Круто, это определенно помогает. Было бы лучше, если бы вы также могли включить эту ссылку в свой вопрос (для этого вы можете отредактировать свой вопрос). Не могли бы вы также описать, как ACF играет в этом? В своем вопросе вы упоминаете выбранный связанный пост. Где вы это выбираете? У вас есть поле ACF, где пользователь может выбрать одно или несколько связанных сообщений?   -  person Gchtr    schedule 30.04.2020
comment
Привет, Gchtr, вот ссылка: activemetal.com.au/projects/baker-mckenzie   -  person dev-newbie    schedule 02.05.2020
comment
Да, мы использовали связанную публикацию, они могли выбрать связанную публикацию, но она не отображается, поскольку она получает связанную публикацию только через таксономию. ACF - Поле: imgur.com/s9QblEJ Содержание сообщения: imgur.com/yFnUr1o   -  person dev-newbie    schedule 02.05.2020
comment
@Gchtr, ты все еще сможешь мне помочь?   -  person dev-newbie    schedule 17.05.2020


Ответы (1)


Я не понял разницы между вашим полем specific-related-posts и полем related_posts. Я предполагаю, что по умолчанию вы получаете 3 случайных связанных сообщения, но если в поле ACF установлено любое количество related_posts, вы захотите, чтобы они были включены первыми в указанном порядке.

Сначала я получил массив идентификаторов сообщений из поля related_posts. Если вы выбрали объекты сообщений в качестве возвращаемого значения, я бы выбрал только идентификаторы объектов в качестве возвращаемого значения в настройках группы полей.

$related = $post->meta( 'related_posts' );

А затем мы преобразовываем их в деревянные столбы.

$related_posts = Timber::get_posts( $related );

Затем вы должны построить свой запрос таким образом, чтобы он

  • исключает уже выбранные сообщения.
  • заполняет остальные сообщения случайными сообщениями.
// Run additional query only if we don’t already have enough posts.
if ( count( $related ) < 3 ) {
    $args = array(
        'post_type'      => $post->post_type,
        'posts_per_page' => 3 - count( $related ),
        'orderby'        => 'rand',
        'post__not_in'   => array( $post->ID ),
        'tax_query'      => $tax_query,
    );

    // Append additional posts to already existing Timber posts array.
    $related_posts = array_merge(
        $related_posts,
        Timber::get_posts( $args )
    );
}

$context['related'] = $related_posts;

Теперь мы фактически выполняем два запроса. Во-первых, когда мы конвертируем идентификаторы сообщений из related_posts в сообщения Timber, а затем снова, когда мы получаем случайные сообщения. Обычно мы хотим этого избежать. Вы можете запустить его в одном запросе, используя параметр post__in. Но в вашем случае вы также используете rand для заказа, что может смешивать ваш заказ, выбранный в поле ACF. Если у вас нет проблем с производительностью, я бы не стал выполнять два запроса в данном конкретном случае.

person Gchtr    schedule 18.05.2020
comment
Привет, Gchtr, спасибо за это, я сначала попробую. Я сообщу вам. Спасибо еще раз! - person dev-newbie; 19.05.2020