WordPress多种分类法混合查询优化方案

2021-05-22 0 1,841 百度已收录

我们在使用wordpress建站,稀奇是一些CMS类型的站点,多种分类法是常用的,然而WordPress在使用多种分类法夹杂查询的时刻,这个查询语句就庞大了,在分类和文章数目多了之后,速率就堪忧了,以是这里提一种优化方案供参考。

举例:某个案例中,对于默认的除了的category和post_tag,新增了一个名为kind的分类法,注册新分类法的步骤这里就不赘述了,然后我们需要查询出同时归属于categoryID为1,kind的ID为2的文章,通俗的做法:

  1. $args = array( 
  2.   'post_type'=>'post',
  3.   'tax_query'=>array(
  4.     'relation'=>'AND',
  5.     array(
  6.       'taxonomy'=>'category',
  7.       'field'=>'term_id',
  8.       'operator'=>'IN',
  9.       'terms'=>array(1)
  10.     ),
  11.     array(
  12.       'taxonomy'=>'kind',
  13.       'field'=>'term_id',
  14.       'operator'=>'IN',
  15.       'terms'=>array(2),
  16.     )
  17.   )
  18. );
  19. query_posts($args);

就上面这个查询来说,在没有缓存的情形下要执行3次数据库查询,前面两次划分查询对应的分类是否存在,重点是第3次文章查询,由于wordpress分类和文章的对应关系存储wp_term_relationships表中,每篇文章对应每一个分类都有一条纪录,以是查询文章的时刻主要要两次left join这个wp_term_relationships表,一旦数据量多起来,这样的查询就对照慢了,附打印出的查询语句如下。

  1. 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)  LEFT JOIN wp_term_relationships AS tt1 ON (wp_posts.ID = tt1.object_id) WHERE 1=1  AND ( 
  2.   wp_term_relationships.term_taxonomy_id IN (1) 
  3.   AND 
  4.   tt1.term_taxonomy_id IN (2)
  5. ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10

我的解决方案,在wp_posts表中增添一个字段,用来存储器中的一个分类的信息,好比这个案例内里我把kind的ID信息冗余存储在wp_posts表中,然后将查询条件放到wp_posts表中,这样就能提速了。

第一步:在启用主题的时刻,执行sql在wp_posts表中增添kind_id字段,并加上Index索引。(在这个案例中由于客户的分类可以确定是单选,以是kind_id字段的类型就直接用int了,若是你要保留多个分类ID,可以改为varchar类型,不外varchar类型就不别弄索引了)。

  1. //激活主题时执行
  2. function ashu_add_pages() {
  3.   global $pagenow;
  4.   if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) ){
  5.     ashuwp_alter_posts_table();
  6.   }
  7. }
  8. add_action( 'load-themes.php', 'ashu_add_pages' );
  9.  
  10. //修改posts表,增添一列kind_id
  11. function ashuwp_alter_posts_table(){
  12.   global $wpdb;
  13.  
  14.   //判断字段是否已经存在
  15.   $sql1 = "Describe {$wpdb->posts} `kind_id`";
  16.   $kind_id_exist = $wpdb->query($sql1);
  17.  
  18.   if( !$kind_id_exist ){
  19.     //新增列
  20.     $add_column = "ALTER TABLE {$wpdb->posts} ADD COLUMN `kind_id` INT(10) DEFAULT NULL";
  21.     $wpdb->query($add_column);
  22.  
  23.     //添加索引
  24.     $add_index = "ALTER TABLE {$wpdb->posts} ADD INDEX kind_id (`kind_id`)";
  25.     $wpdb->query($add_index);
  26.  
  27.   }
  28.  
  29. }

第二步:宣布文章的时刻,将kind分类的ID信息保留到wp_posts表中的kind_id字段。这里使用set_object_terms钩子,就是在设置分类的时刻用,固然为了阻止后台多选,这里只保留一个ID数据

  1. add_action( 'set_object_terms', 'ashuwp_add_post_kind_id', 10, 6);
  2. function ashuwp_add_post_kind_id( $object_id, $terms, $tt_ids, $taxonomy, $append = false, $old_tt_ids = array() ){
  3.  
  4.   global $wpdb;
  5.   if( $taxonomy=='kind' ){
  6.     $term_id = reset( $tt_ids );
  7.     if( $term_id ){
  8.       $sql = "UPDATE {$wpdb->posts} SET `kind_id`={$term_id}  where `ID`={$object_id}";
  9.       $wpdb->get_results( $sql );
  10.     }
  11.   }
  12.  
  13. }

第三步:我希望在使用WP_Query查询文章时直接传入kind_id参数即可,以是使用posts_where钩子,检测是否有kind_id参数,然后拼接查询语句。

  1. function ashuwp_query_posts_where( $where, $query){
  2.   global $wpdb;
  3.  
  4.   $qv = $query->query_vars;
  5.  
  6.   isset( $qv['kind_id'] ) AND $kind_id = absint($qv['kind_id']) AND $where .= " AND {$wpdb->posts}.kind_id = {$kind_id}";
  7.  
  8.   return $where;
  9.  
  10. }
  11. add_filter( 'posts_where', 'ashuwp_query_posts_where', 10, 2);

第四步:查询文章。最最先那一段查询可以直接改成如下代码即可。

  1. $args = array( 
  2.   'post_type'=>'post',
  3.   'kind_id'=>2, //直接使用kind_id做参数
  4.   'tax_query'=>array(
  5.     array(
  6.       'taxonomy'=>'category',
  7.       'field'=>'term_id',
  8.       'operator'=>'IN',
  9.       'terms'=>array(1)
  10.     )
  11.   )
  12. );
  13. query_posts($args);

好了,就到这里,这里在下只是提供了一种WordPress的查询优化方案,可用此方案自行刷新其他应用。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!3308869544
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理,有奖励!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有猫币奖励和额外收入!

主题镇 WP教程 WordPress多种分类法混合查询优化方案 https://zhutizhen.com/14846.html

永远为用户服务的镇长!

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或联络我们。
查看详情

相关文章