wordpressではカスタムフィールドの検索はデフォルトではできない。
プラグインで実現する方法もあるようだけど、今回は function.php
で実現する方法。
まず全体のコードは以下の通り。後で処理ごとに解説します。
やっていることとしては、投稿の本文エリア(the_content)にカスタムフィールドの値を突っ込んで検索の対象に含めています。
なので前提として、本文エリア(the_content)を既に使っている場合は今回の方法は使えません。
function set_contents($post_id) {
if ( ! wp_is_post_revision( $post_id ) && get_post_type($post_id) === 'faq' ) { //適用する投稿タイプ指定。
// この関数をフックから外し、無限ループを防ぐ。
remove_action( 'wp_insert_post', 'set_contents' );
// カスタムフィールドを取得
$faq_txt = get_post_meta($post_id, 'faq_txt' , true);
$faq_txt2 = get_post_meta($post_id, 'faq_txt2' , true);
//タクソノミーを取得
$faq_cat = get_the_terms( $post_id, 'faq_cat' );
if ( $faq_cat && ! is_wp_error( $faq_cat ) ) {
$faq_cat_names = array();
foreach ( $faq_cat as $term ) {
$faq_cat_names[] = $term->name;
}
$faq_cat = join(',', $faq_cat_names );
}
// 更新データを格納
$update_post = array(
'ID' => $post_id,
'post_type' => 'faq',
'post_content' => $faq_txt .',' . $faq_txt2 .',' . $faq_cat,
);
// 更新
wp_update_post( $update_post );
// この関数を改めてフックする。
add_action( 'wp_insert_post', 'set_contents' );
}
}
add_action( 'wp_insert_post', 'set_contents', 10, 1 );
カスタム投稿タイプ名
- faq
カスタムフィールド名
- faq_txt
- faq_txt2
カスタムタクソノミー名
- faq_cat
コード解説
適用する投稿タイプを指定
if ( ! wp_is_post_revision( $post_id ) && get_post_type($post_id) === 'faq' ) { //適用する投稿タイプ指定。
wp_is_post_revision
は最新版を反映するための処理。
get_post_type($post_id) === 'faq'
はこの処理を適用する投稿タイプを指定しています。
これを指定しないと、いろんなところで処理が走って大変なことになるので超重要です。
通常の投稿の場合は faq
を post
とすればOKです。
対象とする投稿タイプが複数の場合は条件を追加してください。
カスタムフィールドを取得
$faq_txt = get_post_meta($post_id, 'faq_txt' , true);
$faq_txt2 = get_post_meta($post_id, 'faq_txt2' , true);
カスタムフィールドを取得しています。
タクソノミーを取得
$faq_cat = get_the_terms( $post_id, 'faq_cat' );
if ( $faq_cat && ! is_wp_error( $faq_cat ) ) {
$faq_cat_names = array();
foreach ( $faq_cat as $term ) {
$faq_cat_names[] = $term->name;
}
$faq_cat = join(',', $faq_cat_names );
}
タクソノミー も検索に入れたい場合はこの処理を入れます。
いらなければ削除してOK。
更新データを格納
$update_post = array(
'ID' => $post_id,
'post_type' => 'faq',
'post_content' => $faq_txt .',' . $faq_txt2 .',' . $faq_cat,
);
post_content
に取得したカスタムフィールドやタクソノミー を入れています。
カンマ区切りなのは、意図しない文字の連結を防ぐためです。
例えば、「岡山」と検索した時に「福岡山形」とあったら引っかかってしまいます。カンマで区切って「福岡,山形」とすることで防止できます。
コード設置後
各投稿ごとに一度更新して本文エリアに格納する処理を走らせる必要があります。
更新ボタンを押して本文エリアにデータが反映されているか確認してください。