WordPress文章過多導(dǎo)致網(wǎng)站慢卡頓優(yōu)化方法,禁用SQL_CALC_FOUND_ROWS

網(wǎng)站建設(shè) html5 百科知道WordPress文章過多導(dǎo)致網(wǎng)站慢卡頓優(yōu)化方法,禁用SQL_CALC_FOUND_ROWS已關(guān)閉評(píng)論377閱讀模式

當(dāng)我們使用WordPress作為程序時(shí),如果WordPress網(wǎng)站的文章數(shù)量超過10萬,即使網(wǎng)站服務(wù)器的配置很強(qiáng)大,網(wǎng)站的打開速度基本上也會(huì)很慢。這時(shí)我們就需要對(duì)網(wǎng)站進(jìn)行優(yōu)化。

這是因?yàn)?WordPress 在查詢文章列表時(shí),默認(rèn)也會(huì)查詢文章數(shù)。這對(duì)于少量的網(wǎng)站數(shù)據(jù)應(yīng)該不會(huì)造成任何問題,但是對(duì)于大量的文章是不可避免的。慢查詢。主機(jī)引用的一位用戶告訴我們,他的網(wǎng)站有40萬篇文章,打開首頁需要一兩分鐘,甚至首頁或文章頁也經(jīng)常打不開。

WordPress網(wǎng)站查詢慢的原因:WordPress在查詢帖子列表時(shí),默認(rèn)也會(huì)查詢帖子數(shù)。使用此方法:get_posts、query_posts 和 WP_Query。get_posts在4.6.1+中沒有使用SQL_CALC_FOUND_ROWS,但是query_posts和WP_Query仍然使用,所以需要優(yōu)化。

那么如何解決WordPress文章過多導(dǎo)致網(wǎng)站慢的問題呢?

方法一:完全禁用SQL_CALC_FOUND_ROWS,將以下的代碼放到functions.php文件中:

add_action('pre_get_posts', 'miliol_post_filter');

function miliol_post_filter($query) {
    // 確保這個(gè)過濾器只在前端的主查詢中應(yīng)用
    if (is_admin() || !$query->is_main_query()) {
        return;
    }

    // 禁用SQL_CALC_FOUND_ROWS
    $query->set('no_found_rows', true);
}

方法二、如果您還需要查詢文章數(shù),請(qǐng)使用更高效的EXPLAIN方法代替SQL_CALC_FOUND_ROWS,以更高效的方式禁用SQL_CALC_FOUND_ROWS。這里我們使用 EXPLAIN 方法。

具體代碼如下,將以下的代碼放在functions.php文件中。

//優(yōu)化數(shù)據(jù)庫慢查詢
if ( ! function_exists( 'miliol_set_no_found_rows' ) ) {
    /**
     * 設(shè)置WP_Query的 'no_found_rows' 屬性為true,禁用SQL_CALC_FOUND_ROWS
     *
     * @param WP_Query $wp_query WP_Query實(shí)例
     * @return void
     */
    function miliol_set_no_found_rows(\WP_Query $wp_query)
    {
        $wp_query->set('no_found_rows', true);
    }
}
add_filter( 'pre_get_posts', 'miliol_set_no_found_rows', 10, 1 );

if ( ! function_exists( 'miliol_set_found_posts' ) ) {
    /**
     * 使用 EXPLAIN 方式重構(gòu)
     */
    function miliol_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_var("
            SELECT COUNT(DISTINCT {$wpdb->prefix}posts.ID)
            FROM {$wpdb->prefix}posts
            $join
            WHERE 1=1 $where
        ");

        $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', 'miliol_set_found_posts', 10, 2 );

 
  • 本文由 米粒在線 發(fā)表于 2024年12月6日22:09:56
  • 轉(zhuǎn)載請(qǐng)務(wù)必保留本文鏈接:http://www.talove520.com/129244.html
網(wǎng)站建設(shè)

openlitespeed+litespeedcache插件,如果卸載了之后,網(wǎng)站還存在緩存文件。怎么辦呢?

/usr/local/lsws/data/cache/就是這個(gè)目錄openlitespeed的服務(wù)器緩存文件夾。 litespeedcache插件,卸載了之后,網(wǎng)站還存在緩存文件,后臺(tái)都沒法...
百科知道

徹底解決AMD顯卡win10開機(jī)黑屏問題

遇上個(gè)AMD R7 350 顯卡 偶爾開機(jī)到了logo之后黑屏,找了各種法子沒解決,看到了這個(gè)辦法。試試看。來自小櫻看科技的公眾號(hào)。這邊做一下記錄避免丟了。謝謝。小櫻的辦公用電...
網(wǎng)站建設(shè)

寶塔面板設(shè)置Docker加速站提示錯(cuò)誤:全局配置文件有誤,請(qǐng)檢查Expecting value:line 1 column 1(char 0)解決方法

寶塔? docker? 修改加速 報(bào)錯(cuò):寶塔 設(shè)置失敗!讀取配置文件失敗:Expecting value: line 1 column 1 (char 0)解決辦法: 打開文件:/etc/d...