Обновление статуса заказа через AJAX на странице получения заказа WooCommerce

#php #jquery #ajax #wordpress #woocommerce

#php #jquery #ajax #wordpress #woocommerce

Вопрос:

Я пытаюсь изменить статус моих заказов woocommerce с обработки на завершено, когда клиент нажимает кнопку на странице благодарности через AJAX.

Мой код выглядит следующим образом:

 $.ajax({
    type: 'post',
    dataType: 'json',
    url: ajax_url,
    data: {action: 'redeem_complete'},
    success: function(response){
        alert("Order data successfully fetched.");                      
    }
});
  

и php в моем functions.php

 add_action( 'wp_ajax_redeem_complete', 'fairbooks_redeem_complete');
add_action( 'wp_ajax_nopriv_redeem_complete', 'fairbooks_redeem_complete');

function fairbooks_redeem_complete($order_id){
        
    $order = wc_get_order( $order_id ); 
    $order->update_status( 'completed' );
    echo 'test';
    die();
}
  

Я знаю, что ajax работает без $order->update_status( 'completed' ); инструкции, но при этом я получаю внутреннюю ошибку сервера 500. Я также знаю, что если я не использую ajax и не подключаюсь к странице благодарности, это меняет статус без проблем. Что вызывает ошибку или, возможно, есть лучший способ сделать это. Заранее спасибо!

Ответ №1:

Вам необходимо передать идентификатор заказа из вашего кода javascript в PHP, поскольку он не определен в вашей функции приемника PHP WordPress Ajax, поэтому обычно выдается ошибка 500, поскольку $order переменная не определена, и выдает ошибку при использовании метода update_status() .

Следующий полный пример основан на вашем коде (и работает без ошибок):

 add_action( 'woocommerce_thankyou', 'customer_completes_order_thankyou' );
function customer_completes_order_thankyou( $order_id ) {
    $order = wc_get_order( $order_id );
     // print_r($order->get_status()); // Uncomment for testing
    ?>
    <div><button class="button alt complete-status"><?php _e("Complete your order"); ?></button><br><br>
    <span class="response" style="color:green;"></span></div>
    <script type="text/javascript">
    jQuery(function($){
        if (typeof woocommerce_params === 'undefined')
            return false;

        $('button.complete-status').click( function(e){
            e.preventDefault();

            $.ajax({
                type: 'POST',
                dataType: 'json',
                url: woocommerce_params.ajax_url,
                data: {
                    'action': 'redeem_complete',
                    'order_id': <?php echo $order_id; ?>, // Here we send the order Id
                },
                success: function (response) {
                    $('.response').text("Order data successfully fetched.");
                    console.log("Order data successfully fetched.");
                }
            });
        });
    });
    </script>
    <?php
}

add_action( 'wp_ajax_redeem_complete', 'fairbooks_redeem_complete');
add_action( 'wp_ajax_nopriv_redeem_complete', 'fairbooks_redeem_complete');
function fairbooks_redeem_complete(){
    if ( isset($_POST['order_id']) amp;amp; $_POST['order_id'] > 0 ) {
        $order = wc_get_order($_POST['order_id']);
        $order->update_status('completed');
        die();
    }
}
  

Ввод кода functions.php файл вашей активной дочерней темы (или активной темы). Протестировано и работает.

Комментарии:

1. Огромное спасибо! Некоторое время я был в полном тупике. Прими мою благодарность

2. @user2059376 Теперь вы можете удалить свой комментарий по мере обновления кода… Спасибо 🙂