自定义搜索带有PRE_GET_POST的自定义帖子元会干扰WP搜索

时间:2016-04-17 作者:Xavier Caliz

我正在使用Divi子主题函数中的pre\\u get\\u posts函数进行自定义帖子元搜索。php文件。问题是,最终查询不仅收集了我的自定义帖子字段(名为“autor”)的结果,还收集了其他字段,如“post\\u title”和“post\\u post”,我没有包括这些字段。

这是结果查询,其中以strong突出显示了棘手的一行:

选择SQL\\u CALC\\u FOUND\\u ROWS ebj\\u posts。ID来自ebj\\u posts内部连接ebj\\u term\\u relationships ON(ebj\\u posts.ID=ebj\\u term\\u relationships.object\\u ID)内部连接ebj\\u postmeta ON(ebj\\u posts.ID=ebj\\u postmeta.post\\u ID)内部连接ebj\\u postmeta AS mt1 ON(ebj\\u posts.ID=mt1.post\\u ID),其中1=1和(ebj\\u term\\u relationships.term\\u taxonomy\\u ID IN(456))AND (((ebj_posts.post_title LIKE \'%Abulafia%\') OR (ebj_posts.post_content LIKE \'%Abulafia%\'))) 和(ebj\\u postmeta.meta\\u key=\'autor\'和((mt1.meta\\u key=\'autor\'和CAST(mt1.meta\\u value为CHAR),如\'\'%Abulafia%\'))和ebj\\u posts。post\\u按ebj\\u posts键入(\'post\',\'page\',\'attachment\',\'project\',\'ref\\u bib\')和((ebj\\u posts.post\\u status=\'publish\'))组。ebj\\U Posteta的ID订单。meta\\u值ASC限制0,30“

正如您所看到的,在post_titlepost_content 字段,这不是预期的。

这一行以粗体显示,参数来自WP>WP includes>query行2196:

$search .= $wpdb->prepare( "{$searchand}(($wpdb->posts.post_title $like_op %s) $andor_op ($wpdb->posts.post_content $like_op %s))", $like, $like );
因为当我在wordpress核心代码中注释这些行时,问题就消失了。

这是我在函数中的代码。php:

function filtra_inici( $query ){
global $wp;
if ( ( is_archive() ) && $query->is_main_query() && !is_admin() ) {
  if ($query->is_search && isset($_GET[\'search-type\']) && $_GET[\'search-type\'] == \'autor\') {
    $query->set( \'post_type\', \'ref_bib\');
    $query->set( \'post_status\', \'publish\');
    $query->set( \'orderby\', \'meta_value\');
    $query->set( \'meta_key\', \'autor\' );
    $query->set( \'order\', \'ASC\' );
    $meta_query = array(\'relation\' => \'AND\');
     array_push( $meta_query, array(
      \'key\' => \'autor\',
      \'value\' => $query->query_vars[\'s\'],
      \'compare\' => \'LIKE\'
     ));
    $query->set( \'meta_query\', $meta_query);
  } 
}// end is_archive
}
谢谢!

3 个回复
SO网友:user5200704

创建另一个筛选器以删除帖子标题和帖子内容删除搜索词如果这对您有帮助,请尝试此操作

add_filter( \'posts_search\', \'custom_post_search_author_do\', 10, 2 );

function custom_post_search_author_do($search, $query ){
  if(  ! empty($search) 
       && $query->is_main_query() 
       && !is_admin() 
       && isset($_GET[\'search-type\'])
       && $_GET[\'search-type\'] == \'autor\'
  )
  $search = \'\';
  return $search;
}

SO网友:Xavier Caliz

已解决

回应@tomjnowell:Yep!你说得对,我没有提供足够的细节和背景,对不起。正如你所看到的,我不习惯在这里发问,英语也不是我的母语。所以谢谢你耐心地帮助我。

我想要的是通过几个post meta进行搜索,并且可以选择通过一个名为ref\\u bib的自定义post类型中的所有post meta加上post\\u标题进行搜索。

你可以在this site 关于the Borgia family (主要是加泰罗尼亚语)。

正如您所注意到的,最初有几种形式:第一种是执行一般搜索(在自定义post meta和post\\u title中),另外四种是其他选项(是的,您是对的:可以简化。我会的)。

实际上,多亏了user5200704,我在这里和那里做了一些研究,最终发现了一些对我来说非常有效的东西(虽然不是完全的、令人兴奋的幸福,我可能会在另一个问题中解释)。

如果有人感兴趣,我得到的是代码。

这是搜索表单(在代码的第一个版本中,每个帖子元都有一个表单,稍后我将使用下拉列表使其更性感):

<form method="get" id="searchform"  class="searchform" action="http://www.elsborja.cat/cat_bib/general/">
<div class="cercadiv">
<input type="text" value="" name="s" id="s" />
<input type="hidden" name="search-type" value="autor" />
<input id="cercabib" class="eb_submit" name="submit" type="submit" value="Cerca" />
</div>
</form>
现在是“functions.php”中的代码:

add_filter(\'pre_get_posts\', \'filtra_inici\', 10, 2);

function filtra_inici( $query )
{

  global $wp;
  if ( ( is_archive() ) && $query->is_main_query() && !is_admin() ) {

if ( strpos(  $wp->query_vars[\'category_name\'], \'revista-borja\' ) !== false ) {
  $query->set( \'orderby\', \'date\');
  $query->set( \'order\', \'ASC\' );
}

if (
  $query->is_search
  && isset($_GET[\'search-type\'])
  && $_GET[\'search-type\'] == \'bibliografia\'
) {
  $query->set( \'post_status\', \'publish\');
  $query->set( \'post_type\', \'ref_bib\');
}

if (
  $query->is_search
  && isset($_GET[\'search-type\'])
  && \'bibliografia\' !== $_GET[\'search-type\']
) {

  $camp = $_GET[\'search-type\'];

  if ($camp == \'general\') {
    $custom_fields = array(\'autor\', \'publicacio\', \'edito\', \'observacions\');
  }else {
    $custom_fields = array( $camp);
  }

  $searchterm = $query->query_vars[\'s\'];
  // we have to remove the "s" parameter from the query, because it will prevent the posts from being found
  $query->query_vars[\'s\'] = "";
  if ($searchterm != "") {
    $meta_query = array(\'relation\' => \'OR\');
    foreach ($custom_fields as $cf) {
      array_push($meta_query, array(
          \'key\' => $cf,
          \'value\' => $searchterm,
          \'compare\' => \'LIKE\'
        ));
    }
    $query->set("meta_query", $meta_query);
    $query->set( \'post_type\', \'ref_bib\');
    $query->set( \'post_status\', \'publish\');
  };
}
}// end is_archive
}
此筛选器修改where子句以添加对post\\u标题的搜索,以防用户希望进行包含所有自定义元和post\\u标题的常规搜索。

add_filter( \'posts_where\', \'titol_posts_where\', 11, 2 );
function titol_posts_where( $where, &$wp_query )
{
  global $wpdb;
 global $wp;
  if ($_GET[\'search-type\'] == \'general\') {
    $where .= \' OR \' . $wpdb->posts . \'.post_title LIKE \\\'\' . esc_sql(   $wpdb->esc_like( $_GET[\'s\'] ) ) . \'%\\\'\';
 str_replace("LIKE", "", $where);
  }
  return $where;
 }
希望这能对某人有所帮助,再次感谢@tomjnewell、@Joel和@user5200704

SO网友:Joel

元查询的参数是meta\\u key,而不仅仅是key(根据https://codex.wordpress.org/Class_Reference/WP_Query)

尝试“meta\\u key”=>“autor”而不是“key”=>“autor”

相关推荐

nothing happen in search form

我想创建搜索表单,但当我搜索时什么都没有发生,这是代码:索引。php: <div class=\"tech-btm\"> <?php get_search_form();?> </div> 搜索表单:<form role=\"search\" method=\"get\" id=\"searchform\" action=\"<?php echo home_url(\'/\')?>\"> &