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