如何从管理仪表板通过元查询搜索CPT?

时间:2018-10-11 作者:aberkow

我觉得我错过了一些非常明显的东西,但我已经看了,想不出来了。我有一个CPT(request_form) 我需要对元查询(wp\\u posmeta)而不是帖子标题进行搜索。问题是我需要从管理仪表板执行此操作,而我的代码无法工作。我以前在用户端做过类似的搜索,但在管理端没有。我想pre_get_posts 是正确的钩子,但我什么也做不到。

我注意到两件奇怪的事。

  1. meta_query 在中出现两次$query 对象一次在$query->query_vars[\'meta_query\'] 一次$query->meta_query.SAVEQUERIES 在里面wp-config.php 和转储$wpdb->queries, 我根本没有看到我的查询被执行。

    function my_search($query) {
      if (!is_admin()) {
        return;
      }
    
     if ($query->query[\'post_type\'] !== \'request_form\') {
       return;
     }
    
     if (!$query->is_search) {
      return $query;
     }
    
     $search = $query->query_vars[\'s\'];
    
     $meta_query = array(
        \'relation\' => \'OR\',
        array(
          \'key\' => \'request_details\',
          \'value\' => $search,
          \'compare\' => \'LIKE\'
        ),
        array(
          \'key\' => \'request_subject\',
          \'value\' => $search,
          \'compare\' => \'LIKE\'
        )
      );
    
      $query->set(\'meta_query\', $meta_query);
      echo "<pre>";
      var_dump($query);
      echo "</pre>";
    
      return $query;
    }
    add_action(\'pre_get_posts\', \'my_search\');
    
如果我使用sequelpro直接在db中查询以下内容,我会得到与预期完全相同的帖子(抱歉,我知道这不完全相同)。

SELECT * FROM wp_postmeta WHERE meta_value LIKE "%basketball%"
谢谢你的帮助!

1 个回复
最合适的回答,由SO网友:Linda Paiste 整理而成

您可以安装查询监视器插件,以查看执行搜索时执行的实际查询。

我怀疑您遇到的问题是您没有取消设置初始查询变量。您正在添加元查询,但尚未删除s=参数,该参数仅在标题、内容和摘录中搜索关键字。

在下面$query->set(\'meta_query\', $meta_query);, 尝试添加以下任一选项:$query->set(\'s\', \'\'); 将“s”设置为空字符串或$query->__unset(\'s\'); 取消设置。

结束

相关推荐

Slow Query On Search

请注意,我在wordpress搜索中有一个非常慢的查询,使用SHOW FULL PROCESSLIST; 下面是一个查询示例SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND (((wp_posts.post_title LIKE \'%Industreet%\') OR (wp_posts.post_excerpt LIKE \'%Industreet%\') OR (wp_posts.post_content LI