LoginSignup
0
0

More than 5 years have passed since last update.

wordpressでプラグイン使わずにカスタムフィールドも検索結果に含めたい。

Posted at

wordpressではカスタムフィールドの検索はデフォルトではできない。
プラグインで実現する方法もあるようだけど、今回は function.phpで実現する方法。

まず全体のコードは以下の通り。後で処理ごとに解説します。
やっていることとしては、投稿の本文エリア(the_content)にカスタムフィールドの値を突っ込んで検索の対象に含めています。

なので前提として、本文エリア(the_content)を既に使っている場合は今回の方法は使えません。

function.php

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

コード解説

適用する投稿タイプを指定

function.php
  if ( ! wp_is_post_revision( $post_id ) && get_post_type($post_id) === 'faq' ) { //適用する投稿タイプ指定。

wp_is_post_revisionは最新版を反映するための処理。

get_post_type($post_id) === 'faq'はこの処理を適用する投稿タイプを指定しています。
これを指定しないと、いろんなところで処理が走って大変なことになるので超重要です。
通常の投稿の場合は faqpostとすればOKです。
対象とする投稿タイプが複数の場合は条件を追加してください。

カスタムフィールドを取得

function.php
    $faq_txt = get_post_meta($post_id, 'faq_txt' , true);
    $faq_txt2 = get_post_meta($post_id, 'faq_txt2' , true);

カスタムフィールドを取得しています。

タクソノミーを取得

function.php
    $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。

更新データを格納

function.php
    $update_post = array(
      'ID' => $post_id,
      'post_type' => 'faq',
      'post_content' => $faq_txt .',' . $faq_txt2 .',' . $faq_cat,
    );

post_contentに取得したカスタムフィールドやタクソノミー を入れています。
カンマ区切りなのは、意図しない文字の連結を防ぐためです。
例えば、「岡山」と検索した時に「福岡山形」とあったら引っかかってしまいます。カンマで区切って「福岡,山形」とすることで防止できます。

コード設置後

各投稿ごとに一度更新して本文エリアに格納する処理を走らせる必要があります。
更新ボタンを押して本文エリアにデータが反映されているか確認してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0