Advanced Custom Fields(ACF)をあれやこれやしてみる

WordPressでAdvanced Custom Fields(ACF)を利用するケースはあるかと思いますが今回は、ACFの値を投稿以外のページで値として利用したと思って調べてみました。

 

POST_TYPE

acf-fieldがフィールド

acf-field-groupがフィールドをまとめたグループ

 

post_name

acf-field⇒「field_」

acf-field-group⇒「group_」

という名称で保存されます。

これがKEYになります。

 

post_excerpt

ここに格納されているのがカスタムフィールドとして設定したフィールド名が入っています。

 

通常投稿から利用する場合

get_filed(‘フィールド名’)やget_field_object(‘フィールド名’)で値を取得することが可能

※これにはPOST_IDが必要。

 

 

投稿以外のページからACFのフィールドの情報を取得するには?

Key名って?いうとACFはフィールドを増やす毎にユーザーが指定したフィールド名以外にキーとなる名称を付けています。

ということで、「get_field_object(‘Key名’)」で取得できるようです。

 

じゃあ、フィールド名⇒KEYに変換できるのか?というとfunctionを作ればできる?

※post_excerpt⇒post_nameを取得する

「$wpdb->get_results」を利用してクエリを書いてみた。

function getCustomfieldToFieldKey($column)
{
    if(empty($column))
        return false;

    global $wpdb;
    $query = "
    SELECT post_excerpt, post_name
    FROM $wpdb->posts AS p
    WHERE p.post_type = 'acf-field'
    AND p.post_status = 'publish'
    AND p.post_excerpt = '{$column}'
  ";

    $results = $wpdb->get_results( $query );

    if(!empty($results[0]->post_name))
    {
        return $results[0]->post_name;
    }
    return false;

}

 

これでpost_name(KEY)が取り出せる。

もちろん重複している場合はNGなのでカスタムフィールドを設計する際には気を付けないといけない。

 

あとは「get_field_object」にKEYを入れて内容を取り出す。

 

チェックボックスは検索向きじゃないのでタクソノミーで代用

 

 

リピートフィールドをプログラムでデータを追記する

あんまり使うこと無いかもしれないけど、リピートフィールドをPHPプログラムでデータを追記する場合

ACFのドキュメントに記述された方法だと失敗したのでメモとして残しておく。

・参考記事
https://www.kevinleary.net/update-an-acf-repeater-field-programmatically/

$existing = get_field( '1.リピートフィールド名' ,$post_id);
if ( ! is_array($existing) ) $existing = [];

$additions = [
    [
        '1.リピートフィールド名のリピートで設定しているフィールド名A' => '追加の値',
        '1.リピートフィールド名のリピートで設定しているフィールド名B' => '追加の値',
        '1.リピートフィールド名のリピートで設定しているフィールド名C' => '追加の値',
    ],
    [
        '1.リピートフィールド名のリピートで設定しているフィールド名A' => '追加の値',
        '1.リピートフィールド名のリピートで設定しているフィールド名B' => '追加の値',
        '1.リピートフィールド名のリピートで設定しているフィールド名C' => '追加の値',
    ],
    [
        '1.リピートフィールド名のリピートで設定しているフィールド名A' => '追加の値',
        '1.リピートフィールド名のリピートで設定しているフィールド名B' => '追加の値',
        '1.リピートフィールド名のリピートで設定しているフィールド名C' => '追加の値',
    ],

];

$updated = array_merge ($existing , $additions);//過去のデータと新しいデータを結合
update_field( '1.リピートフィールド名', $updated,$post_id );//そんでもって更新

 

 

 

 

これでなんとか。

WordPressのカスタムフィールドを検索する

WordPressの検索機能をカスタマイズしてみました。

検索プラグインがいくつかあるのですが、「fe-advanced-search」は、アドバンスカスタムフィールドプラグインに対応しておらず、なんだかんだといって、自作することにしました。

 

WordPressカスタムフィールドを検索させるのにちょっとハマったりしましたので基本的なところからメモを残していきたいと思います。

 

カスタムフィールドを検索できるようにするための下準備

まずは、wp_postsだけがSQLの対象となっているのでJOINでpostmetaを結合する関数を追加します。

function posts_join_custom_fields( $join, $query ) {
    if ( $query->is_search() && $query->is_main_query() && ! is_admin() ) {
        global $wpdb;
        $join ="INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)";
    }
    return $join;
}
add_filter( 'posts_join', 'posts_join_custom_fields', 10, 2 );

※管理画面以外、接続するようにしています。INNERで結合しているのでpostmetaに値があることが前提です。利用するカスタム投稿等によっては、上記の記述だと問題があると思いますので、どの画面で対象にするのか条件分を記述したほうが良いです。

 

 

次にカスタムフィールド(テキスト)を検索対象にしてみます。

「$search」の最初に「AND」でWHEREの追加をします。

その後、「meta_key=カスタムフィールド」、「meta_value=検索値」で絞り込んでいます。

function custom_search($orig_search, $query) {
    if ( $query->is_search() && $query->is_main_query() && ! is_admin() ) {
        global $wpdb;

        $search =' AND ';
        $search .="($wpdb->postmeta.meta_value  LIKE '%日本橋%' and $wpdb->postmeta.meta_key = 'カスタムフィールド名')";
        return $search;
    }
    return $orig_search;
}
add_filter('posts_search','custom_search', 10, 2);

 

このあたりを基本系としてあとは、発展していった内容を記述していけばよいかと思います。

 

 

 

 

robot.txtのテスター

robot.txtを作成したけどあっているのか検証するのにどうしたら?って思ったのでまとめてみました。

 

Google サーチコンソールを利用するのですが、旧バージョンにしかない??らしくリンクが見つからなかったので下記のヘルプからいけました。

https://support.google.com/webmasters/answer/6062598?hl=ja&ref_topic=6061961

 

 

URLを入力してテストできますので表示わかりやすいかと思います。