save_postアクションで投稿を編集【WordPress】
公開日:こんにちは、ゆきまるです。
投稿の公開、更新時に自動的に修正を加えるような仕組みを実装したい場合、save_post
というアクションフックが使えます(もっといい方法があるかもしれません。)
今回はその方法をご紹介します。
save_postで編集するコード
とりあえずコードを載せておきます。下で解説しますね。
function edit_post($post_ID, $post, $update) {
/* 登録したフックを外しておかないと無限ループになる */
remove_action('save_post', 'insert_toc', 99, 3);
/* $postから必要なデータをとり編集する */
/* content以外もあります */
$post->post_content = $post->post_content . 'hoge';
/* 更新するための配列を用意 */
$my_post = array(
'ID' => $post_ID, /* IDは必須 */
'post_content' => $post->post_content, /* 必要なものを任意で */
);
/* wp_update_post関数で投稿を更新 */
wp_update_post($my_post);
/* 外したフックを再度つける */
add_action('save_post', 'insert_toc', 99, 3);
}
add_action('save_post', 'edit_post', 99, 3);
ソースコードを解説
アクションフックに関数を登録
最後の行でアクションフックを登録しています。
3つ目の引数「99」はプライオリティというものです。よくわからないので適当につけています。よいこはマネしないでください。
4つ目の引数「3」はフックされた関数が受け入れることのできる引数の数です。save_post
にフックさせる場合、下記の3つの変数が受け取れます。
- $post_ID
-
投稿IDが格納されている。更新時にどの投稿か指定する際に必要。
- $post
-
投稿データが格納されている。
Codex – WP_Postにあるようなメンバー変数を取得できる。
あくまで投稿後のデータにアクセスしているだけなので、更新する際は
wp_update_post
を使う。 - $update
-
既存の投稿時は
true
、新規投稿時はfalse
が入っている。新規か投稿かで変更内容を変えたい場合はこれを使おう!
$postに変更を加える
$post
のメンバー変数には、
- スラッグ( post_name )
- タイトル(post_title)
- 本文(post_content)
- etc…..
など、投稿の各要素にアクセスできます。以下参照。
これらに変更を加えましょう。
wp_update_postで投稿を更新
更新データを以下のようにまとめます。
$my_post = array(
'ID' => $post_ID, /* IDは必須 */
'post_content' => $post->post_content, /* 必要なものを任意で */
);
$my_post
という名前は何でもいいです。
IDは必須で、その下に変更したいデータを付け加えてください。
$post
と同じメンバー名で大丈夫です。
詳細はこちら → Codex – wp_update_post
アクションフックは一旦外しておく
wp_update_post
を実行すると投稿が更新されるわけなので、再度save_post
アクションフックが発火して無限ループになってしまいます。
そうならないために、wp_update_post
より前で、remove_action
。後で、add_actionを書いておきましょう。
変数は、そのままコピペしてください。
まとめ
今回使ったのは、アクションフックなので、返り値とかはありません。
更新は、wp_update_post
で行っています。
このアクションフックは投稿が保存された直後に実行されるみたいなので、本当は更新とかじゃなくて変更内容を通知とかしたい場合に向いているのかもしれません。