You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 21:00:22