AJAX добавляет пользовательские метаданные заказа продукта со страницы одного продукта - PullRequest
0 голосов
/ 03 июля 2019

Я создал процесс добавления в корзину, который успешно создает поле «персонализация» при добавлении товара в корзину.Используя стандартную кнопку «Добавить в корзину», страница перезагружается и все хорошо.Я хотел улучшить UX, сделав обновление корзины через AJAX, которое я реализовал и снова работал нормально.

Тем не менее, это останавливает регистрацию метаданных данных корзины, поскольку запрос не определен - ловушка больше не может захватывать входные значения со страницы.Хук, который я использую для определения и записи мета-полей, называется 'woocommerce_add_cart_item_data'

. Я попытался создать свою собственную отдельную функцию AJAX для отдельного определения содержимого поля, используя $ _SESSION вместо $ _REQUEST (вдохновленотаким ответом -> как передать ajax-данные в фильтр woocommerce? )

К сожалению, это, похоже, срабатывает после запуска woocommerce_add_cart_item_data, поэтому метаданные не проходят (фактически этозаканчивается отображением следующего добавленного продукта, поскольку переменная определена поздно и к ней не будет доступа, пока не будет добавлен второй продукт).

Я бы очень признателен за помощь:) Внесение изменений в код, чтобы woocommerce_add_cart_item_data мог получать данные из выполненного мной действия добавления AJAX в корзину AJAX, или

(2) Изменить мой пользовательский вызов AJAX, чтобы данные сеанса могли применяться в своевременном порядке.(не уверен, что это достижимо на основании того, что я видел до сих пор).

// Create AJAX add to cart button
function add_cart_btn($prod) {
            echo apply_filters( 'woocommerce_loop_add_to_cart_link',
                sprintf( '<a href="%s" rel="nofollow" data-product_id="%s" data-product_sku="%s" class="single-product__details-cta button %s product_type_%s ajax_add_to_cart" name="add_to_cart">Add to bag</a>',
                    esc_url( $prod->add_to_cart_url() ),
                    esc_attr( $prod->id ),
                    esc_attr( $prod->get_sku() ),
                    $prod->is_purchasable() ? 'add_to_cart_button' : '',
                    esc_attr( $prod->product_type ),
                    esc_html( $prod->add_to_cart_text() )
                ),
            $prod );
        }
        add_cart_btn($product);



// functions.php

/* Saves field data */
function save_add_custom_info_field( $cart_item_data, $product_id ) {
    if( isset( $_REQUEST['custom_info_message'] ) ) {

        // *** $_REQUEST['custom_info_message'] not defined ***
        $cart_item_data[ 'custom_info_message' ] = $_REQUEST['custom_info_message'];
        $cart_item_data['unique_key'] = md5( microtime().rand() );
    }
    return $cart_item_data;
}
add_action( 'woocommerce_add_cart_item_data', 'save_add_custom_info_field', 10, 2 );

/* Renders field entry on cart and checkout */
function render_mssg_meta_on_cart_and_checkout( $cart_data, $cart_item = null ) {
    $custom_items = array();
    if( !empty( $cart_data ) ) {
        $custom_items = $cart_data;
    }
    if( isset( $cart_item['custom_info_message'] ) ) {
        $custom_items[] = array( "name" => 'Personalisation / Customisation', "value" => $cart_item['custom_info_message'] );
}
    return $custom_items;
}
add_filter( 'woocommerce_get_item_data', 
'render_mssg_meta_on_cart_and_checkout', 10, 2 );


// *** Attempted solution with AJAX - Use $_SESSION['message'] in 'save_add_custom_info_field' function above instead of $_REQUEST... delivered after 'woocommerce_add_cart_item_data' so doesn't work

function set_customised_message() {

    $message = $_POST['message'];

    define( 'DOING_AJAX', true );
    if ( ! defined( 'WP_ADMIN' ) ) {
        define( 'WP_ADMIN', true );
    }

    session_start();
    $_SESSION['message'] = $message;

    echo $message;

    die();

}

Я ожидаю, что пользовательская мета будет отображаться настраницы корзины / оформления заказа, но это не связано с тем, что переменная либо $ cart_item ['custom_info_message'] не определена, либо переменная сеанса из вызова AJAX недоступна.

1 Ответ

0 голосов
/ 04 июля 2019

Мне удалось решить эту проблему, обновив метаданные продукта после его добавления в корзину (через AJAX) - изменив функцию set_customised_message выше. Обратите внимание, что для вызова AJAX требовалась задержка тайм-аута в 1 с.

Оставьте это здесь на случай, если у кого-то еще возникнет подобная проблема.

function set_customised_message() {
    $cart = WC()->cart->cart_contents;

 foreach( $cart as $cart_item_id=>$cart_item ) {
     echo $cart_item['unique_key'];
 $cart_item['custom_info_message'] = $message;
 echo $cart_item['custom_info_message'];
 WC()->cart->cart_contents[$cart_item_id] = $cart_item;
 }
 WC()->cart->set_session();
}

Спасибо https://pluginrepublic.com/how-to-update-existing-woocommerce-cart-meta-data/ за это решение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...