Wp_admin edit.php速度慢,有很多查询

时间:2012-12-29 作者:Bretticus

我有大约4000个帖子。目前,当我点击所有帖子(edit.php)时,加载大约需要10秒,我显示了大约1000个查询!

大多数看起来像。。。

SELECT t.*, tt.* 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 (\'post_tag\') AND tr.object_id IN (37336) 
ORDER BY t.name ASC
如果我停用Wordpress SEO,我可以将查询数量减半,但页面仍需要大约7秒才能加载。

只是为了好玩,我停用了所有插件,没有显著的性能改进。我已经用我能想到的所有方法调整了MySQL和PHP。问题是查询量过高。

有没有办法调整Wordpress以减少使用量?我试过删除修订版等,娜达。真的需要一些见解。

谢谢

2 个回复
SO网友:Privateer

一种方法是创建一个自定义页面,该页面具有一个自定义页面模板,可以提取所有帖子,并为每个帖子创建适当的管理员url链接。

例如:

<?php
/*
Template Name: View Posts Quickly
*/
if ( !is_user_logged_in() ) {
   # Redirect the user or use wp_die(\'Permission denied\') or throw a 404
} else if ( !current_user_can(\'activate_plugins\') ) {
   # Permission denied
} else {
   $query_args = array(
      \'post_type\' => \'post\',
      \'posts_per_page\' => \'-1\',
      \'post_status\' => array( \'any\' ),
      \'orderby\' => \'title\',
      \'order\' => \'asc\'
   );
   $post_list = new WP_Query( $query_args );
   if ( ! $post_list->have_posts() ) {
      # Tell user no posts found
   } else {
      echo \'<h2>The Post List:</h2><ul>\';
      while ( $post_list->have_posts() ) {
         $current = $post_list->next_post();

         # Modify the below to include any extra data wanted for each item
         echo get_post_edit_link( $current->post_title, \'<li>\', \'</li>\', $current->ID);
      }
      echo \'</ul>\';
   }
}
?>
显然,如果需要的话,上面的内容可以转化为实际的管理页面。当我想对后端的事物有一个非常不同的看法时,我会在自己的网站上进行。

使用上述内容(当然,还可以创建一个私人页面并将模板设置为使用上述模板)将得到一个更干净、更快的列表。

但是由于数据库设计的原因,wordpress帖子的正常显示会使用大量额外查询来显示大量额外数据。db设计提供了很好的灵活性,但有一个折衷之处,就是能够在一个或两个查询中提取大量相关信息。

更好的方法可能是使用manage_*_posts_columns 滤器

SO网友:Privateer

另一个better, 要做到这一点,可以做两件不同的事情:

查找在wordpress SEO中运行这些查询的过滤器并将其删除查看它们收集的数据以显示在帖子列表中,并使用posts\\u join和posts\\u字段过滤器将它们通过各自的查询收集的数据添加到正在运行的查询中以生成帖子列表例如,您显示的查询:

SELECT t.*, tt.* 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 (\'post_tag\') AND tr.object_id IN (37336) 
ORDER BY t.name ASC
这个查询是为了某种目的而收集term\\u分类法和term\\u关系条目(很可能显示哪些帖子对他们做过seo类型的事情)。

如果您明确了要查找的内容,那么您可以提出适当的查询段进行修改,以提取每个帖子所需的内容。

如果您可以这样做,只需在结果列表中为每篇文章添加多个字段,而无需让文章列表为每篇文章返回多个记录,那么您也可以删除它们的显示过滤器,让它从当前文章中简单地提取字段。

这将基本上删除WP SEO插入的所有额外查询,并让您几乎无需额外工作即可获得它们显示的数据(只需从数据库中选择两个额外字段)。

如果他们为每篇文章使用序列化数组,您可能需要执行以下操作:

posts_join

附加如下内容LEFT JOIN (post_meta) ON (post_meta.post_id = post.ID)

posts_fields

附加如下内容(post_meta.meta_value) AS seo_meta

然后删除列上的过滤器,添加您自己的过滤器,只需取消seo\\U元值的序列化并提取适当的数据。

如果它们不使用序列化数组,那么您只需进行一些额外的左连接(如果不存在,则会将seo\\u meta设置为null)和一些额外的字段名。

我实际上在我的一些插件中这样做,并通过以下内容(以及挖掘一些源代码)跟踪了我需要做的所有细节:

Notes:

<如果执行上述操作,请确保在获取相应屏幕的项目列表时,使用is\\u admin()和适当的其他检查来修改仅在管理端的查询

结束

相关推荐

当我从WordPress中的远程MySQL数据库中提取数据时,内置的WordPress功能不工作吗?

在我的一个页面中,我必须从远程mysql数据库获取数据。通过创建$wpdb类的新实例,我们可以连接到远程mysql数据库。$mydb=新wpdb(DB\\U USER2、DB\\U PASSWORD2、DB\\U NAME2、DB\\U HOST2);$post\\u author=$mydb->get\\u row(“从wp\\u users中选择display\\u name,其中ID=1”);上述查询工作正常。但是,当我们使用get\\u the\\u author\\u meta或the\\