save_postアクションで投稿を編集【WordPress】

こんにちは、ゆきまるです。

投稿の公開、更新時に自動的に修正を加えるような仕組みを実装したい場合、save_postというアクションフックが使えます(もっといい方法があるかもしれません。)

今回はその方法をご紹介します。

  1. save_postで編集するコード
  2. ソースコードを解説
    1. アクションフックに関数を登録
    2. $postに変更を加える
    3. wp_update_postで投稿を更新
    4. アクションフックは一旦外しておく
  3. まとめ

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…..

など、投稿の各要素にアクセスできます。以下参照。

Codex – WP_Post

これらに変更を加えましょう。

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で行っています。

このアクションフックは投稿が保存された直後に実行されるみたいなので、本当は更新とかじゃなくて変更内容を通知とかしたい場合に向いているのかもしれません。

最近の記事