重复使用Twig循环

时间:2016-07-04 22:10:12

标签: wordpress for-loop twig

对于一个网站,我有两个循环。在相同的字段上循环,这当然不是很好的性能。这就是当前代码的样子。

<div id="slider-overview">
    {% for item in post.get_field('work_gallery') %}
      <div class="slider-overview_index-link cell" data-index="{{ loop.index0 }}">
        <img src="{{ TimberImage(item).src|resize(180) }}" data-index="{{ loop.index0 }}" alt="{{ post.post_title}} | kiosk">
      </div>
    {% endfor %}
  </div>

<div id="slider">

{% for item in post.get_field('work_gallery') %}

  <div class="img-slide cell">
    <img class=""
      src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
      data-flickity-lazyload="{{ TimberImage(item).src|resize(1800) }}" alt="{% if item.caption %} {{ item.caption }} &ndash; {% endif %} {{ post.post_title }}">
      <p class="image-caption">
        {{ item.caption }}
      </p>
  </div>

{% endfor %}

我无法在for循环中打包这些包装器div或将这些包装器包装在彼此内部。现在我想知道我是否只能使用一个循环并将所有信息放入数组中?然后我读出了两个不需要数据库但循环遍历该数组的for循环。

这是可能的还是Twig足够聪明,可以识别这些for循环是否在同一个字段上并缓存第一个for循环的结果?

1 个答案:

答案 0 :(得分:1)

如果post.get_field('work_gallery')来自Advanced Custom Fields,则您不必担心多个数据库请求。 get_field将调用acf_get_valuewp_cache_get然后使用$cache = wp_cache_get($cache_slug, 'acf', false, $found); if( $found ) return $cache; 检查Wordpress缓存,并仅加载新实例,如果该元素之前没有可用:

{% set _temp_first = '' %}
{% set _temp_second = '' %}

{% for item in post.get_field('work_gallery') %}
  {% set _temp_first = _temp_first ~ '
    <div class="slider-overview_index-link cell" data-index="' ~ loop.index0 ~ '">
      <img src="' ~ TimberImage(item).src|resize(180) ~ '" data-index="' ~ loop.index0 ~ '" alt="' ~ post.post_title ~ ' | kiosk">
    </div>
  ' %}

  {% set _temp_second = _temp_second ~ '
    <div class="img-slide cell">
      <img class="" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
           data-flickity-lazyload="' ~ TimberImage(item).src|resize(1800) ~ '"
           alt="' ~  ( item.caption ? item.caption ~ ' &ndash; ' ) ~ post.post_title ~ '">
      <p class="image-caption">' ~ item.caption ~ '</p>
    </div>
  ' %}
{% endfor %}

<div id="slider-overview">
    {{ _temp_first|raw }}
</div>

<div id="slider">
    {{ _temp_second|raw }}
</div>

请参阅:advanced-custom-fields-pro/api/api-value.php

多次运行几个项目也不会出现性能问题。您似乎正在使用Flickity构建滑块,这可能没有那么多元素。

如果您仍然担心第二个循环,您可以在一个循环中创建内容,将其存储在临时变量中并将其输出到需要的位置。 但是,这会降低源代码的可维护性和可读性,并且它是否会提高当前解决方案的性能存在疑问。

var client = BatchClient.Open(GetCloudSharedKeyCredentials(primary));
client.Pooloperations.EnableAutoScale(poolName, formula, TimeSpan.FromMinutes(5));