ラムネグから一言:寝る前に読むとくだらなすぎて逆に寝れると好評なすごい適当なブログをこっちではじめてます.
ワードプレスで記事のデフォルト値を設定する
今回はワードプレスで記事のタイトルやパーマリンク、そしてアイキャッチ画像やカスタムフィールドのデフォルト値の設定をフックを用いて行う方法をわかりやすく紹介していきます。
記事タイトルとパーマリンクにデフォルト値を自動設定するにはwp_insert_post_dataフックを、そしてアイキャッチ画像やカスタムフィールドにデフォルト値を設定するにはdraft_to_publishとauto-draft_to_publishフックを使用します。
- フックとは
-
ワードプレスではフックという機能を使うことで、ワードプレスの行ういろいろ処理の途中に、自分の行いたい好きな処理をを追加することが出来ます。例えばワードプレスの画像保存処理の途中に画像を任意のサイズに変更したり、記事編集画面を表示する時に記事編集画面のビジュアルエディタを無効化したりできます。
今回紹介するwp_insert_post_dataやdraft_to_publish(auto-draft_to_publish)もワードプレスのフックの一種です。
- ワードプレスで記事のデフォルト値を設定する
- デフォルト値設定:もくじ
- wp_insert_post_dataフック
- ひな形:wp_insert_post_data
- 使用例:パーマリンクと抜粋の自動設定
- wp_insert_post_dataフック説明
- アイキャッチ画像は実はカスタムフィールド
- auto-draft_to_publishフック
- ひな形:auto-draft_to_publish
- 使用例:アイキャッチ画像未設定ならデフォルト画像を設定
- デフォルト値を設定して記事編集をラクしよう!
デフォルト値設定:もくじ
- wp_insert_post_dataフック
- ひな形:wp_insert_post_data
- 使用例:パーマリンクと抜粋の自動設定
- wp_insert_post_dataフック説明
- アイキャッチ画像は実はカスタムフィールド
- auto-draft_to_publishフック
- ひな形:auto-draft_to_publish
- 使用例:アイキャッチ画像未設定ならデフォルト画像を設定
wp_insert_post_dataフック
wp_insert_post_dataは記事を保存するタイミングで呼ばれるフックで、パーマリンクや記事タイトルなどを強制的に上書きして保存することができます。
使いどころとしては例えば毎日ワードプレスで日記を書いているけど、そのたびにパーマリンクを「nikki-20160905」と変更するのが面倒な場合。このフックを使うとパーマリンクに何も入力しなくても公開時に自動で”nikki-“プラス日付のデフォルト値に上書きしてくれます。
大事なことはこのwp_insert_post_dataフックは記事情報をデータベースに保存する前に実行されるフックだということです。
- ワードプレスの記事保存の流れ
-
- 「公開ボタンを押す」など保存処理が始まる
- wp_insert_post_dataフック
- データベースに保存
- draft_to_publishフック(auto-draft_to_publishも。)
- publish_post、save_postもこのタイミング
- タイトルのデフォルト値について
-
今回紹介しているwp_insert_post_dataフックは記事を”保存”する前に呼ばれます。
反対に”新規作成”を押したときに呼ばれるフックもあります。default_titleとdefault_contentがそうです。
default_titleを使うと”新規作成”を押した時に、最初からタイトルに設定した文字列が入力された状態で始まります。default_contentを使うと記事本文に最初から設定した文字列が入力された状態から始まります。
こちらを使ってもいいのですが、これだとどんな記事を書く場合でも設定したタイトルが出てきて、逆に消すのが面倒になります。
特定のカテゴリのみでデフォルト値を設定したい場合など、細かくデフォルト値を決めたい場合はwp_insert_post_dataフックが適しています。
- default_titleの設定例:
-
functions.php
function my_default_title_func( $title ){ $title = 'タイトルに表示したい文字列'; return $title; } add_filter( 'default_title', 'my_default_title_func' );
ひな形:wp_insert_post_data
functions.php
function my_auto_input( $data, $postarr ){
$post_status = get_post_status();
if($data["post_status"] == 'publish'
&& $post_status == 'draft' || $post_status == 'auto-draft' ){
/* ここに記事保存前に設定したいデフォルト値を書く */
}
return $data;
}
add_filter( 'wp_insert_post_data', 'my_auto_input', 10, 2 );
上記がひな形です。
このフックは保存する時(ワードプレスの自動保存でも)に絶対に呼ばれるので、フックの中でどういった保存のときに処理するのか場合わけしてあげます。ひな形では3行目でこれから「公開」にしようとしている場合。そして4行目で今まで下書きかワードプレスの自動保存だった場合。この二つが成り立つ場合のみデフォルト値の設定をするようにしています。
使用例:パーマリンクと抜粋の自動設定
下記例は実際にぼくが使っていた内容なので少々見づらいかもしれませんが載せておきます。
function aitoday_auto_input( $data, $postarr ){
if($data["post_status"] == 'publish'
&& isset($postarr["post_category"])
&& in_array("40", $postarr['post_category'], true)
&& preg_match("/めちゃ短AIニュース$/", $data['post_title']) ){
$post_status = get_post_status();
if( $post_status == 'draft' || $post_status == 'auto-draft' ){
$data['post_name'] = 'ai' . preg_replace('/[^0-9]/', '', $data['post_title']);
preg_match('/.*<\/ol>/s', $data['post_content'], $match );
$data['post_excerpt'] = $match[0];
}
}
return $data;
}
add_filter( 'wp_insert_post_data', 'aitoday_auto_input', 10, 2 );
やっていることは、
- 下書きや自動保存から「公開」にするとき
- カテゴリIDが40のとき
- 記事タイトルが特定文字列「めちゃ短AIニュース」で始まるとき
の全てが成り立つ場合のみ、パーマリンクと抜粋に自動で値を設定しています。
強制的にデフォルト値にしてしまうので例のように出来るだけ条件を多くして、上書きが起こるタイミングを限定しておくほうが安心ですよね。
wp_insert_post_dataフック説明
wp_insert_post_dataフックでは引数を二つ取ることができます。一つ目のdataは配列でこのフックで変更できる項目一覧が入っています。二つ目のpostarrも配列で、このフックでは変更できない記事特有の値が入っています。
- wp_insert_post_dataフックで変更できる主な項目
-
以下が第一引数dataの配列に含まれる主な変更できる項目です。
- タイトル
- 記事本文
- 抜粋
- パーマリンク(スラッグ)
- 投稿ステータス
- 投稿者名
- 投稿日時
- パスワード
- wp_insert_post_dataフックで変更できない主な項目
-
以下が第二引数postarr配列に含まれるwp_insert_post_dataフックでは変更できない主な項目です。
- カテゴリ
- タグ
- カスタムフィールド
- アイキャッチ画像
なのでwp_insert_post_dataフックではカテゴリやタグ、そしてカスタムフィールドとアイキャッチ画像のデフォルト値を設定することはできません。変更したい場合は次に紹介するauto-draft_to_publishフックを使うことになります。
タイトルや抜粋、パーマリンクを自動設定する場合はwp_insert_post_dataフックを使う
アイキャッチ画像は実はカスタムフィールド
次にwp_insert_post_dataフックでは設定できない、アイキャッチ画像についてみていきますね。
ワードプレスでは投稿一つずつにアイキャッチ画像というものを設定できます。このアイキャッチ画像はタイトルやパーマリンクと違い、カスタムフィールドの一種です。
そしてカスタムフィールドは他の記事項目と保存タイミングが異なります。なのでアイキャッチ画像に代表されるカスタムフィールドの値をwp_insert_post_dataフックで上書きすることは出来ないのです。
auto-draft_to_publishフック
アイキャッチ画像などカスタムフィールドのデフォルト値を自動設定するにはdraft_to_publishフックとauto-draft_to_publishフックを使います。
wp_insert_post_dataフックがデータベース保存前に呼び出されるのに対し、draft_to_publishフックとauto-draft_to_publishフックはデータベース保存後に呼び出されます。
- 似ているフックいろいろ
-
auto-draft_to_publishと似ているフックがたくさんあります。例えばpublish_post、save_postといったフック。このフックも記事保存時に呼ばれます。
auto-draft_to_publishとこれらフックとの違いはタイミングがとても限定されている点です。publish_post、save_postは公開するときだけじゃなく、記事更新のときも呼び出されます。今回のようなデフォルト値の設定で上記フックを使ってしまうと違うアイキャッチに変更したくても更新ごとに毎回デフォルトに上書きされてしまい、デフォルトというより強制アイキャッチになってしまいます。
- auto-draft_to_publishのもろもろ
-
auto-draft_to_publishは他にもいろいろな状態変化を検知できるフックです。
”状態①”_to_”状態②””状態”_postというのがひな形。各状態は以下から選ぶことが出来ます。例えば下書きからゴミ箱になったときに実行したいなら「draft_to_trash」というフックを、どんな状態からでもゴミ箱に行ったときに実行したいなら「trash_post」を使えばいいですね。
- publish
- 公開
- draft
- 下書き
- auto-draft
- 自動保存
- trash
- ゴミ箱
- new
- 前のステータスがないとき
- private
- ワードプレスログイン中しか閲覧不可
- pending
- レビュー待ち
- future
- 公開予約
- inherit
- リビジョンまたは添付ファイル
ひな形:auto-draft_to_publish
function my_auto_customfield( $post ){
/* get_post_metaやupdate_post_metaを使ってカスタムフィールドの値を更新する */
/* get_post_meta:カスタムフィールド値の取得 */
/* update_post_meta:カスタムフィールドの更新・新規保存 */
}
add_action( 'draft_to_publish', 'my_auto_customfield', 10, 1 );
add_action( 'auto-draft_to_publish', 'my_auto_customfield', 10, 1 );
上記がひな形です。関数の中でget_post_metaやupdate_post_metaを使ってカスタムフィールドの値を取得して更新しましょう。
使用例:アイキャッチ画像未設定ならデフォルト画像を設定
下記はぼくが実際に使っていたコードです。
functions.php
function aitoday_auto_thumbnail( $post ){
$post_id = $post->ID;
$cat_id = get_the_category()[0]->term_id;
if( $cat_id === 40
&& preg_match("/めちゃ短AIニュース$/", $post->post_title) ){
$post_thumbnail = get_post_meta( $post_id, '_thumbnail_id', true );
if ( !wp_is_post_revision( $post_id ) ) {
if ( empty( $post_thumbnail ) ) {
update_post_meta( $post_id, '_thumbnail_id', $meta_value = '2754' );
}
}
}
}
add_action( 'draft_to_publish', 'aitoday_auto_thumbnail', 9, 1 );
add_action( 'auto-draft_to_publish', 'aitoday_auto_thumbnail', 9, 1 );
5,6行目で特定のカテゴリの場合でかつ、特定のタイトルから始まる場合のみアイキャッチ画像の設定をするように限定しています。
ワードプレスは記事編集中、定期的に自動保存を行うので下書きから公開の場合である「draft_to_publish」のほかに、自動保存から公開の「auto-draft_to_publish」も必要になります。
7行目でアイキャッチ画像の情報を入手し、9,10行目でアイキャッチ画像が設定されていなかった場合のみデフォルトのアイキャッチ画像を設定しています。update_post_meta()を呼ぶだけでアイキャッチ画像(カスタムフィールド)の保存までしてくれるのでラクチンです。
add_action()の第三引数は優先度を意味していて数字が小さいほど優先して実行されます。同じフックに複数関数が設定されているときに意味があります。今回別に使っていたプラグインが優先度10で同じフックを使っていたのでそれより優先して動かすために9にしています。なので普通に使う場合は10でも9でも構いません。
デフォルト値を設定して記事編集をラクしよう!
今回はタイトルやパーマリンク、抜粋、それにアイキャッチ画像等のカスタムフィールドについてデフォルト値を設定する方法を紹介しました。少し記事が長くなってしまいましたが、要はタイトルや記事本文、抜粋の自動設定はwp_insert_post_data、アイキャッチ画像などのカスタムフィールドはauto-draft_to_publishなどで行うという事でした。
毎日書く記事なんかだとある程度同じ部分も多くなります。こんな風にワードプレス側に補助してもらうと記事更新もラクチンになります。ぜひお試しくださいね。
【おしらせ、というか完全なる宣伝】
文体がもうぜんぜん適当すぎてあれだけどものすごい自由に書いてるブログ「檸檬だくだく」もよろしく.寝る前に読める恐ろしくくだらないやつです.
こんなにも一ミリも目を引かれないタイトルを取り扱ってます: ココア20g / ハイチュウとかってさ / なぜ米と小麦を食べようと思ったのかの謎 /