Wordpress 自定义元查询搜索在 OR 关系中非常慢

Posted

技术标签:

【中文标题】Wordpress 自定义元查询搜索在 OR 关系中非常慢【英文标题】:Wordpress Custom Meta Query Search is so slow when in OR relation 【发布时间】:2014-06-13 10:46:34 【问题描述】:

我进行了一次搜索,基本上是查询自定义元字段并显示结果。出于某种原因,搜索需要数小时。当我将关系更改为“AND”时效果很好,但是当我将关系更改为“OR”时它就死了。

目前在数据库中我有 5 条记录,所以应该不需要时间。

这是查询

$args = array(
  'post_type' => 'shipping-schedules', 
  'posts_per_page' => 5,
  'post_status' => 'publish',
  'paged' => $paged,
  'meta_query' => array(
  'relation' => 'OR',
    array(
      'key' => 'schedules_port',
      'value' => $sfrom,
      'compare' => 'LIKE'
    ),
    array(
      'key' => 'schedules_port',
      'value' => $sto,
      'compare' => 'LIKE'
    ),
    array(
      'key' => 'schedules_vessel',
      'value' => $svessel,
      'compare' => 'LIKE'
    ),
    array(
      'key' => 'schedules_voyage',
      'value' => $svoyage,
      'compare' => 'LIKE'
    ),
    array(
      'key' => 'schedules_arrival',
      'value' => $sdate_arrival,
      'compare' => '>=',
      'type' => 'NUMERIC'
    ),
    array(
      'key' => 'schedules_departure',
      'value' => $sdate_departure,
      'compare' => '<=',
      'type' => 'NUMERIC'
    )
  )
);

正如您在上面的查询中看到的,这条线 'relation' =&gt; 'AND' 将其更改为 'relation' =&gt; 'OR' 将导致问题面临查询缓慢的问题。

【问题讨论】:

【参考方案1】:

我也发现了这个问题……但问题是我需要对我的特殊情况使用 OR。

在阅读了大量信息后,例如索引 post 元表值(这实际上听起来是个好主意,但我的代码在插件中,所以不能这样做)我找到了一种似乎可以运行相同的查询要快得多。

我不知道为什么,也没有开始在引擎盖下四处寻找,而是使用过滤器 posts_where 并自己修改 WHERE 子句,而不是进行 WP 元查询,并添加自己的参数。.

这是我的代码:

add_filter('posts_where', array($this, 'filter_meta_query_where')); //modify the where clause to filter meta data
add_filter('posts_join' , array($this, 'filter_meta_join')); //join the meta table to the posts query

这是添加元查询的主要功能(我已经为schedules_port添加了条件,您必须按照自己的方式构建其余部分):

function filter_meta_query_where($where = '')

    global $wpdb; 
    global $wp_query;
    global $sf_form_data;

    if(!is_admin())
    
        $where .= " AND (($wpdb->postmeta.meta_key = 'schedules_port' AND ($wpdb->postmeta.meta_value LIKE '%$sfrom%' OR $wpdb->postmeta.meta_value LIKE '%$sto%')))";
    

    return $where;

这是加入的代码

function filter_meta_join($join)

     global $wpdb;

     $join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";

     return $join;

希望对你有帮助

【讨论】:

以上是关于Wordpress 自定义元查询搜索在 OR 关系中非常慢的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress - 过滤搜索查询以排除 postmeta 值

在 wordpress 的管理面板上更改自定义帖子类型的搜索查询

在 Wordpress 中发布帖子并根据自定义字段元填充字段时运行 SQL 函数

Wordpress 自定义 SQL 以获取三个具有给定元值的帖子

Wordpress - 从自定义帖子类型查询第一个和名称

停止显示自定义帖子类型的 wordpress 搜索