我已将这个存档菜单放在一起,但它导致页面加载超慢。
我认为罪魁祸首:
PHP
$years = $wpdb->get_col(
"SELECT DISTINCT YEAR(post_date)
FROM $wpdb->posts
WHERE post_status = 'publish'
AND post_type = 'post'
ORDER BY post_date
DESC");
$months = $wpdb->get_col(
"SELECT DISTINCT MONTH(post_date)
FROM $wpdb->posts
WHERE post_status = 'publish'
AND post_type = 'post'
AND YEAR(post_date) = '".$year."' ORDER BY post_date DESC");
我正在使用这些数据回显日期和帖子计数列表,这种方法有什么问题导致它变慢并且有更好的方法吗?
这个功能的目的是让我显示有一个帖子的年份和月份,所以我自己的小档案边栏。
旨在做类似的事情:
foreach($years as $year){
//..do something
foreach($months as $month) {
//... do something
}
}
目前我有1507个帖子,加载存档页面需要15秒左右。再说一遍,我这样做有什么不对吗?
答案 0 :(得分:0)
作为间接答案,您可能希望查看wp_get_archives()
函数,而不是滚动自己的代码。
要具体回答您的问题,这里的问题是您的第二个查询会在第一个查询返回的每一年被调用一次,然后您可能会在每个月进行另一次查询以确定帖子数量。您应该进行一次查询,一次性获取所有年份,月份和计数。
$dates = $wpdb->get_results( "
SELECT YEAR( post_date ) AS year, MONTH( post_date ) AS month, count(*) as count
FROM $wpdb->posts
WHERE post_type = 'post'
AND post_status = 'publish'
GROUP BY year, month
ORDER BY post_date DESC
" );
然后,您将拥有一个包含year
,month
和count
属性的对象数组,您可以迭代这些属性。
foreach ( $dates as $date ) {
// For example:
echo '<p>' . $date->month . '/' . $date->year . ': ' . $date->count . '</p>';
}
答案 1 :(得分:0)
此方法总是很慢而不是缩放。您对查询没有限制,因此它需要全部运行或运行直到超时。更糟糕但是没有限制地运行2个查询。
无论哪种方式都不好。
您应该使用WordPress的内置存档功能或带有限制和分页的自定义WP_Query。