你有没有注意到,当你把WordPress作为一个程序来使用的时候,文章多了会越来越卡,不优化就不行了。今天给大家分享一下WP的数据库SQL优化方法。根据 草根吧VPS 的经验,大多数 WordPress 网站上的文章数量在数百到数千之间。此时,普通用户不会对网站的打开速度感到任何异常。但是如果WordPress网站的文章数量超过10万,即使网站服务器的配置非常强大,网站的打开速度基本上也会很慢。
这是因为 WordPress 在查询文章列表时,默认也会查询文章数。这在网站数据量较小的情况下不会造成任何问题,但在文章数量很大的情况下,这是不可避免的。慢查询。一位草根吧VPS的用户告诉我们,他的网站有40万篇文章,打开首页需要一两分钟,甚至首页或者文章页也经常打不开。
WordPress网站查询慢的原因:WordPress在查询帖子列表时,默认也会查询帖子数。使用此方法:get_posts、query_posts 和 WP_Query。get_posts在4.6.1+中没有使用SQL_CALC_FOUND_ROWS,但是query_posts和WP_Query还是会用到,所以需要优化。
那么如何解决因 WordPress 文章过多而导致网站慢的问题呢?有两种方法可以解决,优化了WordPress的查询功能,完美解决了这个问题。
方法一:纯代码模式
1,完全禁用 SQL_CALC_FOUND_ROWS,放到functions.php文件中即可
// WordPress文章太多了怎么优化?快速解决WordPress文章过多导致网站卡顿的问题,WordPress文章数量很多导致网站变慢怎么办? // https://vps.caogenba.com.com/66624.html 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); }
2,如果还需要查询文章数,请使用效率更高的EXPLAIN方法,而不是SQL_CALC_FOUND_ROWS 以更有效的方式禁用 SQL_CALC_FOUND_ROWS 的使用,这里我们使用EXPLAIN方法,具体代码如下,放在functions.php文件中即可
// WordPress文章太多了怎么优化?快速解决WordPress文章过多导致网站卡顿的问题,WordPress文章数量很多导致网站变慢怎么办? // https://vps.caogenba.com.com/66624.html 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 );
方法二:插件模块,仅2KB的插件
进入WordPress后台-插件-安装插件-上传插件,安装并激活插件,无需额外设置
下载地址:WP_FastQuery