Установите конкретную цену товара на странице и в корзине Woocommerce для одного товара. - PullRequest
0 голосов
/ 29 мая 2018

В Woocommerce я хотел бы изменить цену определенного продукта (в данном случае с идентификатором 87) как на странице отдельного продукта, так и для связанных товаров в корзине.

Цена продукта должна бытьувеличивается на 10 долл. США, но только на странице одного продукта и только внешне (так что внутренняя цена или цена, установленная в Woocommerce, не изменяется).

Кроме того, эта цена также должна изменяться в корзине, но только если товарыиз определенной категории также нет в корзине.

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

Для функциональности корзины, пока у меня есть, но она не работает - цена корзины выходит на уровне 75 долларов.когда текущая обычная / базовая цена составляет $ 45.Я понятия не имею, откуда приходит 75, когда это должно быть 55.

function wc_cart_custom_price( $cart_object ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

        // set our flag to be false until we find a product in that category
        $cat_check = false;

        // check each cart item for our category
        foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {

            $product = $cart_item['data'];

            // replace 'your-category' with your category's slug
            if ( has_term( 'your-category', 'product_cat', $product->id ) ) {
                $cat_check = true;
                // break because we only need one "true" to matter here
                break;
            }
        }

        // if a product in the cart is in our category, stop there and don't change price
        if ( $cat_check ) {
            return;
        }
        // else continue and alter the product price
        else if ( $cart_item['product_id'] == 87 ) {
            // we have the right product, do what we want
            $price = $cart_item['data']->get_price(); // Get the product price
            $new_price = $price + 10; // the calculation
            $cart_item['data']->set_price( $new_price ); // Set the new price
            }
}
add_action( 'woocommerce_before_calculate_totals', 'wc_cart_custom_price' );

Мой код для изменения цены на странице товара на данный момент:

function wc_change_product_price($price, $product) {
    if ( is_single('87') ) {
        $post_id = $product->id;

        $regular_price = get_post_meta( $post_id, '_regular_price', true);
        $custom_value = ( $regular_price + 10 );
        $price = $custom_value;

    return $price;
    }
}
add_filter('woocommerce_get_price', 'wc_change_product_price', 99);

Этокатастрофа и вызывает ошибку 500 сервера.Что я делаю не так?Любая помощь приветствуется.

Рекомендации:

Изменение цен на товары в корзине WooCommerce версии 3.0

https://rudrastyh.com/woocommerce/change-product-prices-in-cart.html

https://www.skyverge.com/blog/checking-woocommerce-cart-contains-product-category/

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Если вы хотите, чтобы это работало, измените цену товара на странице одного товара.Пожалуйста, следуйте этому коду, я добавил мой код продукта "99":

add_action( 'woocommerce_single_product_summary', 'e_coding_change_simple_product_price_html', 9 );
function e_coding_change_simple_product_price_html() {
    global $product;

// Only for product ID 99
if( $product->get_id() != 99 ) return;

// HERE set your product category term ID, slug or name
$product_category = 'my-book';

// Checking for the product category in cart items loop
foreach ( WC()->cart->get_cart() as $cart_item ) {
    if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
        return; // Product category found ==> We EXIT from this function
}

remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
add_action( 'woocommerce_single_product_summary', 'custom_simple_product_price_html', 10 );
}

function custom_simple_product_price_html(){
global $product;

$addp = 10; // Here the price additional amount

if ( '' !== $product->get_price() && ! $product->is_on_sale() ) {
    $price = wc_price( wc_get_price_to_display( $product ) + $addp ) . $product->get_price_suffix();
}
echo '<p class="price">' . apply_filters( 'woocommerce_get_price_html', $price, $product ) .'</p>';
}

// Add custom calculated price to cart item data

add_filter( 'woocommerce_add_cart_item_data', 'add_cart_simple_product_custom_price', 20, 2 );

function add_cart_simple_product_custom_price( $cart_item_data, $product_id ){

// Only for product ID 87
if( $product_id != 99 )
    return $cart_item_data;

$product = wc_get_product($product_id); // The WC_Product Object

// Only if product is not on sale
if( $product->is_on_sale() )
    return $cart_item_data;

$price = (float) $product->get_price();

// Set the custom amount in cart object
$cart_item_data['new_price'] = $price + 10;

return $cart_item_data;
}


function cw_change_product_price_display( $price ) {

    $price .= ' At Each Item Product';
    return $price;

}

add_filter( 'woocommerce_get_price_html', 'cw_change_product_price_display' );
add_filter( 'woocommerce_cart_item_price', 'cw_change_product_price_display' );
0 голосов
/ 29 мая 2018

Обновление 3 (только для определенного идентификатора продукта)

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

Тогда вам понадобится весь следующий код:

// Change displayed price on single product pages
add_action( 'woocommerce_single_product_summary', 'change_simple_product_price_html', 9 );
function change_simple_product_price_html() {
    global $product;

    // Only for product ID 87
    if( $product->get_id() != 87 ) return;

    // HERE set your product category term ID, slug or name
    $product_category = 't-shirts';

    // Checking for the product category in cart items loop
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
            return; // Product category found ==> We EXIT from this function
    }

    remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
    add_action( 'woocommerce_single_product_summary', 'custom_simple_product_price_html', 10 );
}

function custom_simple_product_price_html(){
    global $product;

    $addp = 10; // Here the price additional amount

    if ( '' !== $product->get_price() && ! $product->is_on_sale() ) {
        $price = wc_price( wc_get_price_to_display( $product ) + $addp ) . $product->get_price_suffix();
    }
    echo '<p class="price">' . apply_filters( 'woocommerce_get_price_html', $price, $product ) . '</p>';
}

// Add custom calculated price to cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_simple_product_custom_price', 20, 2 );
function add_cart_simple_product_custom_price( $cart_item_data, $product_id ){
    // Only for product ID 87
    if( $product_id != 87 ) 
        return $cart_item_data;

    $product = wc_get_product($product_id); // The WC_Product Object

    // Only if product is not on sale
    if( $product->is_on_sale() ) 
        return $cart_item_data;

    $price = (float) $product->get_price();

    // Set the custom amount in cart object
    $cart_item_data['new_price'] = $price + 10;

    return $cart_item_data;
}

// Set custom calculated price to cart
add_action( 'woocommerce_before_calculate_totals', 'set_cart_simple_product_custom_price', 20, 1 );
function set_cart_simple_product_custom_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

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

    // HERE set your product category term ID, slug or name
    $product_category = 't-shirts';

    // 1st cart items Loop: checking for the product category
    foreach ( $cart->get_cart() as $cart_item ) {
        if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
            return; // Product category found ==> We EXIT from this function
    }

    // 2nd Loop: Changing cart item prices (Product category not found)
    foreach ( $cart->get_cart() as $cart_item ) {
        if( isset($cart_item['new_price']))
            $cart_item['data']->set_price( $cart_item['new_price'] );
    }
}

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

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