ツイッターのような感じで気軽に短い文章を投稿できるようにカスタム投稿タイプを使ってあれこれ WordPress をいじくっていたのだけど、カスタム投稿タイプのデフォルトの投稿フォーマットが設定できない。WordPress には投稿フォーマットという機能があり、記事の種類を決めることができる。スタンダード、引用だとか、画像だとかで、テーマ側がサポートしていれば表示形式にバリエーションを持たせることができる。しかし、WordPress そのままの機能だと、このデフォルトの投稿フォーマットの設定がカスタム投稿タイプごとに設定できない。そのため、これを解決するためにコードを書いた。
全体設定
全体のデフォルトの投稿フォーマットは簡単に変更できる。Dashboard -> Settings -> Writing から、Default Post Format のオプションを変更すれば良い。
しかし、これをカスタム投稿タイプ毎に設定したい。
解決方法
今回やりたいことは、option_{オプションキー名}
フィルターフックを使えば可能。この場合、default_post_format
というオプションのキーになる。このオプションのキー名の探し方は、ブラウザの Inspect Element (要素の上で右クリック) を使って調べる。select
インプットの name
アトリビュートの値がそうだ。
で、WordPerss 側で、このデフォルトの値を取りに来た時に、投稿タイプを調べて、予め決めておいたものを返せば良い。
コード
ささっと、クラスを書いた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
class DefaultPostFormatForCustomPostTypes { private $___aPostTypes = array( // slug => format // 'note' => 'aside', ); public function __construct( array $aPostTypes=array() ) { $this->___aPostTypes = $aPostTypes; add_filter( 'option_default_post_format', array( $this, 'replyToGetDefaultPostFormat' ) ); } /** * @return string The default post format. * either of aside, gallery, link, image, quote, standard, video, audio */ public function replyToGetDefaultPostFormat( $sFormat ) { $_sPostTypeSlug = isset( $GLOBALS[ 'post_type' ] ) ? $GLOBALS[ 'post_type' ] : ''; if ( ! in_array( $_sPostTypeSlug, array_keys( $this->___aPostTypes ) ) ) { return $sFormat; } return isset( $this->___aPostTypes[ $_sPostTypeSlug ] ) ? $this->___aPostTypes[ $_sPostTypeSlug ] : $sFormat; } } new DefaultPostFormatForCustomPostTypes( array( 'note' => 'aside', ) ); |
使い方
テーマの functions.php
に放り込むことを想定している。使い方はクラスをインスタンス化するだけ。
1 2 3 4 5 |
new DefaultPostFormatForCustomPostTypes( array( 'note' => 'aside', ) ); |
その際に、要望の投稿タイプとそのデフォルトの投稿フォーマットを指定した配列を渡してあげる。上の例では note
という投稿タイプのスラッグの場合 aside
という投稿フォーマットにしてね、ということになっている。
指定できる投稿フォーマットは次の通り。
- aside
- gallery
- link
- image
- quote
- standard
- video
- audio
結果
うまくいくと、記事公開直後に、同編集画面から Document -> Post Format を確認すれば希望したフォーマットが保存されていることがわかる。