Quantcast
Channel: WordPressプラグイン –モンキーレンチ
Viewing all 27 articles
Browse latest View live

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

$
0
0

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()などを使用したほうが良いかと思います。


Smart Custom Fields でカスタムフィールドの定義を Git で管理できるようになりました!

$
0
0

Smart Custom Fields をバージョンアップして、コードベースでカスタムフィールドの定義ができるようになりました。smart-cf-register-fieldsフックを使い、SCF::add_settingでメタボックスを定義、$Setting->add_groupでグループを定義して、その引数で各カスタムフィールドを定義します。コードベースで定義できるようになったので、functions.php などでカスタムフィールドを定義しておいて Git で管理すれば、管理画面で管理するよりも簡単に別の環境に移したり、以前定義していた定義にもどしたりすることができますね。

カスタムフィールドを定義する配列で使える項目はまとめるのが面倒なので…プラグインのコードを直接確認してみてください(/plugins/smart-custom-fields/classes/fields/*)。Smart Custom Fields の管理画面で適当にグループとフィールドを作ってブラウザの Developer Tool とかで入力項目をのぞいてもらっても何となくわかるかなと思います。

今回は @Toro_Unit さんに色々とプルリクをいただきまして、独自のカスタムフィールドを追加できるようになったり、管理画面がちょっとオシャレになったりしました。自分が何もしてなくてもプラグインがパワーアップしていく感じがとてもおもしろいと思いました。ありがとうございます!

また、@tekapo さんに日本語の翻訳ファイルを作って頂きました。面倒で日本語化するの放置していたのですごく助かりました。ありがとうございます!

その他の主な変更点

Datepicker、Colorpicer が定義画面でも同じ UI でデフォルト値の指定ができるようになりました。

これまでは単純なテキストフィールドで記事作成画面のカスタムフィールドのように Datepicker、Colorpicker の UI で指定できないのが不便でしたが、今回からは同じ UI で指定できるようになりました。WYSIWYG は難しそうだったのでまだ対応できてません…。

リビジョン表示の不具合を修正

どのバージョンからかはわかりませんが、カスタムフィールドのリビジョンが最新のものしか見れないようになっていました。今回のバージョンからは当初のとおり、全てのリビジョンが見れるように修正しました。

Smart Custom Fields でプロフィールページにもカスタムフィールドを設置できるようになりました。

$
0
0

プロフィールページへのカスタムフィールドの設置

Smart Custom Fields をバージョンアップして、プロフィールページにもカスタムフィールドを設置できるようになりました。

プロフィールページのカスタムフィールドの例

プロフィールページのカスタムフィールドの例

プロフィールページで設定したカスタムフィールドのデータは次のメソッドで取得できます。もちろん、WordPress 標準のユーザーメタ取得関数でも取得できます。

// 現在の記事の著者IDを取得
$user_id = $post->post_author;

// 'カスタムフィールド名' のデータを表示
echo SCF::get_user_meta( $user_id, 'カスタムフィールド名' );

// 全てのメタデータを表示
var_dump( SCF::get_user_meta( $user_id ) );

累積的なバグフィックス

これまでもテストコードは書いてはいたのですが、かなり限定的な箇所しか書いておらず、広範囲を網羅できていたわけではなかったのでいくつか不具合がたまってきていました。また、潰したはずのバグがまた復活してしまったりしていたので、全体的なリファクタリングを行ってテストコードも倍くらいに増やしました。恐らくこれで不具合はだいぶ無くなったのではと思います…。

アイキャッチ画像のプレビュー

@mypacecreatorさんから、プレビュー時にアイキャッチ画像が反映されないという報告をいただきました。

プレビューのアイキャッチ画像は全く動作確認できていなかったのでご報告いただいて助かりました。アイキャッチ画像もカスタムフィールドと同様、「リビジョンにデータが紐付いていてプレビューの投稿IDを渡せばプレビューのアイキャッチ画像が表示できる」と勝手に思い込んでいたのですが、アイキャッチ画像は「更新」ボタンをおした時ではなく「アイキャッチ画像を設定」したときに元記事に直接設定されるみたいで、プレビュー時に元記事のアイキャッチ画像を取得するようにすることで解決することができました。

まだまだ知らないことがあるなーと思ったのと、オープンソースとして公開することでユーザーの方からそのようなご報告をいただける機会が多くあり、ありがたいなーと改めて思いました。

Smart Custom Fields でカテゴリーやタグにもカスタムフィールドを設置できるようになりました。

$
0
0

カテゴリー、タグ、カスタムタクソノミーへのカスタムフィールドの設置

Smart Custom Fields をバージョンアップして、カテゴリー、タグ、カスタムタクソノミーにもカスタムフィールドを設置できるようになりました。

カテゴリー、タグ、カスタムタクソノミーに設定したカスタムフィールドのデータは次のメソッドで取得できます。

// 取得したいタームのID
$term_id = '1';

// 取得したいタクソノミーの種類 category | post_tag | カスタムタクソノミー
$taxonomy = 'category';

// 'カスタムフィールド名' のデータを表示
echo esc_html( SCF::get_term_meta( $term_id, $taxonomy, 'カスタムフィールド名' ) );

// 全てのメタデータを表示
var_dump( SCF::get_term_meta( $term_id, $taxonomy ) );

デフォルト値の扱いの変更

これまでは既にある投稿などに対して新たにデフォルト値を持ったカスタムフィールドを設定した場合、その投稿の編集画面に行ってカスタムフィールドにデータを入力して保存しない限り、echo SCF::get( 'hoge' );などとしても何も値が返りませんでした。そのため、まだ保存していないときに編集画面を見たときはデータ(デフォルト値)が表示されているのに表示画面ではデータを取得できない、という問題がありました。

今回のバージョン 1.4.0 から、データがまだ保存されていない場合は、表示画面でも設定されたデフォルト値を返すようになりました。これまでと同じ動作にしたい場合は下記のフックを利用して戻すことができます。

// デフォルト値の扱いを 1.4.0 未満と同じにする
add_filter( 'smart-cf-is_use_default_when_not_saved', '__return_false' );

オプションページの作成機能等を追加した Smart Custom Fields 2.1.0 を公開しました。

$
0
0

Smart Custom Fields 2.0.0〜2.1.0 で下記のアップデートを行いました。

  • オプションページの作成機能を追加
  • WYSIWYG フィールドにビジュアル・テキストの切り替えタブを追加
  • チェックボックス、ラジオボタン、セレクトボックスの選択肢の設定でキーと値に別々の値を指定できるように変更

オプションページの作成機能を追加

テーマの functions.php 等に下記のコードを追加することでオプションページを作成し、そこにカスタムフィールドを設置できるようになりました。ページ単位とかカテゴリー単位ではなく、サイト共通で使用するようなオプションを設定したい場合に便利です。

/**
 * @param string $page_title ページのtitle属性値
 * @param string $menu_title 管理画面のメニューに表示するタイトル
 * @param string $capability メニューを操作できる権限(maange_options とか)
 * @param string $menu_slug オプションページのスラッグ。ユニークな値にすること。
 * @param string|null $icon_url メニューに表示するアイコンの URL
 * @param int $position メニューの位置
 */
SCF::add_options_page( 'ページタイトル', 'メニュータイトル', 'manage_options', 'theme-options' );

上記を追加すると Smart Custom Fields の設定画面に「表示条件(オプションページ)」というメタボックスが追加されますので、そこでカスタムフィールドを設置したいオプションページを選択し保存してください。

オプションページで保存したカスタムフィールドの値を取得するのは下記のコードで行えます。

// カスタムフィールドの値を取得
SCF::get_option_meta( 'メニュースラッグ', 'フィールド名' );

// グループの値を取得
SCF::get_option_meta( 'メニュースラッグ', 'グループ名' );

// そのオプションページの全てのデータを取得
SCF::get_option_meta( 'メニュースラッグ' );

WYSIWYG フィールドにビジュアル・テキストの切り替えタブを追加

これまで WYSIWYG フィールドには「メディアを追加」ボタンはあったのですが「ビジュアル・テキストの切り替えタブ」はありませんでした。これは実装方法がわからなかったためなのですが、改めてコアのコードを読み直し、なんとか動作するようにできました。もし不具合があっても僕にはどうしようもないのでその場合はプルリクくださいw

チェックボックス、ラジオボタン、セレクトボックスの選択肢の設定でキーと値に別々の値を指定できるように変更

キー => 値のように選択肢を入力することで、キーと値に別々の値を指定できるようになりました。

コードでカスタムフィールドを設定する場合は下記のような感じで別々の値を指定できるようになります。

...
$Setting = SCF::add_setting( 'theme-options', 'テーマオプション' );
$Setting->add_group( 'group-animals', false, array(
	array(
		'name'  => 'animals',
		'label' => '動物',
		'type'  => 'check',
		'choices' => array(
			'cat'  => '猫',
			'dog'  => '犬',
			'bird' => '鳥',
		),
		'default' => array(
			'cat', 'dog',
		),
	),
) );
$settings[] = $Setting;
...

WordBench Fest.山口 -Spring WP Fever- で MW WP Form について語り尽くしてきました

$
0
0

5/20 に開催された WordBench Fest.山口 -Spring WP Fever- に参加しました。今回は山口県外からスピーカーを呼んで大きくやるということで僕もお誘い頂きました。WordCamp Kyoto 2017 の副実行委員長である GOUTEN さん、Contact Form 7 の世界の三好さん、WordCamp Tokyo 2013 実行委員長のメガネさんなどなど山口県外からたくさんのスピーカーが、そして全部で40人弱の参加者さんということで、長崎ではこんなに大きくはやったことがないのですごいなーとわくわくしました。

MW WP Form について語り尽くす

お題は何でも良いですよ〜ということでお誘い頂いたのですが、今年は仕事だったり登壇だったり色々忙しくてあまり新しいことができておらずネタが枯渇状態、かといってせっかく時間を頂いているのにどこかでやったものの再演というのもなんだかなーということで、苦し紛れ的に MW WP Form について話してみることにしました。

MW WP Form はもう3〜4年くらいになるプロダクトなので「今更 MW WP Form の話とかやってる〜w どれだけ昔のネタ使いまわすねんプーw」とか思われたらいやだなぁと思いまして、もうこれは普通に話したらそうなっちゃうから、逆に引かれるくらい詳しく話す構成にしたら面白いんじゃないか、という作戦でいきました。

結構多機能なプラグインなので、全てについて語りつくそうと思うと1日かかっちゃうレベルなので、フォームの送信部分にフォーカスしてお話しました。この実行プロセスの文字起こしをする中で、いろいろ気になるところが見えてきたので、もう少し見通しの良い感じにしたいなと現在リファクタリングをおこなっています。文字起こししなかったら多分リファクタリングしようとは思わなかったので機会を頂けて良かったです。

皆さんのセッションもそれぞれ特徴があって面白かったですし、LT も参加者が10人もいてとても盛り上がっていました。その後の懇親会も深夜までずっとしゃべりっぱなしでとても楽しかったですし、忙しかったりなんだりで色々行き詰まりを感じていたりしていたのですが、色々お話したり聞いたりしていくなかで今後の方向性であったり考えるきっかけにもなったりして、とても有意義な時間を過ごせました。

WordBench 山口はとても雰囲気が良くて、良いな〜と思っているので、またいつか参加したいと思います!

WordBench Fest.山口 -Spring WP Fever- で MW WP Form について語り尽くしてきました

$
0
0

5/20 に開催された WordBench Fest.山口 -Spring WP Fever- に参加しました。今回は山口県外からスピーカーを呼んで大きくやるということで僕もお誘い頂きました。WordCamp Kyoto 2017 の副実行委員長である GOUTEN さん、Contact Form 7 の世界の三好さん、WordCamp Tokyo 2013 実行委員長のメガネさんなどなど山口県外からたくさんのスピーカーが、そして全部で40人弱の参加者さんということで、長崎ではこんなに大きくはやったことがないのですごいなーとわくわくしました。

MW WP Form について語り尽くす

お題は何でも良いですよ〜ということでお誘い頂いたのですが、今年は仕事だったり登壇だったり色々忙しくてあまり新しいことができておらずネタが枯渇状態、かといってせっかく時間を頂いているのにどこかでやったものの再演というのもなんだかなーということで、苦し紛れ的に MW WP Form について話してみることにしました。

MW WP Form はもう3〜4年くらいになるプロダクトなので「今更 MW WP Form の話とかやってる〜w どれだけ昔のネタ使いまわすねんプーw」とか思われたらいやだなぁと思いまして、もうこれは普通に話したらそうなっちゃうから、逆に引かれるくらい詳しく話す構成にしたら面白いんじゃないか、という作戦でいきました。

結構多機能なプラグインなので、全てについて語りつくそうと思うと1日かかっちゃうレベルなので、フォームの送信部分にフォーカスしてお話しました。この実行プロセスの文字起こしをする中で、いろいろ気になるところが見えてきたので、もう少し見通しの良い感じにしたいなと現在リファクタリングをおこなっています。文字起こししなかったら多分リファクタリングしようとは思わなかったので機会を頂けて良かったです。

皆さんのセッションもそれぞれ特徴があって面白かったですし、LT も参加者が10人もいてとても盛り上がっていました。その後の懇親会も深夜までずっとしゃべりっぱなしでとても楽しかったですし、忙しかったりなんだりで色々行き詰まりを感じていたりしていたのですが、色々お話したり聞いたりしていくなかで今後の方向性であったり考えるきっかけにもなったりして、とても有意義な時間を過ごせました。

WordBench 山口はとても雰囲気が良くて、良いな〜と思っているので、またいつか参加したいと思います!

Viewing all 27 articles
Browse latest View live