繁体   English   中英

停止 WP_Query->get_posts 在类别页面上运行

[英]Stop WP_Query->get_posts from running on a category page

我的一个网站有一个大问题。 我有一个类别存储其他类别。 问题是 WordPress 使用WP_Query->get_posts并获取此主要类别页面上的所有帖子。 即使我删除了里面的所有内容,只留下了the_headerthe_footer它仍然执行查询。 结构是这样的类别>子类别>帖子。 问题是 WordPress 正在对我的子类别中的所有帖子进行查询。

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (13,14,15,24,25,26,27,28,29,102,130,154,256) )

查询比这大得多,加载大约需要 22 秒。

我的代码工作正常,如果我在自定义页面中移动代码,它会在 0.80 中加载,但在 custom_category 页面中会在 22-28 秒内加载。 我想阻止SELECT SQL_CALC_FOUND_ROWS wp_posts.ID在此类别中运行。 我无法更改有关 URL 的任何内容,因为该站点正在生产中并且位置非常好。 需要尽快做一些事情,我没有想法。

我试过这个: https : //wpartisan.me/tutorials/wordpress-database-queries-speed-sql_calc_found_rows但没关系,加载速度仍然相同。

这是我的代码:

<?php
GLOBAL $wpdb;
$subcategorii = $wpdb->get_results("select term_id, name, slug from $wpdb->terms where is_mother_cat = '1' ORDER BY term_id DESC");

// total numar de postari de afisat
$per_page = 28;

// extragem numarul total de postari
$total_rows = count($subcategorii);

// setam numarul total de pagini
$pages = ceil($total_rows / $per_page);

// extragem page curenta
$current_page = (@$_GET['page'] ? @$_GET['page'] : 1);
$current_page = ($total_rows > 0) ? min($pages, $current_page) : 1;

// offset
$start = $current_page * $per_page - $per_page;

// salvam in array doar postarile din page curenta
$subcategorii_array = array_slice($subcategorii, $start, $per_page);

foreach ($subcategorii_array as $subcats) {
    echo '<li class="border-radius-5 box-shadow">';
    //z_taxonomy_image($subcats->term_id, 'thumbnail', array('alt' => $subcats->name));
    echo '<a href="'.get_category_link($subcats->term_id).'"><span>'.$subcats->name.'</span></a>';
    echo '</li>';
}

?>

用我发现的这个函数修复了这个问题。 但又出现了一个。 现在 WP_Term_Query->get_terms() 在该页面上调用所有帖子。 至少快10秒。 有人知道这里发生了什么吗?

SELECT t.*, tt.*
FROM wp_terms AS t
INNER JOIN wp_term_taxonomy AS tt
ON t.term_id = tt.term_id
WHERE tt.taxonomy IN ('category')

解决问题的功能:

/* apply this filter only on relevant to you pages */
    function mb_bail_main_wp_query( $sql, WP_Query $wpQuery ) {
        if ( $wpQuery->is_main_query() && is_category(8133) ) {
            /* prevent SELECT FOUND_ROWS() query*/
            $wpQuery->query_vars['no_found_rows'] = true;
    
            /* prevent post term and meta cache update queries */
            $wpQuery->query_vars['cache_results'] = false;
    
            return false;
        }
        return $sql;
    }
    add_action( 'posts_request', 'mb_bail_main_wp_query', 10, 2 );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM