WordPressではカスタムフィールドを活用して投稿に独自の情報を追加できますが、ユーザーの入力ミスや未入力によって意図しないデータが保存されてしまうことがあります。この記事では、投稿保存時に特定のカスタムフィールドに対してバリデーションを行い、条件に合わない場合は保存を中止する方法を紹介します。
functions.phpにバリデーション処理を追加
以下のコードをテーマのfunctions.php
に記述することで、記事保存時にカスタムフィールドの値を検証できます。今回は、カスタムフィールドcf_price
の値が未入力または数値でない場合に保存を中止する例です。
// 投稿保存時のバリデーション処理
function validate_custom_field_before_save($post_id) {
// 自動保存時はスキップ
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// 権限チェック(必要に応じて調整)
if (!current_user_can('edit_post', $post_id)) {
return;
}
// 投稿タイプチェック(投稿に限定する場合)
if (get_post_type($post_id) !== 'post') {
return;
}
// カスタムフィールド値を取得
$price = isset($_POST['cf_price']) ? trim($_POST['cf_price']) : '';
// 数値でなければエラー
if ($price === '' || !is_numeric($price)) {
// 投稿を下書きに変更
remove_action('save_post', 'validate_custom_field_before_save');
wp_update_post(array(
'ID' => $post_id,
'post_status' => 'draft',
));
add_action('save_post', 'validate_custom_field_before_save');
// エラーメッセージを表示(管理画面に通知)
add_filter('redirect_post_location', function ($location) {
return add_query_arg('cf_error', '1', $location);
});
}
}
add_action('save_post', 'validate_custom_field_before_save');
// 保存後にエラーメッセージを表示
function show_custom_field_error_notice() {
if (isset($_GET['cf_error']) && $_GET['cf_error'] == '1') {
echo '<div class="notice notice-error is-dismissible"><p>価格は数値で入力してください。</p></div>';
}
}
add_action('admin_notices', 'show_custom_field_error_notice');
バリデーション対象を変更したい場合
cf_price
の部分を任意のカスタムフィールド名に変更することで、バリデーション対象を柔軟にカスタマイズできます。数値以外の形式(メール形式や日付形式など)を検証したい場合もfilter_var()
やpreg_match()
などを併用することで対応可能です。
まとめ
WordPressでは投稿保存時にバリデーションを行うことで、入力ミスや不完全なデータの保存を防ぐことができます。業務用のカスタム投稿やデータベース連携を行うシステムでは特に重要な処理となります。要件に応じて柔軟にバリデーション内容を変更し、安定した運用につなげましょう。