首页 > 解决方案 > 如何使用 Timber & ACF 显示特定的相关帖子?

问题描述

我目前是 Timber 的新手。

这是代码:

视图.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>

逗弄.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>

当前设置随机显示相关帖子。如何更改此项以显示所选的相关帖子?

测试帖子的示例图像

标签: twigtimber

解决方案


我不明白你的specific-related-posts领域和related_posts领域之间的区别。我假设默认情况下您会获得 3 个随机相关的帖子,但是当related_posts在 ACF 字段中设置任意数量时,您会希望以特定顺序首先包含它们。

首先,我会从该related_posts字段中获取帖子 ID 数组。如果您已选择帖子对象作为返回值,我会在您的字段组设置中仅选择对象 ID 作为返回值。

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

然后,我们将它们转换为 Timber 帖子。

$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;

现在,我们实际上正在运行两个查询。首先,当我们将帖子 ID 从转换related_posts为 Timber 帖子时,然后当我们获得随机帖子时再次转换。我们通常希望避免这种情况。您可以使用该post__in参数在一个查询中运行它。但在您的情况下,您还rand用于订购,这会混淆您在 ACF 字段中选择的订单。只要您没有遇到性能问题,我就不会在这种特殊情况下运行两个查询。


推荐阅读