对于一个网站,我有两个循环。在相同的字段上循环,这当然不是很好的性能。这就是当前代码的样子。
<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 }} – {% endif %} {{ post.post_title }}">
<p class="image-caption">
{{ item.caption }}
</p>
</div>
{% endfor %}
我无法在for循环中打包这些包装器div或将这些包装器包装在彼此内部。现在我想知道我是否只能使用一个循环并将所有信息放入数组中?然后我读出了两个不需要数据库但循环遍历该数组的for循环。
这是可能的还是Twig足够聪明,可以识别这些for循环是否在同一个字段上并缓存第一个for循环的结果?
答案 0 :(得分:1)
如果post.get_field('work_gallery')
来自Advanced Custom Fields,则您不必担心多个数据库请求。 get_field
将调用acf_get_value
,wp_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 ~ ' – ' ) ~ 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));