问题描述

我创建了一个具有自定义分类法的自定义帖子类型。我有大约 1500 个帖子,所有这些都被分配到某种分类术语中,有些被分配到 200 多个术语。

我注意到,从仪表板,查看自定义帖子类型需要非常长的时间,大部分时间会导致 504 网关 Time-Out 。

从 front-end 查询这些帖子很好,我没有问题。

据我了解,当仪表板正在尝试查看这些自定义帖子类型时,它会尝试将所有分配给每个帖子的信息显示出来。

我有这个 WP 安装集,以便能够使用尽可能多的内存 (memory_limit = -1),正如我在研究,有人说可能是内存相关的。

有什么我可以做的来增加这个查询的性能吗?可能不会加载一个帖子的所有分类术语关系,直到你编辑这个帖子?

WP_MEMORY_LIMIT 从 1Gb 增加到 2Gb 时发生错误:

WordPress database error: [MySQL client ran out of memory]
SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('locations') AND tr.object_id IN

WordPress database error: [Lost connection to MySQL server during query]
SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN

WordPress database error: [MySQL server has gone away]
SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month FROM wp_posts WHERE post_type = 'services' ORDER BY post_date DESC

最佳解决方案

CPT 和分类术语是通过插件创建的。我可以通过将以下内容添加到我的插件来减少查询:

add_action( 'pre_get_posts', 'nwtd_lpfs_custom_admin_query' );
function nwtd_lpfs_custom_admin_query( $query ) {
    if( !is_admin() && !$query->is_main_query() ) {
         return;
     }
     if( is_post_type_archive( 'services' ) ) {
          $query->set('no_found_rows', 1 );
          $query->set('update_post_meta_cache', 0 );
          $query->set('update_post_term_cache', 0 );
     }
}

截至目前,我有 700 多个职位与 1500 多个分类术语相关,一切都很好。这些帖子几乎瞬间出现。

**我没有写这段代码。有人与我直接合作,谁不是 WordPress Answers 社区的一部分,提供了代码 – 也许它可以帮助别人,或者别人可以扩展它,使其更有效率。 **

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。