WordPress のカスタムフィールドを簡単・便利に使えるようになるプラグイン「Smart Custom Fields」作った。

scf

既に似たようなプラグインはいくつかあって、Advanced Custom FieldsCustom Field SuiteCustom Field Template などが有名です。

僕は Advanced custom Fields を良く使っておりまして、このプラグイン、とにかく使い勝手が良くて「独自のフィールドを追加する」という点においてはものすごく便利です。しかし、複数の値を持てるフィールド(チェックボックスなど)の値をシリアライズして保存する、という仕様であるため、Meta Query したいときやカスタムフィールドの検索をしたいときなどにちょっと問題がでてしまったりしていました。

また、多機能過ぎて設定画面が肥大化しており操作がちと面倒だったり、ちょこちょこ WordPress プラグインの作法に沿っていないような部分があったり、設定データを飛ばしてしまったりしたので、もういっそ自分でメンテナンスしやすいようにオリジナルのプラグインを作ってしまったほうが良いのではないか、ということで作ってしまいました。
(特に Advanced Custom Fields のヘビーな感じがしっくりきていなかったので、Advanced Custom Fields ほど多機能ではありません。)

Smart Custom Fields の特徴

Smart Custom Fields の主な特徴は以下の通り。

  • Advanced Custom Field では有料の「繰り返し機能」が標準装備!
  • メタデータのリビジョンに対応
  • メタデータのプレビューに対応
  • メタデータを簡単に取得するための便利メソッド
  • プロフィールページにもカスタムフィールドを設置可能

Advanced Custom Field では有料の「繰り返し機能」が標準装備!

Smart Custom Fields には標準で繰り返し機能を使用することができます。また、繰り返すのは一つのフィールドだけでも良いし、複数のフィールドを一つのグループとしてそれを繰り返すこともできます。

メタデータのリビジョンに対応

WordPress のリビジョン機能は、基本的にタイトルと本文のみしか保存しません。Smart Custom Fields を使えば、メタデータもリビジョンデータとして保存するので、メタデータだけ変更を繰り返した場合でも任意のポイントに戻すことが可能です。リビジョン対応は有名プラグインであれば恐らく対応しているのではないかと思います。確認はしていませんが^^;

メタデータのプレビューに対応

WordPress の標準ではプレビューにメタデータは反映されませんが、Smart Custom Fields を使えばプレビューにもメタデータの変更が反映されるようになります。恐らくこの機能についても有名プラグインは抑えているのではないかなーと思います。こちらも確認はしていません^^;

プロフィールページにもカスタムフィールドを設置可能

詳しくは下記の記事をご覧ください。

メタデータを簡単に取得するための便利メソッド

下記のメソッドでメタデータを良い感じに取得できます。

// 特定のフィールドのデータを取得(例:メタキーが product-id の場合)
$product_id = SCF::get( 'product-id' );
echo esc_html( $product_id );

// 特定のグループのデータを取得(例:グループ名が repeat-group の場合)
$repeat_group = SCF::get( 'repeat-group' );
foreach ( $repeat_group as $fields ) {
    /*
    適当な処理

    // 値の出力
    echo $fields['設定したフィールド名'];

    とか

    foreach ( $fields as $field_name => $field_value ) {
       // フィールド名の出力
       echo esc_html( $field_name );
       // 値の出力
       echo esc_html( $field_value );
    }
    */
}

// 全てのデータを取得
$all_data = SCF::gets();

// 投稿IDを引数として指定することもできます。
$product_id = SCF::get( 'product-id', 110 );
$all_data = SCF::gets( 110 );

///////////////////

// 現在の記事の著者IDを取得
$user_id = $post->post_author;
 
// 'カスタムフィールド名' のデータを表示
echo SCF::get_user_meta( $user_id, 'カスタムフィールド名' );
 
// 全てのメタデータを表示
var_dump( SCF::get_user_meta( $user_id ) );

///////////////////

// ID が 110 のカテゴリーの 'カスタムフィールド名' のデータを表示
echo SCF::get_term_meta( 110, 'category, 'カスタムフィールド名' );
 
// 全てのメタデータを表示
var_dump( SCF::get_term_meta( 110, 'category' ) );

使用可能なフィールドの種類

  • Text
  • Textarea
  • Radio
  • Select
  • Checkbox
  • Wysiwyg editor
  • Image
  • File
  • Relation(任意の投稿タイプの投稿と関連付け)
  • Color picker
  • Date picker
  • Boolean

今後の開発予定

とりあえず最低限欲しかった実装できたので、後はぼちぼち下記の機能をつけていければなーと。(やり方がわからなかったり大変そうなものもあるので半分妄想…。プルリクお待ちしております。)

  • 編集画面でのメタボックスの表示をajax化して、カテゴリー選択時やタクソノミー選択時に動的に適切なメタボックスに切り替える。
  • リレーションフィールドの種類を増やす(現在は記事のみなので、タクソノミーとかユーザーとか)
  • カスタムフィールド検索ボックス

ダウンロード・インストール

下記からダウンロードするか、管理画面で「Smart Custom Fields」と検索してください。

おまけ:プラグインへのロックインを回避する場合

メタデータの保存方法について

Advanced Custom Field でフィールドの設定を行ってメタデータを保存した場合、データがシリアライズされて保存されてしまう場合があることは前述しましたが、これは WordPress 標準のメタデータの保存方式ではないため、Advanced Custom Field の使用をやめると保存したメタデータが使えなくなってしまいます。Smart Custom Fields はなるべく WordPress の標準のメタデータの保存方法に沿うようにしているので、この点はクリアすることができます。

繰り返しフィールド内における複数値を持ち得るフィールドの使用について

Custom Field Suite の場合はなるべく WordPress の標準に沿うようになっていますが、繰り返しフィールド内で複数値を持ち得るフィールドを使用した場合、保存した値がどの繰り返しグループに所属するものかの情報を保存しておく必要があるため、その情報を独自テーブルに保存するようになっています。なので、Custom Field Suite の使用をやめるとどの繰り返しグループに所属するデータなのかの情報が失われてしまうため、別のプラグインに乗り換えた場合に管理画面上でただしくデータを表示することができません。

この点については僕の Smart Custom Fields も同様の問題があり、こちらの場合はテーブルではなくメタデータにどの繰り返しグループに所属するデータなのかの情報を保存しています。本当はそのような余分なメタデータなしで実現したかったのですが、WordPress のメタデータ機能自体に繰り返し機能というかメタデータを階層化する仕組みがないため、この点については妥協せざるを得ませんでした…。いつでも他のプラグインに乗り換えることができるようにしておきたい場合は、繰り返しフィールド内では複数値を持ち得るフィールドを使用しないようにしたほうが良いかと思います。

便利メソッドについて

Advanced Custom Field にはget_field()、Custom Field Suite にはCFS()->get()のようなメタデータを簡単に取得したり出力したりするための便利メソッドが用意されています。これらのメソッドはテンプレートに記述することになりますが、プラグインの使用をやめた場合、当然これらのメソッドは使用できなくなるので、PHPの関数・メソッドの未定義エラーが発生しページが見れなくなってしまう可能性があります。Smart Custom Fields にも同じような便利メソッドを用意していますが、いつでも他のプラグインに乗り換えることができるようにしておきたい場合は WordPress 標準のget_post_meta()などを使用したほうが良いかと思います。

  • ブックマーク
  • Feedly

この記事を書いた人

キタジマタカシ

長崎在住、フリーランスのWordPress テーマ / プラグインデベロッパー。 多数のプロダクトをオープンソースで開発・公開しています。現在は WordPress 有料テーマ Snow Monkey を開発・販売しています。