【WordPress】記事保存時にカスタムフィールド値をバリデーションして保存を制御する方法

【WordPress】記事保存時にカスタムフィールド値をバリデーションして保存を制御する方法 WordPress

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では投稿保存時にバリデーションを行うことで、入力ミスや不完全なデータの保存を防ぐことができます。業務用のカスタム投稿やデータベース連携を行うシステムでは特に重要な処理となります。要件に応じて柔軟にバリデーション内容を変更し、安定した運用につなげましょう。