web-dev-qa-db-ja.com

Pre_get_postsを使用したカスタム投稿メタのカスタム検索が干渉する WP サーチ

私は自分のDivi子テーマのfunctions.phpファイルのpre_get_posts関数を使ってカスタムの投稿メタ検索を行っています。問題は、最後のクエリが私のカスタム投稿フィールド( 'autor')の結果だけでなく、 'post_title'や 'post_post'のような他のフィールドを集めていないことです。

これが、問題のある行を強調表示したクエリです。

Ebj_posts INNER FROM SQL_CALC_FOUND_ROWS ebj_posts.IDを選択(ebj_posts.ID = mt1.post_id)1 ON MT1 AS ebj_postmetaをJOIN(ebj_posts.ID = ebj_postmeta.post_id)INNER ON ebj_postmetaをJOIN(ebj_posts.ID = ebj_term_relationships.object_id)INNER ON ebj_term_relationshipsをJOIN = 1 AND(ebj_term_relationships.term_taxonomy_id IN(456))AND(((ebj_posts.post_title LIKE '%Abulafia%')OR(ebj_posts.post_content LIKE '%Abulafia %()))AND(ebj_postmeta.meta_key = 'autor' AND((mt1.meta_key = 'autor' ANDキャスト(mt1.meta_value AS CHAR)LIKE '%Abulafia%')) )ebj_posts.post_type IN( 'post'、 'page'、 'attachment'、 'project'、 'ref_bib')AND((ebj_posts.post_status = 'publish'))グループ化ebj_posts.ID注文ebj_postmeta.meta_value ASC LIMIT 0、30 "

ご覧のとおり、 'Abulafia'という単語がpost_titleおよびpost_contentで検索されています。 - )フィールド、これは意図されていません。

AND引数を含む太字のこの行は、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のコアコードの中でこれらの行をコメントすると、問題は消えるからです。

これがfunctions.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
}

ありがとうございます。

1
Xavier Caliz

投稿タイトルと投稿コンテンツを削除するための別のフィルタを作成する

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

解決しました!

@tomjnowellに返信:Yep!あなたは正しいです、私は十分な詳細も文脈も与えていません、申し訳ありません。私がここに質問を投稿することに慣れていないし、あなたが見ることができるように英語も私の母国語ではありません。だから私を助けるためにとても辛抱してくれてありがとう。

欲しいもの

私が意図したのは、いくつかの投稿メタAND、オプションですべての投稿メタPLUS、ref_bibと呼ばれるカスタム投稿タイプのpost_titleで検索することです。

あなたは このサイトBorgiaファミリーについての動作中のことを見ることができます (主にカタロニア語で).

お気づきのとおり、最初はいくつかの形式があります。最初は一般的な検索を実行するもの(カスタムのpost metaとpost_title)で、残りの4つはその他のオプションです(そう、簡単です。単純化できます)。行う)。

実際にuser5200704のおかげで私はあちこちでいくつかの調査をし、そして私が(私はおそらく別の質問で説明するので合計で爽快な幸福ではないけれども)結構うまくいっている何かをついに見つけた。

私が持っているもの

誰かが興味を持った場合には、これがコードです。

これが検索フォームです(コードの最初のバージョンでは各投稿メタごとに1つあります。後で、よりセクシーにするためにドロップダウンを使用します)。

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

このフィルタは、ユーザーがすべてのカスタムメタとpost_titleを含む一般的な検索を実行する場合に備えて、where句を変更してpost_titleの検索を追加します。

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に感謝します

1
Xavier Caliz

メタクエリのパラメータは単にkeyではなくmeta_keyです( https://codex.wordpress.org/Class_Reference/WP_Query に従って)

'key' => 'autor'の代わりに 'meta_key' => 'autor'を試してください。

0
Joel