【WordPress】記事更新時にフックで記事内容を修正する(save_post)

WordPressのアクションフックを使って、記事内容を置換する処理が必要になって対応したので、それのメモ書きとして残しておきます。

サンプルコード

今回、修正した内容は記事投稿本文にhttpから始まるURLがある場合は、記事を保存した時にhttpsに置換するコードとなっています。

add_action('save_post', 'update_post');
function update_post() {
  remove_action('save_post', 'update_post');

  // 記事本文を投稿か更新のときのみ実行する
  if(!empty($_POST['publish']) || !empty($_POST['save'])){
      $post_content = str_replace("http://", "https://", $_POST["post_content"]);
      $args = array(
          'post_title' => $_POST['post_title'],
          'post_content' => $post_content,
          'post_status' => $_POST['post_status'],
          'post_name' => $_POST['post_name'],
          'post_author' => $_POST['post_author'],
      );
      // 記事更新処理
      wp_update_post($args);
  }

   add_action('save_post', 'update_post');
}

remove_actionadd_actionが変な感じになっていますが、codexのサンプルコードにも書いてあるので正しいやり方みたい。これがないとループしまい処理が正常に動きません。

save_postのフックアクションは、ゴミ箱へ移動したときにも処理が行われてしまいます。$_POST[‘publish’]は記事を「公開」「予約投稿」の時、$_POST[‘save’]は「更新」「下書き」の時に設定されるので、どちらかに値が設定されていた場合のみ、処理を行うようにしています。

$_POST[“post_content”]に投稿される内容が格納されているので、それを元に追記なり置換なり自分の行いたい処理を記載すればOKです。このサンプルコードでは、「http://」を「https://」に置換処理を行っています。

※2018/5/29追記

個別に各々パラメータを指定するやり方では、漏れがありいろいろ不具合が発生してしまった。以下のように$_POSTを丸々コピーして、書き換えたい部分だけ修正してそのままパラメータにやるやり方が正しそうということに後日気づいたので追記しました。

add_action('save_post', 'update_post');
function update_post() {
  remove_action('save_post', 'update_post');

  // 記事本文を投稿か更新のときのみ実行する
  if(!empty($_POST['publish']) || !empty($_POST['save'])){
      $args = $_POST;
      $post_content = str_replace("http://", "https://", $_POST["post_content"]);
      $args['post_content'] = $post_content;
      // 記事更新処理
      wp_update_post($args);
  }

   add_action('save_post', 'update_post');
}

注意事項

更新したい記事本文以外にも$_POST[‘post_title’]などの4つのパラメータに設定していますが、これがないと投稿時に新しく付けたタイトルが反映されなかったり、新規投稿から公開にステータス変更できないなどの不具合がありました。

例としては基本的なものは設定していますが、WordPressの設定によっては必要なパラメータが異なると思います。実装する際は、POSTパラメータ($_POST)の中身をチェックして必要なものをwp_update_postのパラメータに設定してください。

最後に

更新する記事本文の取得方法がわからず、少しハマりました。$_POSTに保存されてることさえわかればっていう感じでした。

僕と同じようなハマり方をしてる人は居ないかと思いますが、もしも1人でも参考になる人がいたら嬉しいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です