woocommerce中是否有任何功能可以更改数据库和管理员中的订单号?

时间:2019-01-31 07:00:50

标签: wordpress woocommerce

在订单ID中添加前缀后在数据库中找不到订单号

我使用了以下代码,它仅对管理员有效。但是当我发送该订单时,却找不到错误的订单号。

<label>
  <input type="checkbox" name="" />
  <span class="cb-icon"></span>
</label>

<label>
  <input type="checkbox" name="" />
  <span class="cb-icon"></span>
</label>

管理员和显示订单号带有前缀(例如我的订单号)为101的电子邮件 它将保存在订单号为101的数据库中,但显示在前端CK-101上。但是当我发送该订单时,在数据库中找不到订单ID CK-101,并向我发送错误消息。

请帮助。 预先感谢。

1 个答案:

答案 0 :(得分:-1)

您的函数仅在admin,前端,电子邮件等中添加前缀,但不在数据库中添加。因此,您会收到错误消息。

使用以下功能将其保存到数据库中

add_action( 'wp_insert_post', 'set_sequential_order_number', 10, 2 );
add_action( 'woocommerce_process_shop_order_meta', 'set_sequential_order_number', 10, 2 );

function set_sequential_order_number( $post_id, $post ) {
    global $wpdb;

    if ( 'shop_order' === $post->post_type && 'auto-draft' !== $post->post_status ) {

        $order        = wc_get_order( $post_id );
        $order_number = self::get_order_meta( $order, '_order_number' );

        if ( '' === $order_number ) {

            // attempt the query up to 3 times for a much higher success rate if it fails (due to Deadlock)
            $success = false;

            for ( $i = 0; $i < 3 && ! $success; $i++ ) {

                // this seems to me like the safest way to avoid order number clashes
                $query = $wpdb->prepare( "
                    INSERT INTO {$wpdb->postmeta} (post_id, meta_key, meta_value)
                    SELECT %d, '_order_number', IF( MAX( CAST( meta_value as UNSIGNED ) ) IS NULL, 1, MAX( CAST( meta_value as UNSIGNED ) ) + 1 )
                        FROM {$wpdb->postmeta}
                        WHERE meta_key='_order_number'",
                    $post_id );

                $success = $wpdb->query( $query );
            }
        }
    }
}

或使用下面的插件,其中包括所有功能,包括您已经在使用的功能

https://wordpress.org/plugins/woocommerce-sequential-order-numbers/

希望有帮助。