#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 Теперь вы можете удалить свой комментарий по мере обновления кода… Спасибо 🙂