Я пока не могу комментировать.
Исходя из моего опыта, оформление заказа выполняется с помощью Ajax вызова сервера. Теперь я не верю, что вы можете изменить общее, как вы это делаете, так как порядок не воссоздается. Если вы посмотрите на официальную тему Storefront, вы увидите анимацию загрузки. Это означает, что заказ проверяется, но он уже был создан, поэтому woocommerce_checkout_create_order не будет вызываться. Вы могли бы реализовать пользовательский платежный шлюз .
Во-вторых, я не думаю, что вы можете просто установить общую сумму заказа, поскольку он может быть пересчитан на основе позиций заказа. Также, если вы установили его, вы должны вызвать $ order-> save (); Чтобы сохранить детали.
Я рекомендую вам применить купон, если вы снижаете цену, цену заказа или комиссию, если вы увеличиваете ее.
Вы, вероятно, можете управлять суммой заказа на странице корзины, а не на странице оформления заказа. Добавьте свои кнопки на страницу корзины и на основе этой нажатой кнопки примените действие к заказу.
Примечание: в вашем коде вы должны указать глобальный $ gj вне функции mega_function. Также имя кнопки - get_lucky_order, а get_extra_lucky_order не get_for_price_2 и get_for_price_3
...
global $gj;
$gj=0;
add_action('admin_post_get_for_price_2','mega_function');
add_action('admin_post_get_for_price_3','mega_function');
function mega_function() {
global $gj;
$gj=$_POST['get_for_price_2']; // value gets set after the action hook gets called, $gj will not have a new value
}
add_action( 'woocommerce_checkout_after_order_review', 'second_place_order_button', 5 );
function second_place_order_button() {
$order_button_text = 'get_for_price_2';
echo '<button type="submit" class="button alt" name="get_lucky_order" id="place_order" value="' . esc_attr( $order_button_text ) . '" data-value="' . esc_attr( $order_button_text ) . '">' . esc_html( $order_button_text ) . '</button>';
$order_button_text = 'get_for_price_3';
echo '<button type="submit" class="button alt" name="get_extra_lucky_order" id="place_order" value="' . esc_attr( $order_button_text ) . '" data-value="' . esc_attr( $order_button_text ) . '">' . esc_html( $order_button_text ) . '</button>';
}
//woocommerce_checkout_create_order
add_action( 'woocommerce_checkout_create_order', 'change_total_on_checking', 20, 1 ); // --> if $gj == 0 this doesn't have a valid callback, change_total_on_checking is never defined
if($gj){ --> this will always be 0 even if global is set, because mega_function is called way after this line of code
function change_total_on_checking( $order ) {
$total = $order->get_total();
$new_total = $total * 1.12;
$order->set_total( $new_total );
}
}
, если вам нужна проверка, пропустите мега-функцию.
add_action( 'woocommerce_checkout_after_order_review', 'second_place_order_button', 5 );
function second_place_order_button() {
// you know the value don't sanitize it and use esc_html__('get_for_price_2',__YOUR__TEXT_DOMAIN); in case you want translations
echo '<button type="submit" class="button alt" name="get_lucky_order" id="place_order" value="get_for_price_2" data-value="get_for_price_2">' . esc_html__('get_for_price_2', __YOUR__TEXT_DOMAIN ) . '</button>';
echo '<button type="submit" class="button alt" name="get_extra_lucky_order" id="place_order" value="get_for_price_3" data-value="get_for_price_3">' . esc_html__( 'get_for_price_3', __YOUR__TEXT_DOMAIN ). '</button>';
}
//woocommerce_checkout_create_order
$gj=false;
if(isset($_POST['get_lucky_order'])){ // use the name, not the value
$gj=$_POST['get_lucky_order'];
} else if(isset($_POST['get_extra_lucky_order'])){
$gj=$_POST['get_extra_lucky_order'];
}
if($gj){
add_action( 'woocommerce_checkout_create_order', 'change_total_on_checking', 20, 1 );
function change_total_on_checking( $order ) {
$total = $order->get_total();
$new_total = $total * 1.12;
$order->set_total( $new_total );
$order->save();
}
}
Надеюсь, это поможет!
РЕДАКТИРОВАТЬ 1:
Вы можете установить для отладки значение true и посмотреть, какие значения фактически опубликованы.
/ wp-config. php
...
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
/* That's all, stop editing! Happy publishing. */
...
Теперь вы можно использовать error_log ($ value); Посмотрите в /wp-content/debug.log все ошибки и уведомления
/ wp-content / plugings / - your - pluging - / file. php
...
//woocommerce_checkout_create_order
//add the action hook always
add_action( 'woocommerce_checkout_create_order', 'change_total_on_checking', 20, 1 );
// might also want to use woocommerce_checkout_update_order_meta instead, since
// after woocommerce_checkout_create_order the order is saved by woocommerce based on the old instance
// not the new one from you
function change_total_on_checking( $order ) {
error_log(print_r($_POST,true)); // go to debug.log after checkout update and see what has been returned in the logs
if(isset($_POST['get_lucky_order'])){
$total = $order->get_total();
$new_total = $total * 1.12;
$order->set_total( $new_total );
$order->save();
} else if(isset($_POST['get_extra_lucky_order'])){
...
}
}
}