WooCommerce Ajax добавить в корзину с дополнительными пользовательскими данными - PullRequest
0 голосов
/ 06 мая 2020

У меня возникают некоторые трудности при попытке добавить в корзину пользовательские данные из внешнего интерфейса.

Мой текущий PHP из внутреннего интерфейса выглядит следующим образом - он помещен в мои функции. php для моей дочерней темы (этот код взят из следующего сообщения: Добавление продукта в корзину с пользовательской информацией и ценой - учитывая, что я действительно PHP -noob ie):

<?php // This captures additional posted information (all sent in one array)
add_filter('woocommerce_add_cart_item_data','wdm_add_item_data',1,10);
function wdm_add_item_data($cart_item_data, $product_id) {

    global $woocommerce;
    $new_value = array();
    $new_value['_custom_options'] = $_POST['custom_options'];

    if(empty($cart_item_data)) {
        return $new_value;
    } else {
        return array_merge($cart_item_data, $new_value);
    }
}

// This captures the information from the previous function and attaches it to the item.
add_filter('woocommerce_get_cart_item_from_session', 'wdm_get_cart_items_from_session', 1, 3 );
function wdm_get_cart_items_from_session($item,$values,$key) {

    if (array_key_exists( '_custom_options', $values ) ) {
        $item['_custom_options'] = $values['_custom_options'];
    }

    return $item;
}

// This displays extra information on basket & checkout from within the added info that was attached to the item.
add_filter('woocommerce_cart_item_name','add_usr_custom_session',1,3);
function add_usr_custom_session($product_name, $values, $cart_item_key ) {

    $return_string = $product_name . "<br />" . $values['_custom_options']['description'];// . "<br />" . print_r($values['_custom_options']);
    return $return_string;

}

//This adds the information as meta data so that it can be seen as part of the order (to hide any meta data from the customer just start it with an underscore)
add_action('woocommerce_add_order_item_meta','wdm_add_values_to_order_item_meta',1,2);
function wdm_add_values_to_order_item_meta($item_id, $values) {
    global $woocommerce,$wpdb;

    wc_add_order_item_meta($item_id,'item_details',$values['_custom_options']['description']);
    wc_add_order_item_meta($item_id,'customer_image',$values['_custom_options']['another_example_field']);
    wc_add_order_item_meta($item_id,'_hidden_field',$values['_custom_options']['hidden_info']);

} 

, а затем у меня есть кнопка на интерфейсе, которая запускает следующий сценарий при нажатии - он запускается в настраиваемом сообщении wordpress, где я написал сценарий, в фоновом режиме выполнял некоторые сценарии, которые собирают информацию на основе действий пользователей на post:

function cartData() {
        var metaData = {
            description: 'My test Description'
            another_example_field: 'test'
        };

        var activeVariationId = 10335;      

        var data = {
            action: 'wdm_add_item_data',
            product_id: 10324,
            "add-to-cart": 10324,
            quantity: 1,
            variation_id: activeVariationId,
            cart_item_data: metaData
        };

        $.ajax({
            type: 'post',
            url: wc_add_to_cart_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'add-to-cart' ),
            data: data,
            beforeSend: function (response) {
                //$thisbutton.removeClass('added').addClass('loading');
            },
            complete: function (response) {
                //$thisbutton.addClass('added').removeClass('loading');
            },
            success: function (response) {

                if (response.error & response.product_url) {
                    window.location = response.product_url;
                    return;
                } else {
                    alert('ajax response recieved');
                    jQuery( document.body ).trigger( 'added_to_cart', [ response.fragments, response.cart_hash ] );
                }
            },
        });
    }

К сожалению, это только кажется добавлением моего текущего варианта продукта в корзину без какой-либо дополнительной информации. Мы будем очень признательны за любую помощь с вложением в этот вопрос. Если вам нужна дополнительная информация и / или примеры кода, я буду рад ее предоставить :)

1 Ответ

0 голосов
/ 06 мая 2020

Думаю, я мог бы решить эту проблему или, по крайней мере, ее часть с помощью этого PHP (на самом деле это всего лишь небольшая модификация этого кода - добавление $ cart_item_data https://quadmenu.com/add-to-cart-with-woocommerce-and-ajax-step-by-step/):

add_action('wp_ajax_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');
add_action('wp_ajax_nopriv_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');

function woocommerce_ajax_add_to_cart() {

    $product_id = apply_filters('woocommerce_add_to_cart_product_id', absint($_POST['product_id']));
    $quantity = empty($_POST['quantity']) ? 1 : wc_stock_amount($_POST['quantity']);
    $variation_id = absint($_POST['variation_id']);
    // This is where you extra meta-data goes in
    $cart_item_data = $_POST['meta'];
    $passed_validation = apply_filters('woocommerce_add_to_cart_validation', true, $product_id, $quantity);
    $product_status = get_post_status($product_id);

    // Remember to add $cart_item_data to WC->cart->add_to_cart
    if ($passed_validation && WC()->cart->add_to_cart($product_id, $quantity, $variation_id, $cart_item_data) && 'publish' === $product_status) {

        do_action('woocommerce_ajax_added_to_cart', $product_id);

        if ('yes' === get_option('woocommerce_cart_redirect_after_add')) {
            wc_add_to_cart_message(array($product_id => $quantity), true);
        }

        WC_AJAX :: get_refreshed_fragments();
    } else {

        $data = array(
            'error' => true,
            'product_url' => apply_filters('woocommerce_cart_redirect_after_error', get_permalink($product_id), $product_id));

        echo wp_send_json($data);
    }

    wp_die();
}

Где это часть JS -функции:

var data = {
                action: 'woocommerce_ajax_add_to_cart',
                product_id: 10324,
                quantity: 1,
                variation_id: activeVariationId,
                meta: metaData
            };

            $.ajax({
                type: 'post',
                url: wc_add_to_cart_params.ajax_url,
                data: data, ...........

Мне нужно будет протестировать это еще немного, поскольку теперь кажется, что все поля данных также помещается в корзину, электронное письмо и т. д. c - мне, вероятно, придется что-то переписать, чтобы некоторые части были скрыты для "неадминистратора", но были доступны для меня позже + добавление пользовательского эскиза продукта при добавлении в корзину .

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