WordPressで記事を保存する際に記事の内容を強制的に変更する。

例えば特定の権限に属してる人とかそういう人が記事を保存した際に強制的にカテゴリーを指定したいとか、本文に特定の情報を付加したいとか、そういう時のお話。

記事を保存する際に、投稿された記事に対して、強制的になんらかのカスタマイズをして保存したい際には、save_postフックで、 wp_update_post() 関数を実行します。

Function Reference/wp update post « WordPress Codex

例えば以下のサンプルでは、記事を保存する際に強制的に”公開”にしようとしています。(笑)
ワイルドだろー。

<?php
/*
 * 男に下書きという文字はねーぜ!
 */

add_action('save_post', 'force_update_post');

function force_update_post() {
    $args = array('post_status' => 'publish');
    wp_update_post($args); // 無限ループしちゃう...
}

ところが実際にこれを実行したら、無限ループになっちゃいました。

なんでだろう?と思ったら、wp_update_post() の際に save_post フックがファイヤーされちゃうようです。

というわけで、正しくは以下の様な感じです。

<?php
/*
 * 男に下書きという文字はねーぜ!
 */

add_action('save_post', 'force_update_post');

function force_update_post() {
    remove_action('save_post', 'force_update_post');
    $args = array('post_status' => 'publish');
    wp_update_post($args);
    add_action('save_post', 'force_update_post');
}

要は、save_post フックに追加したアクションを、一時的に取り除いてもう一回追加するわけです。

なんかダサイけど、WPerのバイブルCodexに書いてあるんだからしょうがないです。

Plugin API/Action Reference/save post « WordPress Codex

追記

facebookでカズさんからツッコミがあったので追記。

保存前なら、wp_insert_post_data っていうフックがあるそうです。

<?php
function filter_handler( $data , $postarr )
{
  $data['post_status'] = 'publish'; // 漢に二言はねー!
  return $data;
}

add_filter( 'wp_insert_post_data' , 'filter_handler' , '99', 2 );