web-dev-qa-db-ja.com

Wp_postmetaのデータを含めて検索する方法

高度なカスタムフィールド を使用して関連情報のさまざまなビットを作成して保存するサイトがあります。これらはメインの一般検索に含まれる必要があり、デフォルトではタイトルとメインのコンテンツのみが検索されます。

私はpostmetaの特定の部分に基づいて検索結果を得ることについてたくさんの情報を見つけました、しかし私はそれに関する問題を抱えています。 postmetaには、検索対象として潜在的に無限の潜在的フィールドがあります。

解決策はpostmetaの中のものか、この正規表現と一致するmeta_keyを持つものを検索することができます:content_section_[0-9]{1,4}_content_.{2,8}

照合するメタキーの例は次のとおりです。

content_section_0_content_title
content_section_0_content_title
content_section_4_content_subtitle
content_section_8_content_text

Postmetaを含むように検索されたフィールドを変更することができるどんな方法でも非常に高く評価されるでしょう。

6
Jodi Warren

プラグインを使用している場合は、 Relevanssi - A Better Search を試してみる価値があります。

標準(無料)バージョンは、検索メタをサポートしています。

2
Dave Romsey

これをあなたのテーマのプラグインまたはfunctions.phpファイルに追加してください。以下の例では検索に 'your_key'が含まれます。配列を繰り返すことですべてのキーを含めることができます。

関数me_search_query($ query){
 if($ query-> is_search){
 $ meta_query_args = array(
 array(
 'key '=>' your_key '、
' value '=> $ query-> query_vars [' s '] =' '、
'比較 '=>' LIKE '、
 )、
]; 
 $ query-> set( 'meta_query'、$ meta_query_args); 
}; 
} 
 add_filter( 'pre_get_posts '、' me_search_query '); 
10
Ahmed

この機能は、WP 4.8.3セキュリティアップデート後も機能するはずです。

使用法:

// Do this in functions.php

add_meta_field_to_search_query('right_data');
add_meta_field_to_search_query('extra_search_terms');

実装:

/* ADD META FIELD TO SEARCH QUERY */

function add_meta_field_to_search_query($field){
  if(isset($GLOBALS['added_meta_field_to_search_query'])){
    $GLOBALS['added_meta_field_to_search_query'][] = '\'' . $field . '\'';

    return;
  }

  $GLOBALS['added_meta_field_to_search_query'] = array();
  $GLOBALS['added_meta_field_to_search_query'][] = '\'' . $field . '\'';

  add_filter('posts_join', function($join){
      global $wpdb;

      if (is_search()){    
          $join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
      }

      return $join;
  });

  add_filter('posts_groupby', function($groupby){
      global $wpdb;

      if (is_search()) {    
          $groupby = "$wpdb->posts.ID";
      }

      return $groupby;
  });

  add_filter('posts_search', function($search_sql){
      global $wpdb;

      $search_terms = get_query_var('search_terms');

      if(!empty($search_terms)){
        foreach ($search_terms as $search_term){
            $old_or = "OR ({$wpdb->posts}.post_content LIKE '{$wpdb->placeholder_escape()}{$search_term}{$wpdb->placeholder_escape()}')";
            $new_or = $old_or . " OR ({$wpdb->postmeta}.meta_value LIKE '{$wpdb->placeholder_escape()}{$search_term}{$wpdb->placeholder_escape()}' AND {$wpdb->postmeta}.meta_key IN (" . implode(', ', $GLOBALS['added_meta_field_to_search_query']) . "))";
            $search_sql = str_replace($old_or, $new_or, $search_sql);
        }
      }

      $search_sql = str_replace( " ORDER BY ", " GROUP BY $wpdb->posts.ID ORDER BY ", $search_sql );

      return $search_sql;
  });
}

何人かの人々がこれをさまざまな方法で行っています。

http://websmartdesign.nz/searching-structured-post-data-with-wordpress/https://adambalee.com/search-wordpress-by-custom-fields-without-a-plugin/

5
user67624

これは改良されたAhmedの答えです:

function me_search_query( $query ) {
  if ( $query->is_search ) {
    $meta_query_args = array(
      array(
        'key' => 'your_key',
        'value' => $query->query_vars['s'],
        'compare' => 'LIKE',
      ),
    );
    $query->set('meta_query', $meta_query_args);
    add_filter( 'get_meta_sql', 'me_replace_and_with_or' );
  };
}

function me_replace_and_with_or( $sql ) {
    if ( 1 === strpos( $sql['where'], 'AND' ) ) {
        $sql['where'] = substr( $sql['where'], 4 );
        $sql['where'] = ' OR ' . $sql['where'];
    }

    //make sure that this filter will fire only once for the meta query
    remove_filter( 'get_meta_sql', 'me_replace_and_with_or' );
    return $sql;
}

add_filter( 'pre_get_posts', 'me_search_query');

問題は、WordPressが "AND"演算子を使ってメタクエリを生成し、タイトルANDメタ、またはコンテンツANDメタの両方の場所に検索文字列がある投稿のみが表示されることです。そのため、 "AND"を "OR"に変更するための追加のフィルタを作成する必要があります(それから他のものを壊さないようにそのフィルタを削除します)。

0

よくわかりませんが、デフォルトの検索用にすべてのカスタムフィールドのキー/値を取得するには、 wpdb を使用したデータベース呼び出しが必要です。

Goto10以外の代替プラグインは、はるかに単純な解決策です。 すべて検索WPカスタムフィールド検索

0
Wyck