work.log

元エンジニアの備忘録的ブログ

WordPressの投稿・更新内容をフックで強制変更する

投稿:2013-06-12 16:57  更新:

WordPress で記事を投稿・更新する際に、投稿データを強制変更する方法を調べてみました。

今回は、投稿の作成・編集画面の “公開・更新” ボタンを押した際にフックで内容を書き換えてみたいと思います。

とりあえず、タイトル・本文等の “投稿データ” とカテゴリ・タグ等の “タクソノミー” を強制変更する方法を以下に記載します。

投稿データをwp_insert_post_dataでフックする

投稿データをフックして書き換える方法はいくつかあるみたいですが、調べてみると wp_insert_post_data が使い勝手が良さそうなので試してみます。

functions.php に以下のコードを追加して “投稿タイトル” を強制変更してみます。

function replace_post_data($data, $postarr){
    $data['post_title'] = 'wp_insert_post_dataで強制書き換え';
    return $data;
}
add_filter('wp_insert_post_data', 'replace_post_data', '99', 2);

次に、管理画面の新規投稿から以下のように入力してみます。

新規投稿 公開前

wordpress-plugin-development-003-01

入力完了後は “公開” ボタンを押して記事を反映させてみます。

新規投稿 公開後

wordpress-plugin-development-003-02

タイトルを強制的に変更する事ができました。

$data と $postarr の二つの配列についてですが、$data は投稿画面から入力した内容が $postarr には DB に保存されている内容が入るみたいです。(新規投稿だったら $postarr は空)

wp_insert_post_data は DB に書き込まれる前に実行されるフックですので、$data の書き換えたい箇所を指定する必要があります。$data の配列には以下の様なデータが格納されています。

  • post_author
  • post_date
  • post_date_gmt
  • post_content
  • post_content_filtered
  • post_title
  • post_excerpt
  • post_status
  • post_type
  • comment_status
  • ping_status
  • post_password
  • post_name
  • to_ping
  • pinged
  • post_modified
  • post_modified_gmt
  • post_parent
  • menu_order
  • guid

ざっとですが大体の事は wp_insert_post_data を使えば出来そうです。ただし、タクソノミー関連以外はここでは触れないみたいなので以下で別の方法を試してみました。

タクソノミーをwp_set_object_termsでフックする

タクソノミーは wp_set_object_terms 関数を publish_post のアクションフックを使って書き換えてみました。

function replace_post_terms($post_id) {
    wp_set_object_terms($post_id, array(2, 8), 'category', true);
    wp_set_object_terms($post_id, array('hoge'), 'post_tag', true);
}
add_action('publish_post', 'replace_post_terms', 99, 1);

wp_set_object_terms 関数の使い方

wp_set_object_terms($1, $2, $3, $4);

  • $1 = post id
  • $2 = term id もしくは term name を配列で指定
  • $3 = タクソノミー名。category, post_tag 等
  • $4 = 追加する場合は ture, $2 で指定した物以外を削除するには false

公開状態で投稿・更新した場合のみですが上記でカテゴリ・タグを強制的に適用することができます。

publish_future_post を使えば予約投稿にも対応できそうなのですが、開発環境では予約投稿に失敗してしまってうまく確認できず未検証です。

簡単ですが、WordPress の投稿・更新内容をフックで強制変更するについては以上になります。

参考にしたページ

WordPress Codex – Plugin API/Action Reference
WordPress Codex – Plugin API/Filter Reference/wp insert post data
WP関数『wp_insert_post』に含まれるフィルターフック3つ

おすすめのVPSサーバ

  • OSが選べる
  • VPS同士でLANが組める
  • 複数台構成向き

このブログで使っています。

  • 転送量が多いサービスに
  • 借りてるのは3年間一度もdown無し!

よく見られている記事

  • 本日
  • 週間
  • 月間