如何实现WordPress自定义文章类型标题自动递增+1?
WordPress发票自动递增编号解决方案
我正在用WordPress的**CPT(自定义文章类型)和ACF(高级自定义字段)**搭建发票管理工具,需求是创建新发票文章时自动生成递增编号的标题:比如第一篇为Invoice #10001,下一篇自动变为Invoice #10002。目前已实现标题前缀的自动生成,但不知道如何获取上一篇的编号并加1。
现有代码
function zozson_filter_post_title( $data, $postarr, $unsanitized_postarr, $update){ // 仅针对invoices自定义文章类型 if( $data['post_type'] !== 'invoices' ){ return $data; } // 如果已有标题则不修改 if( $data['post_title'] !== '' ){ return $data; } // 构建标题前缀 $post_title = ' Invoice #'; // 临时使用固定随机数 $random_number = '10'; // 拼接完整标题 $post_title.= $random_number; // 设置文章标题 $data['post_title'] = $post_title; return $data; } add_filter( 'wp_insert_post_data', 'zozson_filter_post_title',50,4);
修改后的实现代码
function zozson_filter_post_title( $data, $postarr, $unsanitized_postarr, $update){ // 仅针对invoices自定义文章类型生效 if( $data['post_type'] !== 'invoices' ){ return $data; } // 如果文章已有自定义标题,跳过自动生成逻辑 if( $data['post_title'] !== '' ){ return $data; } // 设置发票起始编号 $start_number = 10001; $new_invoice_number = $start_number; // 查询最新创建的发票文章(包含草稿、待审状态,避免重复编号) $latest_invoice = get_posts(array( 'post_type' => 'invoices', 'posts_per_page' => 1, 'orderby' => 'ID', 'order' => 'DESC', 'post_status' => array('publish', 'draft', 'pending') )); if( !empty($latest_invoice) ){ // 从最新发票标题中提取编号 $latest_title = $latest_invoice[0]->post_title; if( preg_match('/#(\d+)/', $latest_title, $matches) ){ $last_number = intval($matches[1]); $new_invoice_number = $last_number + 1; } } // 构建最终发票标题 $data['post_title'] = "Invoice #{$new_invoice_number}"; return $data; } add_filter( 'wp_insert_post_data', 'zozson_filter_post_title', 50, 4);
关键逻辑说明
- 查询最新发票:通过
get_posts按文章ID倒序查询,确保拿到最近创建的发票(包含草稿、待审状态,避免用户存草稿后再发布时生成重复编号) - 提取编号:用正则表达式
preg_match匹配标题中#后的数字部分,准确获取上一个编号 - 初始状态处理:如果还没有任何发票文章,直接使用预设的起始编号(比如10001)
- 标题生成:将递增后的编号与前缀组合,替换原有的随机数逻辑
内容的提问来源于stack exchange,提问作者Josh Blackwelder
相关产品推荐
相关产品推荐

