• I use WooCommerce Pricing Rules for variable products with variations.I would like to change it, so that the pricing table only appear when variations IS selected. I have looked in soft79-wc-pricing rules.php, but can not see if it’s possible.

    Is it possible, and can you help?
    Here you can see the code:

    <?php
    /**
     * Plugin Name: SOFT79 Pricing Rules for Woocommerce
     * Plugin URI: https://www.soft79.nl
     * Description: Pricing rules for WooCommerce
     * Version: 1.0.3.0
     * Author: Soft79
     * License: GPL2
     */
    
    //MIN WooCommerce version: 2.1.0
    
    defined('ABSPATH') or die();
    
    //Load text domain
    if ( ! function_exists( 'soft79_wc_pricing_rules_load_plugin_textdomain' ) ) {
        function soft79_wc_pricing_rules_load_plugin_textdomain() {
            load_plugin_textdomain('soft79-wc-pricing-rules', false, basename(dirname(__FILE__)) . '/languages/' );
        }
        add_action('plugins_loaded', 'soft79_wc_pricing_rules_load_plugin_textdomain');
    }
    
    //The main class
    if ( ! class_exists( 'SOFT79_WC_Pricing_Rules_Plugin' ) ) {  
    
        require_once('includes/soft79-rule-helpers.php');
        require_once('includes/soft79-rule-controller.php');
        require_once('includes/soft79-bulk-acumulator.php');
        require_once('includes/abstract-soft79-rule.php');
        require_once('includes/soft79-bulk-rule.php');
        require_once('includes/admin/soft79-wc-pricing-rules-admin.php');
        require_once('includes/admin/class-meta-box-bulk-rules.php');
    
        @include_once('includes/soft79-rule-controller-pro.php');
        //@include_once('includes/soft79-wc-pricing-rules-updater.php');
    
        final class SOFT79_WC_Pricing_Rules_Plugin {
    
            public $admin = null;
    
            public $controller = null;
    
            public $options = array(
            //display
                'show_min_max_price' => true,
                'show_min_max_price_singular' => false,
                'show_cart_itemprice_as_from_to' => false, //Display cart single item price as from_to if bulk discount applies
                'show_cart_subtotal_as_from_to' => false, //Display cart item subtotal as from_to if bulk discount applies
                'pack_price_format' => 0, //0 is unit price, 1 = total price, 2 = both
                'hide_rules_not_in_stock' => true, //Don't load/display rules that can't be used because not enough product stock        
    
            //rules
                'rule_choice' => 'best', //best or first
    
            //misc
                'db_version' => 0 //future: usage for auto database update
            );
    
            public function __construct() {
    
                //error_log("NEW INSTANCE");
                $this->read_options();
                add_action('init', array( &$this, 'controller_init' ));
                if(is_admin()){
                    $this->admin = new SOFT79_Bulk_Pricing_Admin();
                }
    
            }
    
            public function read_options() {
                //Start with default options, overwrite what is read from db
                $db_options = get_option( 'j79_price_rules_settings', array() );
                if ( is_array( $db_options ) ) {
                    foreach( $db_options as $k => $v ) {
                        $this->options[$k] = $v;
                    }
                }
    
            }
    
            protected static $_instance = null;
            /**
             *  Get the single instance
             */
            public static function instance() {
                if ( is_null( self::$_instance ) ) {
                    self::$_instance = new self();
                }
                return self::$_instance;
            }    
    
            public function controller_init() {
                if ( ! class_exists('WooCommerce') ) {
                    return;
                }
    
                if ( class_exists( 'SOFT79_Rule_Controller_PRO' ) ) {
                    $this->controller = new SOFT79_Rule_Controller_PRO( $this->options );
                } else {
                    $this->controller = new SOFT79_Rule_Controller( $this->options );
                }
    
                //Frontend hooks
                add_action( 'wp_enqueue_scripts', array( &$this, 'action_enqueue_scripts' ) );
    
                //CALCULATION: Recalculate price of products in cart
                add_action('woocommerce_before_calculate_totals', array( &$this, 'action_woocommerce_before_calculate_totals'), 10, 0);
                add_action('woocommerce_before_mini_cart', array( &$this, 'action_woocommerce_before_calculate_totals'), 10, 0);
    
                //DISPLAY: Show table on template
                add_action('woocommerce_single_product_summary',  array( &$this, 'action_woocommerce_single_product_summary'), 11 ); //11 is direct na prijs, zie wc-template-hooks.php
    
                //DISPLAY: Show min ... max price of the product
                add_filter('woocommerce_get_price_html', array( &$this, 'action_woocommerce_get_price_html' ), 10, 2);
    
                //For variation update
                add_filter('woocommerce_get_variation_price_html', array( &$this, 'action_woocommerce_get_variation_price_html' ), 10, 2);
                add_filter('woocommerce_available_variation', array( &$this, 'action_woocommerce_available_variation' ), 10, 3);
    
                //DISPLAY: Overwrite cart single item price
                if ( $this->options['show_cart_itemprice_as_from_to'] ) {
                    add_filter( 'woocommerce_cart_item_price', array( &$this, 'filter_woocommerce_cart_item_price' ), 10, 2 );
                }
    
                //DISPLAY: Overwrite cart single item subtotal
                if ( $this->options['show_cart_subtotal_as_from_to'] ) {
                    add_filter( 'woocommerce_cart_item_subtotal', array( &$this, 'filter_item_subtotal' ), 10, 2 );
                }
    
            }
    
            /**
             * Get the plugin url.
             * @return string
             */
            public function plugin_url() {
                return untrailingslashit( plugins_url( '/', __FILE__ ) );
            }    
    
            /**
             * Get the plugin path.
             * @return string
             */
            public function plugin_path() {
                return untrailingslashit( trailingslashit( dirname( __FILE__ ) ) );
            }        
    
            public function action_enqueue_scripts() {
                wp_enqueue_style( 'soft79_bulk_styles', SOFT79_WC_Pricing_Rules_Plugin()->plugin_url() . '/assets/css/frontend.css', array(), "test7" );
            }
    
            //We cheat by setting the product price to bulk price
            function action_woocommerce_before_calculate_totals () {
                $this->controller->execute();
            }
    
            function action_woocommerce_get_price_html( $price, $product ) {
                return $this->price_html( $price, $product );
            }
    
            function action_woocommerce_get_variation_price_html( $price, $variation ) {
                return $this->price_html( $price, $variation );
            }
    
            function price_html( $price, $product ) {
    
                //Min max price to show?
                $show_min_max_price = is_singular('product') ? $this->options['show_min_max_price_singular'] : $this->options['show_min_max_price'];
                if ( $show_min_max_price ) {
                    $prices = array();
                    foreach ( $this->controller->get_valid_rules_for( $product ) as $price_rule ) {
                        $prices = array_merge( $prices, $price_rule->get_price_range( $product ) );
                    }
                    $original_price = $this->controller->get_original_price( $product );
                    if ( count( $prices ) == 0 ) {
                        $prices[] = $original_price;
                    }
                    $min_price = min($prices);
                    $max_price = max($prices);
    
                    if ( $min_price != $max_price ) {
                        if ( ! is_singular('product') && ! $this->options['show_min_max_price'] ) {
                            return $price;
                        }
    
                        if ( is_singular('product') && ! $this->options['show_min_max_price_singular'] ) {
                            return $price;
                        }
                        $suffix = $product->get_price_suffix( $min_price );
                        return sprintf( _x( '%1$s&ndash;%2$s', 'Price range: from-to', 'woocommerce' ), wc_price( $product->get_display_price( $min_price ) ), wc_price( $product->get_display_price( $max_price ) ) ) . $suffix;
                    }
                }
    
                //Sale price to show?
                $sale_price = $this->controller->get_sale_price( $product );
                if ( $sale_price !== false ) {
                    $original_price = $this->controller->get_original_price( $product );
                    return $product->get_price_html_from_to(
                        $product->get_display_price( $original_price ),
                        $product->get_display_price( $sale_price )
                    ) . $product->get_price_suffix( $sale_price );
                }
    
                // elseif ( ( $sale_price = $this->controller->get_sale_price( $product ) ) !== false ) {
                    // $original_price = $this->controller->get_original_price( $product );
                    // //For qty=1 bulk rule show sales price
                    // $price = $product->get_price_html_from_to( $original_price, $sale_price ) . $product->get_price_suffix( $sale_price );
                // }
                return $price;
            }        
    
            public function filter_woocommerce_cart_item_price( $price, $values ) {
                $cart = WC()->cart;
    
                $product = $values['data'];
                if ( $this->controller->is_pricing_rule_applied( $product ) ) {
                    $min_price = $this->controller->get_temp_data( $product, 'stack_min_price' );
                    $max_price = $this->controller->get_temp_data( $product, 'stack_max_price' );
    
                    if ( $min_price !== null && $min_price != $max_price ) {
                        $price = sprintf( _x( '%1$s&ndash;%2$s', 'Price range: from-to', 'woocommerce' ), wc_price( SOFT79_Rule_Helpers::get_cart_taxed_price( $product, $min_price ) ), wc_price( SOFT79_Rule_Helpers::get_cart_taxed_price( $product, $max_price ) ) );
                    }
    
                    $price = $product->get_price_html_from_to(
                        SOFT79_Rule_Helpers::get_cart_taxed_price( $product, $this->controller->get_temp_data( $product, 'original_price') ),
                        $price
                    );
                }
    
                return $price;
            }
    
            public function filter_item_subtotal( $cart_subtotal, $values ) {
                $product = $values['data'];
                if ( $this->controller->is_pricing_rule_applied( $product ) ) {
                    $qty = $values['quantity'];
    
                    $from_price = SOFT79_Rule_Helpers::get_cart_taxed_price( $product, $qty * $this->controller->get_temp_data( $product, 'original_price') );
                    $to_price = SOFT79_Rule_Helpers::get_cart_taxed_price( $product, $qty * $product->get_price() );
    
                    $cart_subtotal = $product->get_price_html_from_to( wc_price( $from_price ), wc_price( $to_price ) );
    
    				// Display "excl tax" or "incl tax"
    				$cart = WC()->cart;
    				if ( $cart->tax_display_cart == 'excl' ) {
    					if ( $cart->tax_total > 0 && $cart->prices_include_tax ) {
    						$cart_subtotal .= ' <small>' . WC()->countries->ex_tax_or_vat() . '</small>';
    					}
    				} else {
    					if ( $cart->tax_total > 0 && !$cart->prices_include_tax ) {
    						$cart_subtotal .= ' <small>' . WC()->countries->inc_tax_or_vat() . '</small>';
    					}
    				}
    
                }
                return $cart_subtotal;
            }
    
            /**
             * Show discount information on single product page
             */
            function action_woocommerce_single_product_summary() {
                global $product;
    
                echo '<div class="soft79-single-product-discount-wrap">';
                foreach ( $this->controller->get_valid_rules_for( $product ) as $rule ) {
                    $rule->render_product_page_html( $product );
                }
                echo '</div>';
    
                //Auto update when switching variation
                if ( $product->is_type( 'variable' ) ) {
                    wp_enqueue_script( 'soft79-single-product-summary', plugins_url( 'assets/js/frontend/single-product-summary.js', __FILE__ ), array( 'jquery' ), '1.0.3.0', true );
                }
            }
    
            /**
             * Used when switching between product variations
             */
            function action_woocommerce_available_variation( $data, $product, $variation ) {
                ob_start();
                foreach ( $this->controller->get_valid_rules_for( $variation ) as $rule ) {
                    $rule->render_product_page_html( $variation );
                }
                $summary = ob_get_contents();
                ob_end_clean();
                $data['j79_soft79_single_product_discount'] = $summary;
                return $data;
            }
    
        } //Main class
    
        function SOFT79_WC_Pricing_Rules_Plugin() {
            return SOFT79_WC_Pricing_Rules_Plugin::instance();
        }
        SOFT79_WC_Pricing_Rules_Plugin();
    } elseif ( ! function_exists( 'soft79_wc_pricing_admin_notice' ) ) {
        add_action( 'admin_notices', 'soft79_wc_pricing_admin_notice' );
        function soft79_wc_pricing_admin_notice() {
            $msg = __( 'Multiple instances of the <i>SOFT79 Pricing Rules for Woocommerce</i>-plugin are activated. Please go to the Plugins-page and disable as required.', 'soft79-wc-pricing-rules' );
            echo '<div class="error"><p>' . $msg . '</p></div>';
        }
    }
    
    // function dd( $data) {
                // echo "<pre>";
            // print_r($data);
                // echo "</pre>";
            // die();
    
    // }

  • The topic ‘WooCommerce Pricing Rules’ is closed to new replies.