【WordPress】カスタム投稿ごとに自動採番する連番フィールドの作り方

【WordPress】カスタム投稿ごとに自動採番する連番フィールドの作り方 WordPress

WordPressで予約番号や管理コードなど、投稿に対して一意な連番を自動で付与したいケースは多くあります。この記事では、カスタム投稿ごとに採番される連番フィールドを実装する方法を紹介します。

目的と仕様

以下の仕様を満たす自動採番機能を実装します。

– 投稿タイプごとに採番を独立させる(例:event投稿なら1から、request投稿なら別のカウント)
– 投稿保存時に空のときだけ自動採番
– 投稿が削除されても番号は詰めずに保持

カスタムフィールドの作成

ACFやMeta Boxなどを使って、採番用のカスタムフィールド(例:serial_number)を作成します。ACFの場合は「テキスト」型でOKです。

functions.phpにコードを追加

以下のコードを functions.php に追加してください。


function assign_custom_post_serial_number($post_id) {
  // 自動保存やリビジョンはスキップ
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
  if (wp_is_post_revision($post_id)) return;

  $post = get_post($post_id);

  // 対象の投稿タイプを指定(複数対応可)
  $target_post_types = ['event', 'request'];

  if (!in_array($post->post_type, $target_post_types)) return;

  // すでに採番済みならスキップ
  $serial = get_post_meta($post_id, 'serial_number', true);
  if (!empty($serial)) return;

  // 投稿タイプごとに最大値を取得
  $args = [
    'post_type'      => $post->post_type,
    'posts_per_page' => 1,
    'meta_key'       => 'serial_number',
    'orderby'        => 'meta_value_num',
    'order'          => 'DESC',
    'fields'         => 'ids',
    'post_status'    => ['publish', 'draft'],
  ];

  $query = new WP_Query($args);
  $max = 0;

  if (!empty($query->posts)) {
    $latest_id = $query->posts[0];
    $latest_serial = get_post_meta($latest_id, 'serial_number', true);
    $max = intval($latest_serial);
  }

  $new_serial = $max + 1;

  // 採番を保存
  update_post_meta($post_id, 'serial_number', $new_serial);
}
add_action('save_post', 'assign_custom_post_serial_number');

注意点と拡張

– 採番フィールドが編集できないようにするには、ACFで「読み取り専用」に設定するか、`admin_head` で非表示にするカスタマイズを行います。
– 投稿タイプが増える場合は、$target_post_types に追加してください。

まとめ

カスタム投稿ごとに連番を自動付与することで、投稿管理がしやすくなり、外部連携や業務用途でも役立ちます。WordPressの投稿保存フックとカスタムフィールドを活用すれば、プラグインなしでも実装可能です。