Исключить продукты из раскрывающегося списка продуктов Woocommerce с различными ценами - PullRequest
1 голос
/ 06 мая 2019

В WooCommerce, основываясь на " Woocommerce, получить код продукта варианта " , я использовал следующее, чтобы показать цену каждого варианта в раскрывающихся списках моих переменных продуктов:

add_filter( 'woocommerce_variation_option_name', 'display_price_in_variation_option_name' );
function display_price_in_variation_option_name( $term ) {
    global $wpdb, $product;

    $result = $wpdb->get_col( "SELECT slug FROM {$wpdb->prefix}terms WHERE name = '$term'" );

    $term_slug = ( !empty( $result ) ) ? $result[0] : $term;

    $query = "SELECT postmeta.post_id AS product_id
        FROM {$wpdb->prefix}postmeta AS postmeta
        LEFT JOIN {$wpdb->prefix}posts AS products ON ( products.ID = postmeta.post_id )
        WHERE postmeta.meta_key LIKE 'attribute_%'
        AND postmeta.meta_value = '$term_slug'
        AND products.post_parent = $product->id";

    $variation_id = $wpdb->get_col( $query );

    $parent = wp_get_post_parent_id( $variation_id[0] );

    if ( $parent > 0 ) {
        $_product = new WC_Product_Variation( $variation_id[0] );
        return $term . ' (' . woocommerce_price( $_product->get_price() ) . ')';
    }
    return $term;
}

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

Можно ли исключить один конкретный идентификатор продукта или категорию продукта, ИЛИ чтобы он мог применяться только к определенным категориям продуктов? Если так, что следует добавить в код и где это применить?

Я также использую плагин Woo Discount Rules для скидок, и для этого есть код:

function woocs_fixed_raw_woocommerce_price_method($tmp_val, $product_data, $price){
    remove_filter('woocs_fixed_raw_woocommerce_price', 'woocs_fixed_raw_woocommerce_price_method', 10, 3);
    global $flycart_woo_discount_rules;
    if(!empty($flycart_woo_discount_rules)){
        global $product;
        if(empty($product)){
            $discount_price = $flycart_woo_discount_rules->pricingRules->getDiscountPriceOfProduct($product_data);
            if($discount_price !== null) $tmp_val = $discount_price;
        }
    }
    add_filter('woocs_fixed_raw_woocommerce_price', 'woocs_fixed_raw_woocommerce_price_method', 10, 3);

    return $tmp_val;
}
add_filter('woocs_fixed_raw_woocommerce_price', 'woocs_fixed_raw_woocommerce_price_method', 10, 3);

1 Ответ

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

Обновлено (для использования плагина Woo Discount Rules - см. В конце)

Ваш код несколько устарел после замены WooCommerce 3: woocommerce_price()по wc_Price()

В следующем пересмотренном коде вы сможете исключить некоторые идентификаторы продуктов:

// for woocommerce 3+
add_filter( 'woocommerce_variation_option_name', 'display_price_in_variation_option_name' );
function display_price_in_variation_option_name( $term_name ) {
    global $product, $wpdb;

    if( ! is_a($product, 'WC_Product') )
        return $term_name;

    // Excluding product IDs
    $excluded_product_ids = array(37, 53);
    if( in_array( $product->get_id(), $excluded_product_ids ) )
        return $term_name;

    if( $product->is_type('variable') && ! empty($term_name) ) {
        $term_slug = $wpdb->get_var("SELECT slug FROM {$wpdb->prefix}terms WHERE name = '$term_name'");

        $term_slug = empty($term_slug) ? sanitize_title( $term_name ) : $term_slug;

        $variation_id = (int) $wpdb->get_var( $wpdb->prepare("
            SELECT postmeta.post_id AS product_id
            FROM {$wpdb->prefix}postmeta AS postmeta
            LEFT JOIN {$wpdb->prefix}posts AS products
                ON ( products.ID = postmeta.post_id )
            WHERE postmeta.meta_key LIKE 'attribute_%'
                AND postmeta.meta_value = '%s'
                AND products.post_parent = %d
        ", $term_slug, $product->get_id() ) );

        if( $variation_id > 0 ){
            $variation = wc_get_product( $variation_id );

            $term_name .= ' (' . strip_tags( wc_price( wc_get_price_to_display( $variation ) ) ) . ')';
        }
    }
    return $term_name;
}

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


Возможно, чтобы заставить его работать с плагином Woo Discount Rules , попробуйте заменить:

$term_name .= ' (' . strip_tags( wc_price( wc_get_price_to_display( $variation ) ) ) . ')';

на:

$term_name .= ' (' . strip_tags( wc_price( $variation->get_price() ) ) . ')';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...