Скидка на определенные продукты на основе настраиваемого поля - PullRequest
1 голос
/ 23 мая 2019

Я хочу получить скидку 11% на определенные товары, которые были опубликованы после 2016 года в моем интернет-магазине woocommerce.

Это поле (pub_year) является настраиваемым полем в пользовательской таблице с именем fancyplugin_wc_product_info в wpdb.

Я попробовал некоторый код (который является смешанным кодом из проведенного мною исследования), но безуспешно.

Код, который я пробовал:

function get_price_multiplier() {
    return 100; // 100 the multiplier
}

function get_price_discount() {
    return 11; // 11% discount
}  

add_filter('woocommerce_product_get_price', 'custom_price', 99, 2 );
add_filter('woocommerce_product_get_sale_price', 'custom_price', 99, 2 ); 
function custom_price( $price, $product ) { 
    global $woocommerce, $post, $wpdb; 

    $table_name = $wpdb->prefix . 'fancyplugin_wc_product_info'; 

    $result = ("SELECT * FROM {$table_name} WHERE pub_year >= '2016'"); 

    if( $result ) { 
        $price = $price - (get_price_discount() / get_price_multiplier() * $price); 
    } 
    return $price; 
} 

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Ваш SQL-запрос, использующий класс WPDB, является неполным и неправильным ... Поскольку столбец для идентификатора продукта в таблице wp_fancyplugin_wc_product_info равен post_id, необходимо запросить его для текущего идентификатора продукта ... Попробуйте вместо этого следующее:

function process_sale_price( $price ) {
    $percentage = 11; // 11% discount

    return ( 100 - $percentage ) / 100 * $price;
}

add_filter('woocommerce_product_get_price', 'custom_price', 99, 2 );
add_filter('woocommerce_product_get_sale_price', 'custom_price', 99, 2 );
function custom_price( $price, $product ) {
    global $wpdb;

    $result = $wpdb->get_var( $wpdb->prepare("
        SELECT post_id FROM {$wpdb->prefix}fancyplugin_wc_product_info
        WHERE pub_year >= '2016' AND post_id = %d
    ", $product->get_id() ) );

    if( ! empty($result) ) {
        return process_sale_price( $price );
    }
    return $price;
}

Код помещается в файл functions.php вашей активной дочерней темы (или активной темы).Это должно работать.

0 голосов
/ 23 мая 2019

Если бы я был вами, я бы выполнил процедуру обновления каждого регистра, опубликованного через год после 2016 года, до окончательного диапазона дат, поскольку, если вы будете использовать его только с 2016 года, вы обновите все продукты.

Пример: с 2016 по 2017 год.

Зачем мне создавать процедуру, а не только выполнять обновление в базе данных?

Возможно, в будущем вам нужно будет сделать то же самое, тогда у вас уже есть процедура для этого.

А для безопасности вы можете создать резервную копию таблицы, в которой вы будете сохранять как прежнюю цену продуктов, так и новую. Потому что, если вам нужно сделать откат по цене, у вас есть, где ее получить!

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