我编写了代码来获取某些标记,然后显示具有这些标记的产品。
代码如下:
$tag_string = \'\';
for ($i = 0; $i < 8; $i++) {
for ($j = 0; $j < 8; $j++) {
$tag_to_use = get_post_meta($post->ID, \'_tag_to_use_\'.$i.\'_\'.$j, true);
$tag_string = $tag_to_use ? $tag_string .= $tag_to_use . \',\' : $tag_string .= \'\';
}
}
if ( substr( $tag_string, -1) == \',\' ) {
$tag_string = rtrim( $tag_string, \',\' );
}
echo do_shortcode( \'[products tag="\' . $tag_string . \'"]\' );
}
当我运行th代码时,页面加载速度很慢。
当我更改此选项时:
echo do_shortcode( \'[products tag="\' . $tag_string . \'"]\' );
为此:
echo do_shortcode( \'[products tag="test,test1"]\' );
页面加载速度很快。
为什么会发生这种情况,我该如何解决?如果需要更多信息,请告诉我,我会更新问题。
谢谢
SO网友:Antti Koskinen
我不确定这是否是问题的根源,但我注意到的是,您的代码最终会调用get_post_meta
同一篇文章有很多次(是的,8个循环中有64个循环)。
也许在for循环之前,您可以只获得一次所有的post meta。然后在循环内使用isset()
或! empty()
检查数据是否存在。
沿着这些路线,
$post_meta = get_post_meta($post->ID); // This returns an array with all the data in position 0, if I remember correctly
for ($i = 0; $i < 8; $i++) {
for ($j = 0; $j < 8; $j++) {
if ( isset( $post_meta[0][\'_tag_to_use_\'.$i.\'_\'.$j] ) ) {
$tag_to_use = $post_meta[0][\'_tag_to_use_\'.$i.\'_\'.$j];
// The meta value might be in a array with the position 0, var_dump $tag_to_use to see if this is the case
// $tag_to_use = $post_meta[0][\'_tag_to_use_\'.$i.\'_\'.$j][0];
$tag_string = $tag_to_use ? $tag_string .= $tag_to_use . \',\' : $tag_string .= \'\';
}
}
}
使用
var_dump
检查数组索引是否正确,以及
maybe_unserialize()
元数据(如果需要)。
我不知道这是否只是broscience和一厢情愿的想法,但也许值得一试。你当然可以使用microtime
要大致了解一下,如果上面的循环比原始循环快。