【WordPress】特定のカスタムフィールドが空なら下書きに戻す自動処理の実装

【WordPress】特定のカスタムフィールドが空なら下書きに戻す自動処理の実装 WordPress

WordPressでは、入力必須のカスタムフィールドが空のままでも投稿を公開できてしまうため、重要な情報の入力漏れを防ぐために自動で「下書き」に戻す処理を入れたいケースがあります。

この記事では、特定のカスタムフィールドが未入力のまま保存された場合に、投稿ステータスを自動で「draft(下書き)」に変更する方法を紹介します。

使用するフック:save_post

投稿が保存されたタイミングでカスタム処理を実行するために、save_postアクションを利用します。
このフックに登録することで、保存時のカスタムフィールドチェックとステータス変更が可能になります。

カスタムフィールド未入力時に自動で下書きに戻すコード例

以下は、カスタムフィールドrequired_fieldが空の場合に投稿を下書きへ変更するサンプルコードです。

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

  // 投稿タイプを限定(例:post)
  if (get_post_type($post_id) !== 'post') return;

  // 対象カスタムフィールドの値を取得
  $value = get_post_meta($post_id, 'required_field', true);

  // 未入力なら下書きに変更
  if (empty($value)) {
    // 一時的にフックを解除して再帰防止
    remove_action('save_post', 'revert_to_draft_if_field_empty');

    // 投稿ステータスを下書きに更新
    wp_update_post(array(
      'ID'          => $post_id,
      'post_status' => 'draft',
    ));

    // 再度フックを有効化
    add_action('save_post', 'revert_to_draft_if_field_empty');
  }
}
add_action('save_post', 'revert_to_draft_if_field_empty');

投稿タイプを指定する方法

カスタム投稿タイプ(例:product)にだけ適用したい場合は、以下のように変更します。

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

この条件を使えば、他の投稿タイプには影響を与えず、目的の投稿タイプだけを制御できます。

複数のフィールドを対象にする方法

以下のように配列で複数のフィールドを指定し、どれか一つでも空なら下書きにする処理も可能です。

$required_fields = array('price', 'stock', 'sku');
foreach ($required_fields as $key) {
  if (empty(get_post_meta($post_id, $key, true))) {
    // 下書きに戻す処理
  }
}

ユーザーへの注意喚起メッセージを表示するには

保存後に「下書きに戻された」理由を管理者に伝えたい場合、admin_noticesフックを使って通知を表示することも可能です。例:

function show_required_field_notice() {
  if (isset($_GET['missing_field'])) {
    echo '<div class="notice notice-error"><p>必須項目が未入力のため、下書きに戻しました。</p></div>';
  }
}
add_action('admin_notices', 'show_required_field_notice');

wp_update_post()実行時にmissing_field=1などのクエリを付与してリダイレクトすれば、投稿画面に注意文を表示できます。

まとめ

WordPressのsave_postフックを使うことで、カスタムフィールドの入力チェックとステータス制御を自動化できます。
これにより、必須項目の入力漏れを防ぎ、運用の品質を保つことができます。

ACFなどのUIと併用すれば、ユーザーにやさしいフォーム設計と自動処理を両立することも可能です。ぜひ活用して、効率的でミスの少ない記事管理環境を構築してください。