Не могу справиться с проппером - PullRequest
0 голосов
/ 24 февраля 2020

В моем плагине я пытаюсь изменить данные заказа ($ total частности) в зависимости от нажатия дублированных кнопок «Разместить заказ» с пользовательскими атрибутами значения и имени, которые находятся в элементе формы> страницы оформления заказа. В качестве значения атрибута action в файле form-checkout. php указывается URL страницы оформления заказа. Так что я не могу понять, где это обрабатывается. Где можно получить эти переменные $ _POST? Реально ли реализовать его через плагин? Как? Я буду безумно рад за каждый совет. Версия для Wordpress - 5.3.2. Версия Woocommerce - 3.5

<?php 
/**
 * Plugin Name: 2buttonsplug
 * Description: Description
 * Plugin URI: http://#
 * Author: Author
 * Author URI: http://#
 */

/*
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'];

}
*/
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 );

function change_total_on_checking( $order ) {
    $total = $order->get_total();
    $new_total = $total * 1.12;
    $order->set_total( $new_total );

}


?>

И форма-касса. php строка 32:

<form name="checkout" method="post" class="checkout woocommerce-checkout" action="<?php echo esc_url( wc_get_checkout_url() ); ?>" enctype="multipart/form-data">

1 Ответ

0 голосов
/ 25 февраля 2020

Я пока не могу комментировать.

Исходя из моего опыта, оформление заказа выполняется с помощью 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'])){
    ...
  }
 }
}

...