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の投稿保存フックとカスタムフィールドを活用すれば、プラグインなしでも実装可能です。