前言:
在 WordPress
平台上,一旦网站的文章数量突破十万大关,无论服务器配置多么高端,网站加载速度都可能变得迟缓。面对这种情况,网站优化就显得尤为必要。
WordPress
在查询文章列表时,默认会同时查询文章总数。对于文章数量较少的网站,这种默认设置不会造成太大影响。然而,对于拥有大量文章的网站来说,这种查询方式会导致查询速度变慢,影响用户体验。据汇站网的用户反馈,一个拥有四十万篇文章的网站,首页加载可能需要一两分钟,甚至首页和文章页有时会完全无法打开。
WordPress
网站查询速度慢的原因主要在于,WordPress
在查询帖子列表时,默认会查询帖子总数。这主要通过 get_posts
、query_posts
和 WP_Query
这三个方法实现。虽然从 4.6.1 版本开始,get_posts
不再使用 SQL_CALC_FOUND_ROWS
,但 query_posts
和 WP_Query
仍然会使用,因此需要进行优化。
那么,如何有效解决 WordPress
文章过多导致的网站加载慢问题呢?
方法一:完全禁用 SQL_CALC_FOUND_ROWS
。具体操作是,在functions
.php
文件中添加以下代码:
# 汇站网
# https
://www
.huizhanii
.com
/?p
=38847
add_action
('pre_get_posts
', 'wndt_post_filter
');
function
wndt_post_filter
($query
) {
if
(is_admin
() or
!$query
->is_main_query
()) {
return
$query
;
}
// 禁止查询 SQL_CALC_FOUND_ROWS
$query
->set
('no_found_rows
', true
);
}
方法二、如果您还需要查询文章数,请使用更高效的 EXPLAIN
方法代替 SQL_CALC_FOUND_ROWS
,以更高效的方式禁用 SQL_CALC_FOUND_ROWS
。这里我们使用 EXPLAIN
方法。
具体代码如下,将以下的代码放在 functions
.php
文件中。
# 汇站网
# https
://www
.huizhanii
.com
/?p
=38847
if
( ! function_exists
( 'zjck_set_no_found_rows
' ) ) {
/**
* 设置 WP_Query
的 'no_found_rows
' 属性为 true
,禁用 SQL_CALC_FOUND_ROWS
*
* @param
WP_Query
$wp_query
WP_Query
实例
* @return
void
*/
function
zjck_set_no_found_rows
(\WP_Query
$wp_query
)
{
$wp_query
->set
('no_found_rows
', true
);
}
}
add_filter
( 'pre_get_posts
', 'zjck_set_no_found_rows
', 10, 1 );
if
( ! function_exists
( 'zjck_set_found_posts
' ) ) {
/**
* 使用 EXPLAIN
方式重构
*/
function
zjck_set_found_posts
($clauses
, \WP_Query
$wp_query
)
{
// Don
't
proceed
if
it
's
a
singular
page
.
if
($wp_query
->is_singular
()) {
return
$clauses
;
}
global
$wpdb
;
$where
= isset
($clauses
['where
']) ? $clauses
['where
'] : '';
$join
= isset
($clauses
['join
']) ? $clauses
['join
'] : '';
$distinct
= isset
($clauses
['distinct
']) ? $clauses
['distinct
'] : '';
$wp_query
->found_posts
= (int
)$wpdb
->get_row
("EXPLAIN
SELECT
$distinct
* FROM
{$wpdb
->posts
} $join
WHERE
1=1 $where
")->rows
;
$posts_per_page
= (!empty
($wp_query
->query_vars
['posts_per_page
']) ? absint
($wp_query
->query_vars
['posts_per_page
']) : absint
(get_option
('posts_per_page
')));
$wp_query
->max_num_pages
= ceil
($wp_query
->found_posts
/ $posts_per_page
);
return
$clauses
;
}
}
add_filter
( 'posts_clauses
', 'zjck_set_found_posts
', 10, 2 );
转载请注明:汇站网 » WordPress
教程 网站缓慢卡顿优化方法