我昨天确实在写一篇文章(看看吧here) 也遇到了同样的问题。我也是新来的Transient API, 从未实际使用过:-)。
这里的问题是,对于特定的循环,您需要在瞬态之外使用特定的值。您只是存储了错误的值,正因为如此,您得到了这些超负荷的db点击。
为了解释,这里是我提到的答案中的部分代码。我需要创建一个类别列表,其中包含属于这些类别的帖子标题。为此,我运行自定义查询,然后使用$q
创建我的列表
$args = array(
\'posts_per_page\' => -1
);
$query = new WP_Query($args);
$q = array();
while ( $query->have_posts() ) {
$query->the_post();
$a = \'<a href="\'. get_permalink() .\'">\' . get_the_title() .\'</a>\';
$categories = get_the_category();
foreach ( $categories as $key=>$category ) {
$b = \'<a href="\' . get_category_link( $category ) . \'">\' . $category->name . \'</a>\';
}
$q[$b][] = $a; // Create an array with the category names and post titles
}
/* Restore original Post Data */
wp_reset_postdata();
这让我
6 queries in 0.06348 seconds
.
好的,如果你看一下法典中的例子,你应该把你的new WP_Query
导致瞬态。如果我那样做,结果完全是乱七八糟的
<?php
if( false === ( $query = get_transient(\'custom_query\') ) ) {
$args = array(
\'posts_per_page\' => -1
);
$query = new WP_Query($args);
set_transient(\'custom_query\', $query, 60 * MINUTE_IN_SECONDS);
}
$q = array();
while ( $query->have_posts() ) {
$query->the_post();
$a = \'<a href="\'. get_permalink() .\'">\' . get_the_title() .\'</a>\';
$categories = get_the_category();
foreach ( $categories as $key=>$category ) {
$b = \'<a href="\' . get_category_link( $category ) . \'">\' . $category->name . \'</a>\';
}
$q[$b][] = $a; // Create an array with the category names and post titles
}
/* Restore original Post Data */
wp_reset_postdata();
?>
使用上面的代码,我的结果如下所示
31 queries in 0.19141 seconds
. 这需要25次查询,大约需要0.13秒。原因是,对于每一篇帖子,Wordpress都需要重新访问db以检索帖子所属的类别,因为这不会存储在您的transient中。25额外查询是my db中的帖子数量。所以,你看,你存储了错误的信息,实际上浪费了很多资源。我不需要来自
new WP_Query
, 但是q美元的结果/价值
因此,要正确利用瞬态,必须存储所需的正确值。要做到这一点,我需要将我的完整查询添加到瞬态中,以确保它只运行一次,也就是在创建瞬态时。在那之后,自定义查询就不再需要了,而且是多余的,唯一需要存储并且我现在正在寻找的就是值$q
. 因此,这就是如何更改查询以在创建瞬态后删除自定义查询,并仅保存$q
需要注意的是,我沿途更改了临时名称,只是为了测试目的,以显示时间和查询。还要注意,在创建瞬态时,需要使用值(在本例中$q
) 您需要保存
if ( false === ( $q = get_transient( \'category_list\' ) ) ) {
$args = array(
\'posts_per_page\' => -1
);
$query = new WP_Query($args);
$q = array();
while ( $query->have_posts() ) {
$query->the_post();
$a = \'<a href="\'. get_permalink() .\'">\' . get_the_title() .\'</a>\';
$categories = get_the_category();
foreach ( $categories as $key=>$category ) {
$b = \'<a href="\' . get_category_link( $category ) . \'">\' . $category->name . \'</a>\';
}
$q[$b][] = $a; // Create an array with the category names and post titles
}
/* Restore original Post Data */
wp_reset_postdata();
set_transient( \'category_list\', $q, 12 * HOUR_IN_SECONDS );
}
这个给我
2 queries in 0.00195 seconds
. 你看我现在是如何有效地利用瞬变的。
$q
这是一个由许多值组成的数组`现在可以用来创建我的列表,而实现我的目标只需点击2 db
我希望这一切都有意义