Есть ли какая-нибудь функция, которая может изменить номер заказа в DB & admin в woocommerce? - PullRequest
0 голосов
/ 31 января 2019

Номер заказа не найден в базе данных после добавления префикса в идентификатор заказа

Я использовал приведенный ниже код, и он работает нормально только для администратора.Но когда я отправляю этот заказ, я получаю номер заказа с ошибкой, который не найден.

add_filter( 'woocommerce_order_number', 'change_woocommerce_order_number' );

function change_woocommerce_order_number( $order_id ) {
    $prefix = 'CK-';
    $new_order_id = $prefix . $order_id;
    return $new_order_id;
}

Администратор и электронные письма с указанием номера заказа с префиксом, таким как номер моего заказа 101, будут сохранены в базе данных с идентификатором заказа 101, но егопоказывает на передней части CK-101.Но когда я отправляю этот заказ, идентификатор заказа CK-101 не найден в базе данных и выдает мне ошибку.

Пожалуйста, помогите.Заранее спасибо.

1 Ответ

0 голосов
/ 01 февраля 2019

Ваша функция просто добавляет префикс в 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/

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...