EDIT REVISIT NO 2
我从没碰过
Transient API, 直到今天我看到@MikeSchinkel回答
this post. 这激励我再次访问这篇文章。经过一些测试,我得出以下结论:
执行时间从约0.07秒减少到约0.002秒
数据库查询时间减少了大约一半
对于瞬态,只执行2个db查询
代码是如何工作的(只讨论从REVISIT):
STEP 1
我们需要保存
$q
对于临时用户,这是保存带有帖子标题的类别列表的值。
STEP 2
我们首先需要检查是否存在瞬态,如果不存在,则创建瞬态。如果瞬态存在,则检索其信息
STEP 3
此信息现在通过
foreach
循环打印包含类别名称和帖子标题的列表。
STEP 4
目前,瞬态将每12小时更新一次。这可以根据您的需要进行设置。然而,每次帖子状态改变时,都需要删除并重新创建瞬态。这可能是从草稿到发布,一篇新文章或一篇被丢弃的文章。要做到这一点,您需要利用
delete_transient
将连接到
transition_post_status
每次帖子状态改变时都会触发
以下是完整的代码:
在您的功能中。php
add_action( \'transition_post_status\', \'publish_new_post\', 10, 3 );
function publish_new_post() {
delete_transient( \'category_list\' );
}
在需要显示列表的模板中
<?php
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 );
}
foreach ($q as $key=>$values) {
echo $key;
echo \'<ul>\';
foreach ($values as $value){
echo \'<li>\' . $value . \'</li>\';
}
echo \'</ul>\';
}
?>
REVISIT我最近提出了一个非常轻量级的解决方案,比其他可能的解决方案快得多。在我的测试站点上,根据Query Monitor 而其他方法给我大约0.35秒的生成时间和50个额外的db查询。
这是我的方法的分解
STEP 1
首先需要使用创建自定义查询
WP_Query
检索所有已发布的帖子
$args = array(
\'posts_per_page\' => -1
);
$query = new WP_Query($args);
$q = array();
while ( $query->have_posts() ) {
}
/* Restore original Post Data */
wp_reset_postdata();
Step 2
使用
get_the_category
, 检索帖子所属的所有类别的列表。
$categories = get_the_category();
foreach ( $categories as $key=>$category ) {
$b = \'<a href="\' . get_category_link( $category ) . \'">\' . $category->name . \'</a>\';
}
STEP 3
为帖子标题和帖子类别分配变量
$a = \'<a href="\'. get_permalink() .\'">\' . get_the_title() .\'</a>\';
以及
$b = \'<a href="\' . get_category_link( $category ) . \'">\' . $category->name . \'</a>\';
STEP 4
将这两个变量组合成一个多维数组
$q[$b][] = $a;
要查看阵列中发生的情况,只需执行
var_dump
?><pre><?php var_dump($q); ?></pre><?php
STEP 5
使用
foreach
循环,创建按类别排序的帖子列表
foreach ($q as $key=>$values) {
echo $key;
echo \'<ul>\';
foreach ($values as $value){
echo \'<li>\' . $value . \'</li>\';
}
echo \'</ul>\';
}
ALL TOGETHER NOW!
这是完整的代码
<?php
$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();
foreach ($q as $key=>$values) {
echo $key;
echo \'<ul>\';
foreach ($values as $value){
echo \'<li>\' . $value . \'</li>\';
}
echo \'</ul>\';
}
?>