Отправить свою цену в корзину из произвольного поля

196
28 октября 2017, 17:47

Вопрос заключается в следующем. Настряпал код который перемножает цену товара на определенный курс, по заданному признаку и записывает новую цену в произвольное поле 'rrp_price':

    function my_woocommerce_get_price($price, $_product) {
$rooms2 = get_post_meta(get_the_ID(), 'rooms2', true );
$kurs = 1;
$kurs2 = 10;
$kurs3 = 100;
if ($rooms2 == 1) {
    $new_price = $price * $kurs2;
    update_post_meta(get_the_ID(), "rrp_price", $new_price );

return $new_price;
} elseif ($rooms2 == 2) {
    $new_price = $price * $kurs3;
    update_post_meta(get_the_ID(), "rrp_price", $price );

return $new_price;

} else {
    update_post_meta(get_the_ID(), "rrp_price",  $price ); // в последствии произвольное поле используется для сортировки по возрастанию/убыванию
}
return $price;
}

add_filter('woocommerce_get_price', 'my_woocommerce_get_price',100,2);
add_filter('woocommerce_product_variation_get_price', 'my_woocommerce_get_price',100,2);
add_filter('woocommerce_get_regular_price', 'my_woocommerce_get_price',100,2);
add_filter('woocommerce_product_variation_get_regular_price', 'my_woocommerce_get_price',100,2);
add_filter('woocommerce_get_variation_price', 'my_woocommerce_get_price',100,2);
add_filter('woocommerce_get_variation_regular_price', 'my_woocommerce_get_price',100, 2);
add_filter( 'filter_woocommerce_variation_prices', 'my_woocommerce_get_price', 10, 3 );

Где rooms2 - это еще одно произвольное поле куда заносится признак (1,2,3 и т.д) Все работает как для простого так и для вариативного товара (за исключекнием того что в вариациях, в произвольных полях 'rrp_price' (в админке) показана новая цена только одной вариации, хотя на сайте у каждой своя). Вопрос стоит в том чтобы отправить цену из произвольного поля в корзину (так как там отображается старая)?

Answer 1

Добавьте такой код в functions.php вашей темы. Ваш код уберите - все эти хуки лишние.

function get_rrp_price( $price, $product_id ) {
    $rooms2 = get_post_meta( $product_id, 'rooms2', true );
    if ( '' === $rooms2) {
        $rooms2 = 1; // значение по умолчанию, если нет мета-поля
    }
    $kurs = 1;
    $kurs2 = 10;
    $kurs3 = 100;
    // Впоследствии произвольное поле rrp_price используется для сортировки по возрастанию/убыванию
    switch ( $rooms2 ) {
        case 1:
            $rrp_price = $price * $kurs2;
            break;
        case 2:
            $rrp_price = $price * $kurs3;
            break;
        default:
            $rrp_price = $price * $kurs;
            break;
    }
    return $rrp_price;
}
function filter_woocommerce_get_price( $price, $_this ) {
    $product_id = $_this->id;
    $rrp_price = get_rrp_price( $price, $product_id );
    update_post_meta( $product_id, 'rrp_price', $rrp_price );
    return $rrp_price;
}
function filter_736700_woocommerce_product_variation_get_price( $price, $_this) {
    if ( 'product_variation' === $_this->post_type ) {
        $data            = (object) $_this->get_data();
        $variation_price = $data->price;
        $product_id       = $data->parent_id;
        $variation_rrp_price = get_rrp_price( $variation_price, $product_id );
        $price = $variation_rrp_price;
    }
    return $price;
}
add_filter( 'woocommerce_product_variation_get_price', 'filter_736700_woocommerce_product_variation_get_price', 10, 2);
function filter_736700_woocommerce_variation_prices( $prices_array, $product, $include_taxes ) {
    // Смените значения в $prices_array
    $product_id = $product->id;
    foreach ( $prices_array['price'] as $key => $price ) {
        $prices_array['price'][ $key ] = get_rrp_price( $price, $product_id );
    }
    foreach ( $prices_array['regular_price'] as $key => $price ) {
        $prices_array['price'][ $key ] = get_rrp_price( $price, $product_id );
    }
    foreach ( $prices_array['sale_price'] as $key => $price ) {
        $prices_array['price'][ $key ] = get_rrp_price( $price, $product_id );
    }
    return $prices_array;
}
add_filter( 'woocommerce_variation_prices', 'filter_736700_woocommerce_variation_prices', 10, 3 );

Код работает везде - и для простого товара, и для вариативного. Работает как на странице товара, так и в корзине. В поле rrp2 пишется только одна цена для любого товара.

Вот снимок корзины

Цена обоих товаров умножена на 10 ($kurs2).

READ ALSO
Как сделать, чтобы Post id выводился не test.ru/city/28…?

Как сделать, чтобы Post id выводился не test.ru/city/28…?

как сделать, чтобы Post id выводился не testru/city/28 , хотелось бы test

159
MySQL: Too many connections

MySQL: Too many connections

Здравствуйте

193
При переходе на другой url не сохраняется $_SERVER['PHP_AUTH_USER'] и $_SERVER['PATH_AUTH_PW']

При переходе на другой url не сохраняется $_SERVER['PHP_AUTH_USER'] и $_SERVER['PATH_AUTH_PW']

ЗдравствуйтеСделала http аутентификациюю Она работает, но почему-то при переходе на url другого вида выбивается ошибка о том, что $_SERVER['PHP_AUTH_USER']...

178