ПОЛУЧИТЕ и установите индивидуальную цену продукта при добавлении в корзину через URL-адрес в WooCommerce - PullRequest
1 голос
/ 17 июня 2020

Я пытаюсь передать параметр сайту Woocommerce, используя URL-адрес - например:

site/?custom_p=77 будет URL-адресом.

вот мой код

add_filter('woocommerce_product_get_price', 'custom_price', 99, 2 );
add_filter('woocommerce_product_get_regular_price', 'custom_price', 99, 2 );
function custom_price( $cprice, $product ) {
    // Delete product cached price  (if needed)
    wc_delete_product_transients($product->get_id());
    // Get the data from the GET request
$custom_p=$_GET['custom_p'];
    return ($custom_p) ;
}

URL добавить в корзину site/?add-to-cart=455&custom_p=77

Проблема, когда я объявляю номер 77 напрямую, он работает $custom_p=77, но объявление $_GET['custom_p'] дает в результате ноль в корзине.

1 Ответ

0 голосов
/ 17 июня 2020

Ваши переменные GET теряются при изменении URL-адреса, поэтому все цены на товары становятся пустыми, потому что вы также не нацеливаетесь на продукт, который был добавлен в корзину.

В этом случае вам необходимо включить и использовать Переменная сеанса WooCommerce для хранения идентификатора продукта и специальной цены при обнаружении переменной custom_p GET. Затем вы можете использовать эту переменную сеанса WooCommerce для изменения цены продукта.

Сначала мы обнаруживаем и сохраняем необходимые данные в переменной WC_Session:

// get and set the custom product price in WC_Session
add_action( 'init', 'get_custom_product_price_set_to_session' );
function get_custom_product_price_set_to_session() {
    // Check that there is a 'custom_p' GET variable
    if( isset($_GET['add-to-cart']) && isset($_GET['custom_p']) 
    && $_GET['custom_p'] > 0 && $_GET['add-to-cart'] > 0 ) {
        // Enable customer WC_Session (needed on first add to cart)
        if ( ! WC()->session->has_session() ) {
            WC()->session->set_customer_session_cookie( true );
        }
        // Set the product_id and the custom price in WC_Session variable
        WC()->session->set('custom_p', [
            'id'    => (int) wc_clean($_GET['add-to-cart']),
            'price' => (float) wc_clean($_GET['custom_p']),
        ]);
    }
}

Тогда есть 2 способа изменить цену товара, добавленного в корзину (выберите только один)

Вариант 1 - Изменение цены товара напрямую:

// Change product price from WC_Session data
add_filter('woocommerce_product_get_price', 'custom_product_price', 900, 2 );
add_filter('woocommerce_product_get_regular_price', 'custom_product_price', 900, 2 );
add_filter('woocommerce_product_variation_get_price', 'custom_product_price', 900, 2 );
add_filter('woocommerce_product_variation_get_regular_price', 'custom_product_price', 900, 2 );
function custom_product_price( $price, $product ) {
    if ( ( $data = WC()->session->get('custom_p') ) && $product->get_id() == $data['id'] ) {
        $price = $data['price'];
    }
    return $price;
}

Вариант 2 - Изменить цену товара в корзине:

// Change cart item price from WC_Session data
add_action( 'woocommerce_before_calculate_totals', 'custom_cart_item_price', 20, 1 );
function custom_cart_item_price( $cart ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Must be required since Woocommerce version 3.2 for cart items properties changes
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // Looo through our specific cart item keys
    foreach ( $cart->get_cart() as $cart_item ) {
        // Get custom product price for the current item
        if ( ( $data = WC()->session->get('custom_p') ) && $cart_item['data']->get_id() == $data['id'] ) {
            // Set the new product price
            $cart_item['data']->set_price( $data['price'] );
        }
    }
}

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

ИСПОЛЬЗОВАНИЕ переменных URL: www.example.com/?add-to-cart=37&custom_p=75

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