在OR关系中,Wordpress自定义元查询搜索速度很慢

时间:2014-04-28 02:50:10

标签: php mysql sql wordpress

我做了一个基本上查询自定义元字段并显示结果的搜索。出于某种原因,搜索需要无休止的时间。当我将关系更改为" 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' => 'AND'将其更改为'relation' => 'OR'会导致问题面临缓慢查询。

1 个答案:

答案 0 :(得分:1)

我也发现了这个问题......但问题是我需要在我的特定情况下使用OR。

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

我不知道为什么,并且还没有开始讨论,但是不使用WP元查询而是使用过滤器posts_where并自己修改WHERE子句添加自己的参数。

这是我的代码:

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;
}

希望有所帮助