【WordPress】投稿保存時に自動でカスタムフィールドを設定・初期化する方法

【WordPress】投稿保存時に自動でカスタムフィールドを設定・初期化する方法 WordPress

WordPressでカスタムフィールド(投稿メタ)を使って情報を管理している場合、「新規投稿時に特定のカスタムフィールドを自動で設定しておきたい」「未入力のフィールドに初期値を入れておきたい」といった要望はよくあります。

本記事では、投稿の保存時にカスタムフィールドを自動で設定・初期化する方法を紹介します。

save_postフックを使って保存時に処理を実行する

WordPressでは、投稿が保存される際にsave_postアクションが呼び出されます。このフックを使えば、保存のたびに任意の処理を自動実行できます。

以下のコードは、投稿にstatus_flagというカスタムフィールドが未設定の場合、自動で「pending」という値を保存する例です。

function auto_set_custom_field_on_save($post_id) {
  // 自動保存・リビジョン・ゴミ箱移動時は除外
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
  if (wp_is_post_revision($post_id)) return;
  if (get_post_status($post_id) === 'trash') return;

  // 投稿タイプが 'post' のみ対象
  if (get_post_type($post_id) !== 'post') return;

  // すでに設定済みであればスキップ
  if (get_post_meta($post_id, 'status_flag', true) === '') {
    update_post_meta($post_id, 'status_flag', 'pending');
  }
}
add_action('save_post', 'auto_set_custom_field_on_save');

特定のカスタム投稿タイプだけに適用する

投稿タイプを限定したい場合は、get_post_type($post_id)で条件分岐します。たとえば、projectというカスタム投稿タイプにのみ適用したい場合は以下のようにします。

if (get_post_type($post_id) !== 'project') return;

この条件により、他の投稿タイプへの影響を避けることができます。

複数のカスタムフィールドを初期化する例

以下は、複数のカスタムフィールドをチェックし、未設定であれば初期値を自動で設定する例です。

function initialize_custom_fields($post_id) {
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
  if (wp_is_post_revision($post_id)) return;

  $defaults = array(
    'status_flag' => 'pending',
    'priority'    => 'normal',
    'view_count'  => 0,
  );

  foreach ($defaults as $key => $value) {
    if (get_post_meta($post_id, $key, true) === '') {
      update_post_meta($post_id, $key, $value);
    }
  }
}
add_action('save_post_project', 'initialize_custom_fields');

このコードでは、カスタム投稿タイプprojectに対してsave_post_projectフックを使用し、特定のフィールドを一括で初期化しています。

注意点とベストプラクティス

  • 自動保存処理DOING_AUTOSAVE)を除外しないと意図しない動作になる可能性があります
  • すでに値が入力済みのフィールドには上書きしない設計にすると安全です
  • 管理画面の更新・保存操作のたびに発火するため、必要最小限の処理にとどめましょう

まとめ

投稿保存時にカスタムフィールドを自動設定・初期化することで、入力漏れを防ぎ、データの統一性を保つことができます。運用ルールが決まっているプロジェクトや、複数人で投稿を管理する場合に特に有効です。

save_postアクションを活用して、柔軟なフィールド管理を行いましょう。