Сохранение пользовательских данных с помощью метода WC_Cart add_to_cart() в Woocommerce 3

Я создаю сайт членства и полностью создал статические страницы для каждого плана членства (имею только 3 плана). Тем не менее, я добавил продукты для каждого плана, и когда я нажимаю кнопку «ВЫБЕРИТЕ ПЛАН», я перенаправляюсь на какую-то пользовательскую форму, где я запрашиваю у пользователей диапазон информации, которую мы собираемся использовать для выполнения плана (так же, как и на сайте Nikertub.com).

Я написал код на странице PHP, который будет обрабатывать действие SUBMIT формы. Этот файл PHP, infopage.php, будет обрабатывать данные POST, которые я отправил с помощью вызова POST, и сохранять все эти данные в сеансе WC.

$customer_name = $_POST["customer_name"];
$customer_email = $_POST["customer_email"];
$customer_sex = $_POST["customer_sex"];
$customer_age = $_POST["customer_age"];
$product_id = $_POST["product_id"];

global $wp_session;
$data = array(
       'customer_name' => $customer_name,
       'customer_email'   => $customer_email,
       'customer_sex'  => $customer_sex,
       'customer_age'     => $customer_age);
$wp_session['custom_SESSION_child']=$data;

WC()->session->set('custom_data_child', $data);

//Add product to WooCommerce cart.
WC()->cart->add_to_cart( $product_id )

Однако я не думаю, что приведенный выше код работает. Поскольку я не нахожу ценности в сеансе ни с одной из вышеперечисленных техник. Я использовал wp_session, WC()->session и $_SESSION, но ни один подход не работает.

Я пытаюсь получить доступ к этим значениям в functions.php таким образом,

add_action( 'woocommerce_before_calculate_totals', 'twf_additional_price', 1, 3 );

function twf_additional_price( $cart_object ) {

    global $wpdb;

    global $wp_session;
    $session_data_2 =  $wp_session['custom_SESSION_child'];
    $session_data = WC()->session->get('custom_data_child');
    var_dump($session_data);
    var_dump($session_data2);

    foreach ( $cart_object->cart_contents as $key => $value ) {
        $extra_charge = 0;
        if(isset($value['twf_user_custom_datas'])){
            $extra_charge = 100;
        }

        $value['data']->set_price($value['data']->price + $extra_charge);
    }
}

Пока игнорируйте цикл for. Главное это

var_dump($session_data);
        var_dump($session_data2);

оба дампа только NULL.

Моя основная цель — добавить все вышеперечисленные поля на страницы оформления заказа и оформления заказа Woocommerce.

Пожалуйста, дайте мне знать, что здесь не так. Я знаю, что, возможно, я работаю над очень плохим подходом, но я хочу, чтобы процесс оформления заказа при выборе плана был таким же, как на сайте Nikertub.com. Пожалуйста, дайте мне знать, если есть какой-либо учебник по этому или правильный способ сделать это. Я предпочитаю делать это без плагинов, но я также готов использовать плагины.

Я ценю ваше внимание.


person Paresh Thakor    schedule 06.08.2018    source источник


Ответы (1)


Обновлено. Вместо сеансов следует использовать последний доступный аргумент в WC_Cart add_to_cart(), который позволит вам добавить любые пользовательские данные о позиции в корзине.

Для изменения цены товара в корзине на основе расчетов лучше сделать новый расчет цены заранее и установить его в этих пользовательских данных элемента корзины.

Вместо этого попробуйте следующее:

1) Для вашего кода на странице php:

$custom_data = array(); // Initializing

// Set the posted data as cart item custom data
if( isset($_POST['customer_name']) && ! empty($_POST['customer_name']) )
    $custom_data['custom_data']['name']  = sanitize_text_field( $_POST['customer_name'] );
if( isset($_POST['customer_email']) && ! empty($_POST['customer_email']) )
    $custom_data['custom_data']['email'] = sanitize_text_field( $_POST['customer_email'] );
if( isset($_POST['customer_sex']) && ! empty($_POST['customer_sex']) )
    $custom_data['custom_data']['sex']   = sanitize_text_field( $_POST['customer_sex'] );
if( isset($_POST['customer_age']) && ! empty($_POST['customer_age']) )
    $custom_data['custom_data']['age']   = sanitize_text_field( $_POST['customer_age'] );

// Set the calculated item price as custom cart item data
if( isset($custom_data['custom_data']) && sizeof($custom_data['custom_data']) > 0 && $product_id > 0 ) {
    // Get an instance of the WC_Product object
    $product = wc_get_product( $product_id );
    // Save the new calculated price as custom cart item data
    $custom_data['custom_data']['new_price'] = $product->get_price() + 100;
}

// Add product to cart with the custom cart item data
WC()->cart->add_to_cart( $product_id, '1', '0', array(), $custom_data );

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


2) Ваша пересмотренная функция, которая изменит цену товара в корзине:

add_action( 'woocommerce_before_calculate_totals', 'custom_cart_item_price', 30, 1 );
function custom_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach ( $cart->get_cart() as $cart_item ) {
        if( isset($cart_item['custom_data']['new_price']) )
            $cart_item['data']->set_price( $cart_item['custom_data']['new_price'] );
    }
}

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

Все другие пользовательские данные элемента корзины доступны под ключом элемента корзины 'custom_data' в виде индексированного массива... Таким образом, вы сможете легко получить эти данные из объекта корзины, чтобы сохранить их в заказе.

person LoicTheAztec    schedule 06.08.2018
comment
Спасибо @loictheaztec за ответ. Я делаю это и отвечу вам о результатах. Однако я не хочу обновлять цену с помощью своих пользовательских данных. Мои пользовательские данные будут только информационными вещами от клиентов. - person Paresh Thakor; 06.08.2018
comment
одна вещь, с которой я сталкиваюсь, это то, что я не получаю ссылку на WC(), что означает, что я не могу вызвать add_to_cart(). Я создал файл .php где-то еще в папке моего проекта. Не могли бы вы рассказать мне, как я могу включить эти функции Woocommerce в свой собственный файл .php? - person Paresh Thakor; 06.08.2018
comment
@PareshThakor WC()->cart похож на старый global $woocommerce; + $woocommerce->cart… Так что я не знаю, что еще сказать. Я проверил код этого ответа, и он отлично работает для меня. Если вы не получаете объект Woocommerce, пытающийся, например, var_dump( WC() ); в вашем проекте файла php, это означает, что есть другая проблема, которая не имеет ничего общего с этим вопросом. - person LoicTheAztec; 06.08.2018
comment
Большое спасибо за Вашу помощь. Ты действительно спас меня. Я создал отдельную PHP-страницу, которая была вне сектора Woocommerce, теперь require_once("../wp-load.php"); все работало как часы. Ваш код также работал нормально. Теперь таргетинг страницы заказа. Я распечатал все значения на странице оформления заказа, теперь мне нужно передать эти значения для заказа, когда пользователь нажимает кнопку «Разместить заказ». У вас есть идеи, как добавить эти значения в Order? Я смотрю некоторые видео или учебники, но получаю платные расширения. - person Paresh Thakor; 06.08.2018
comment
Привет, @LoicTheAztec..! Я уже принял ответ. По крайней мере, это очевидно. Тем не менее, дайте мне знать, если вы можете помочь мне в чем-либо, чтобы передать эти данные в форму заказа и область администратора. Тем не менее, я могу опубликовать вопрос, чтобы принять ответ. Сообщите мне об этом. Спасибо еще раз за помощь. - person Paresh Thakor; 06.08.2018
comment
Привет @LoicTheAztec! Я создал вопрос для метаданных заказа здесь. stackoverflow.com/questions/51712831/ - person Paresh Thakor; 06.08.2018