• 解決済 d.w.c

    (@dwc-1)


    カスタムフィールドを検索対象に含めるを参考に、functions.phpに下記コードを追加してカスタムフィールドの値を検索対象にしました。

    /**
     * カスタムフィールドを検索対象に含めます。(「-キーワード」のようなNOT検索にも対応します)
     */
    function posts_search_custom_fields( $orig_search, $query ) {
    	if ( $query->is_search() && $query->is_main_query() ) {
    		// 4.4のWP_Query::parse_search()の処理を流用しています。(検索語の分割処理などはすでにquery_vars上にセット済のため省きます)
    		global $wpdb;
    		$q = $query->query_vars;
    		$n = ! empty( $q['exact'] ) ? '' : '%';
    		$searchand = '';
    
    		foreach ( $q['search_terms'] as $term ) {
    			$include = '-' !== substr( $term, 0, 1 );
    			if ( $include ) {
    				$like_op  = 'LIKE';
    				$andor_op = 'OR';
    			} else {
    				$like_op  = 'NOT LIKE';
    				$andor_op = 'AND';
    				$term     = substr( $term, 1 );
    			}
    			$like = $n . $wpdb->esc_like( $term ) . $n;
    			// カスタムフィールド用の検索条件を追加します。
    			if( !isset( $search )){ $search = ""; }
    			$search .= $wpdb->prepare( "{$searchand}(($wpdb->posts.post_title $like_op %s) $andor_op ($wpdb->posts.post_content $like_op %s) $andor_op (custom.meta_value $like_op %s))", $like, $like, $like );
    			$searchand = ' AND ';
    		}
    		if ( ! empty( $search ) ) {
    			$search = " AND ({$search}) ";
    			if ( ! is_user_logged_in() )
    				$search .= " AND ($wpdb->posts.post_password = '') ";
    		}
    		return $search;
    	}
    	else {
    		return $orig_search;
    	}
    }
    add_filter( 'posts_search', 'posts_search_custom_fields', 10, 2 );
    /**
     * カスタムフィールド検索用のJOINを行います。
     */
    function posts_join_custom_fields( $join, $query ) {
    	if ( $query->is_search() && $query->is_main_query()) {
    		// group_concat()したmeta_valueをJOINすることでレコードの重複を除きつつ検索しやすくします。
    		global $wpdb;
    		$join .= " INNER JOIN ( ";
    		$join .= " SELECT post_id, group_concat( meta_value separator ' ') AS meta_value FROM $wpdb->postmeta ";
    		// $join .= " WHERE meta_key IN ( 'test' ) ";
    		$join .= " GROUP BY post_id ";
    		$join .= " ) AS custom ON ($wpdb->posts.ID = custom.post_id) ";
    	}
    	return $join;
    }
    add_filter( 'posts_join', 'posts_join_custom_fields', 10, 2 );

    ここにさらに投稿IDも検索対象に加えたいのですが、調べても追加方法がわかりませんでした。
    これはどう書き換えれば投稿IDを検索対象にできますか?

    そもそもIDでの検索が無理なら、投稿IDを自動取得するカスタムフィールドを作成しようと考えていますが・・・

    • このトピックはd.w.cが6年、 1ヶ月前に変更しました。
2件の返信を表示中 - 1 - 2件目 (全2件中)
  • こんにちは

    post_title や post_content と同じように、ID を追加すればいいのではないでしょうか(たぶん?)。
    下記コードは例です。多少の手直しは必要だと思います。

    変更前:
    $search .= $wpdb->prepare( "{$searchand}(($wpdb->posts.post_title $like_op %s) $andor_op ($wpdb->posts.post_content $like_op %s) $andor_op (custom.meta_value $like_op %s))", $like, $like, $like );

    変更後:

    if ( is_numeric( $term ) ) {
    	$id_op = ( $like_op == 'LIKE' ) ? '=' : '!=';
    	$search .= $wpdb->prepare( "{$searchand}(($wpdb->posts.ID $id_op %d) $andor_op ($wpdb->posts.post_title $like_op %s) $andor_op ($wpdb->posts.post_content $like_op %s) $andor_op (custom.meta_value $like_op %s))", $term, $like, $like, $like );
    } else {
    	$search .= $wpdb->prepare( "{$searchand}(($wpdb->posts.post_title $like_op %s) $andor_op ($wpdb->posts.post_content $like_op %s) $andor_op (custom.meta_value $like_op %s))", $like, $like, $like );
    }
    • この返信は6年、 1ヶ月前にishitakaが編集しました。
    トピック投稿者 d.w.c

    (@dwc-1)

    ありがとうございます!
    書いていただいたコードで解決しました。

    もともとのコードにエラーを見つけたのでそこも修正し、組み込んだコードが下記です。
    一応記録のために載せておきます。

    function posts_search_custom_fields( $orig_search, $query ) {
    	if ( $query->is_search() && $query->is_main_query() && isset( $query->query_vars['search_terms'] )) {
    		// 4.4のWP_Query::parse_search()の処理を流用しています。(検索語の分割処理などはすでにquery_vars上にセット済のため省きます)
    		global $wpdb;
    		$q = $query->query_vars;
    		$n = ! empty( $q['exact'] ) ? '' : '%';
    		$searchand = '';
    		foreach ( $q['search_terms'] as $term ) {
    			$include = '-' !== substr( $term, 0, 1 );
    			if ( $include ) {
    				$like_op  = 'LIKE';
    				$andor_op = 'OR';
    				$id_op    = '=';
    			} else {
    				$like_op  = 'NOT LIKE';
    				$andor_op = 'AND';
    				$term     = substr( $term, 1 );
    				$id_op    = '!=';
    			}
    			$like = $n . $wpdb->esc_like( $term ) . $n;
    			// カスタムフィールド用の検索条件を追加します。
    			if( !isset( $search )){ $search = ""; }
    			$search .= $wpdb->prepare( "{$searchand}(($wpdb->posts.ID $id_op %d) $andor_op ($wpdb->posts.post_title $like_op %s) $andor_op ($wpdb->posts.post_content $like_op %s) $andor_op (custom.meta_value $like_op %s))", $term, $like, $like, $like );
    			$searchand = ' AND ';
    		}
    		
    		if ( ! empty( $search ) ) {
    			$search = " AND ({$search}) ";
    			if ( ! is_user_logged_in() )
    				$search .= " AND ($wpdb->posts.post_password = '') ";
    		}
    		return $search;
    	}
    	else {
    		return $orig_search;
    	}
    }
    
    add_filter( 'posts_search', 'posts_search_custom_fields', 10, 2 );
    
2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「管理画面の記事一覧で投稿IDを検索対象に含めたい。」には新たに返信することはできません。