Как создать уникальную корзину для всех клиентов / мобильных устройств с пользовательским Woocommerce Rest Api? - PullRequest
0 голосов
/ 01 ноября 2019

Мы создали пользовательские интерфейсы wp / woocommerce rest для собственного реагирующего мобильного приложения. Но у нас есть проблемы с операциями с корзиной woocommerce. Корзина смешивается с гостями и вошедшими в систему пользователями. Мы не знаем, как мы можем создать уникальную корзину для всех мобильных устройств / клиентов. Мы отправляем запросы с помощью axios от Reaction native.

Я думаю, что проблема может быть связана со следующим кодом. Мы используем этот код, чтобы заставить API работать. Когда axios (реагирует на родную) отправку запросов, мы устанавливаем с параметромCredentials значение true для кокисов.

https://wordpress.org/support/topic/fatal-error-after-update-3-6-2/

https://barn2.co.uk/managing-cart-rest-api-woocommerce-3-6/

    private function maybe_load_cart()
    {
        if (version_compare(WC_VERSION, '3.6.0', '>=') && WC()->is_rest_api_request()) {
            require_once(WC_ABSPATH . 'includes/wc-cart-functions.php');
            require_once(WC_ABSPATH . 'includes/wc-notice-functions.php');
            require_once(WC_ABSPATH . 'includes/class-wc-checkout.php');

            if (null === WC()->session) {
                $session_class = apply_filters('woocommerce_session_handler', 'WC_Session_Handler');

                if (false === strpos($session_class, '\\')) {
                    $session_class = '\\' . $session_class;
                }

                WC()->session = new $session_class();
                WC()->session->init();
            }

            if (is_null(WC()->customer)) {
                if (is_user_logged_in()) {
                    WC()->customer = new WC_Customer(get_current_user_id());
                } else {
                    //get_current_user_id() result is 0 if not logged-in
                    WC()->customer = new WC_Customer(get_current_user_id(), true);
                }

                add_action('shutdown', array( WC()->customer, 'save' ), 10);
            }

            if (null === WC()->cart) {
                WC()->cart = new WC_Cart();
            }
        }
    }

Мы пытались отключить постоянную картуно не работает.

https://github.com/woocommerce/woocommerce/pull/19027

add_filter( 'woocommerce_persistent_cart_enabled', function(){return false;} );

Мы пытались заблокировать постоянную корзину, но не работали.

function remove_persistent_cart($value, $id, $key) {
    if ($key == '_woocommerce_persistent_cart_' . get_current_blog_id()) {
        return false;
    }
    return $value;
}
add_filter('get_user_metadata', 'remove_persistent_cart', 10, 3);
add_filter('update_user_metadata', 'remove_persistent_cart', 10, 3);
add_filter('add_user_metadata', 'remove_persistent_cart', 10);

Мы пытались использовать уникальный user_id, если пользователь не вошел в систему, ноне работает.

WC()->customer = new WC_Customer(WC()->session->generate_customer_id(), true);

Мы пытались использовать собственный сеанс php для корзины, но у нас ничего не получилось. Его смешивание с сеансом woocommerce при создании нового объекта WC_Cart.

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

...