همین امروز به جمع 3001 کاربر ویژه ما بپیوندید و هزاران منابع سایت را دانلود کنید.


اضافه کردن مالیات ،تخفیف،درصد به قیمت Gravity Forms

سلام دوستان

گرویتی فرمز یکی از افزونه های منعطف و کاربردی وردپرس میباشد.
در این آموزش قصد داریم اعمال تخفیف به محصول و همچنین متغیرهایی نظیر مالیات و … برای قیمت نهایی را آموزش دهیم.
در واقع شما میتوانید همانند ووکامرس و Easy digital Downloads قیمت خود را بر اساس پارامترهای گوناگون متغیر نمایید.

نمونه ی تخفیف محصول در Gravity Forms  :

 

آموزش اعمال تخفیف و مالیات در Gravity Fomrs :

۱ – ابتدا در قالب خود به Function.php این کد را ضافه میکنید : (قبل از هر اقدامی ، از فایل Function.php خود ، نسخه پشتیبان تهیه کنید.)

class GWCalcSubtotal {
    public static $merge_tag = '{subtotal}';
    function __construct() {
        // front-end
        add_filter( 'gform_pre_render', array( $this, 'maybe_replace_subtotal_merge_tag' ) );
        add_filter( 'gform_pre_validation', array( $this, 'maybe_replace_subtotal_merge_tag_submission' ) );
        // back-end
        add_filter( 'gform_admin_pre_render', array( $this, 'add_merge_tags' ) );
    }
    /**
    * Look for {subtotal} merge tag in form fields 'calculationFormula' property. If found, replace with the
    * aggregated subtotal merge tag string.
    *
    * @param mixed $form
    */
    function maybe_replace_subtotal_merge_tag( $form, $filter_tags = false ) {
        
        foreach( $form['fields'] as &$field ) {
            
            if( current_filter() == 'gform_pre_render' && rgar( $field, 'origCalculationFormula' ) )
                $field['calculationFormula'] = $field['origCalculationFormula'];
            
            if( ! self::has_subtotal_merge_tag( $field ) )
                continue;
            $subtotal_merge_tags = self::get_subtotal_merge_tag_string( $form, $field, $filter_tags );
            $field['origCalculationFormula'] = $field['calculationFormula'];
            $field['calculationFormula'] = str_replace( self::$merge_tag, $subtotal_merge_tags, $field['calculationFormula'] );
        }
        return $form;
    }
    
    function maybe_replace_subtotal_merge_tag_submission( $form ) {
        return $this->maybe_replace_subtotal_merge_tag( $form, true );
    }
    /**
    * Get all the pricing fields on the form, get their corresponding merge tags and aggregate them into a formula that
    * will yeild the form's subtotal.
    *
    * @param mixed $form
    */
    static function get_subtotal_merge_tag_string( $form, $current_field, $filter_tags = false ) {
        
        $pricing_fields = self::get_pricing_fields( $form );
        $product_tag_groups = array();
        
        foreach( $pricing_fields['products'] as $product ) {
            $product_field = rgar( $product, 'product' );
            $option_fields = rgar( $product, 'options' );
            $quantity_field = rgar( $product, 'quantity' );
            // do not include current field in subtotal
            if( $product_field['id'] == $current_field['id'] )
                continue;
            $product_tags = GFCommon::get_field_merge_tags( $product_field );
            $quantity_tag = 1;
            // if a single product type, only get the "price" merge tag
            if( in_array( GFFormsModel::get_input_type( $product_field ), array( 'singleproduct', 'calculation', 'hiddenproduct' ) ) ) {
                // single products provide quantity merge tag
                if( empty( $quantity_field ) && ! rgar( $product_field, 'disableQuantity' ) )
                    $quantity_tag = $product_tags[2]['tag'];
                $product_tags = array( $product_tags[1] );
            }
            // if quantity field is provided for product, get merge tag
            if( ! empty( $quantity_field ) ) {
                $quantity_tag = GFCommon::get_field_merge_tags( $quantity_field );
                $quantity_tag = $quantity_tag[0]['tag'];
            }
            
            if( $filter_tags && ! self::has_valid_quantity( $quantity_tag ) )
                continue;
            
            $product_tags = wp_list_pluck( $product_tags, 'tag' );
            $option_tags = array();
            
            foreach( $option_fields as $option_field ) {
                if( is_array( $option_field['inputs'] ) ) {
                    $choice_number = 1;
                    foreach( $option_field['inputs'] as &$input ) {
                        //hack to skip numbers ending in 0. so that 5.1 doesn't conflict with 5.10
                        if( $choice_number % 10 == 0 )
                            $choice_number++;
                        $input['id'] = $option_field['id'] . '.' . $choice_number++;
                    }
                }
                $new_options_tags = GFCommon::get_field_merge_tags( $option_field );
                if( ! is_array( $new_options_tags ) )
                    continue;
                if( GFFormsModel::get_input_type( $option_field ) == 'checkbox' )
                    array_shift( $new_options_tags );
                $option_tags = array_merge( $option_tags, $new_options_tags );
            }
            $option_tags = wp_list_pluck( $option_tags, 'tag' );
            $product_tag_groups[] = '( ( ' . implode( ' + ', array_merge( $product_tags, $option_tags ) ) . ' ) * ' . $quantity_tag . ' )';
        }
        $shipping_tag = 0;
        /* Shipping should not be included in subtotal, correct?
        if( rgar( $pricing_fields, 'shipping' ) ) {
            $shipping_tag = GFCommon::get_field_merge_tags( rgars( $pricing_fields, 'shipping/0' ) );
            $shipping_tag = $shipping_tag[0]['tag'];
        }*/
        $pricing_tag_string = '( ( ' . implode( ' + ', $product_tag_groups ) . ' ) + ' . $shipping_tag . ' )';
        return $pricing_tag_string;
    }
    
    /**
    * Get all pricing fields from a given form object grouped by product and shipping with options nested under their
    * respective products.
    *
    * @param mixed $form
    */
    static function get_pricing_fields( $form ) {
        $product_fields = array();
        foreach( $form["fields"] as $field ) {
            if( $field["type"] != 'product' )
                continue;
            $option_fields = GFCommon::get_product_fields_by_type($form, array("option"), $field['id'] );
            // can only have 1 quantity field
            $quantity_field = GFCommon::get_product_fields_by_type( $form, array("quantity"), $field['id'] );
            $quantity_field = rgar( $quantity_field, 0 );
            $product_fields[] = array(
                'product' => $field,
                'options' => $option_fields,
                'quantity' => $quantity_field
                );
        }
        $shipping_field = GFCommon::get_fields_by_type($form, array("shipping"));
        return array( "products" => $product_fields, "shipping" => $shipping_field );
    }
    
    static function has_valid_quantity( $quantity_tag ) {
        if( is_numeric( $quantity_tag ) ) {
            $qty_value = $quantity_tag;
        } else {
            // extract qty input ID from the merge tag
            preg_match_all( '/{[^{]*?:(\d+(\.\d+)?)(:(.*?))?}/mi', $quantity_tag, $matches, PREG_SET_ORDER );
            $qty_input_id = rgars( $matches, '0/1' );
            $qty_value = rgpost( 'input_' . str_replace( '.', '_', $qty_input_id ) );
        }
        
        return floatval( $qty_value ) > 0;
    }
    
    function add_merge_tags( $form ) {
        $label = __('Subtotal', 'gravityforms');
        ?>

        <script type="text/javascript">
            // for the future (not yet supported for calc field)
            gform.addFilter("gform_merge_tags", "gwcs_add_merge_tags");
            function gwcs_add_merge_tags( mergeTags, elementId, hideAllFields, excludeFieldTypes, isPrepop, option ) {
                mergeTags["pricing"].tags.push({ tag: '<?php echo self::$merge_tag; ?>', label: '<?php echo $label; ?>' });
                return mergeTags;
            }
            // hacky, but only temporary
            jQuery(document).ready(function($){
                var calcMergeTagSelect = $('#field_calculation_formula_variable_select');
                calcMergeTagSelect.find('optgroup').eq(0).append( '<option value="<?php echo self::$merge_tag; ?>"><?php echo $label; ?></option>' );
            });
        </script>

        <?php
        //return the form object from the php hook
        return $form;
    }
    static function has_subtotal_merge_tag( $field ) {
        
        // check if form is passed
        if( isset( $field['fields'] ) ) {
            $form = $field;
            foreach( $form['fields'] as $field ) {
                if( self::has_subtotal_merge_tag( $field ) )
                    return true;
            }
        } else {
            if( isset( $field['calculationFormula'] ) && strpos( $field['calculationFormula'], self::$merge_tag ) !== false )
                return true;
        }
        return false;
    }
}
new GWCalcSubtotal();

 

۲ – حالا از منوی فرم یک فرم تازه ایجاد کنید و این موارد را به آن اضافه نمایید :

محصول : در قسمت توع فیلد : تنظیم شده توسط کاربر
محصول : در قسمت نوع فیلد : محاسباتی

سپس این کد را قرار میدهید :

{subtotal}*0.05

در این فرمول من با ضرب مجموع قیمت در ۰٫۰۵ درواقع به عنوان مالیات ۵ درصد به رقم اضافه کردم..اگر شما بخواهید به کاربر تخفیف دهید میتوانید از این فرمول استفاده کنید

{subtotal}/0.05

در اینجا تقسیم برای ۰٫۰۵ شده پس به کاربر ۵ درصد تخفیف میدهد.

 

+ در اخر هم مجموع قیمت را قرار میدهید تا قیمت نهایی شما به نمایش در بیاید.
امیدواریم این مقاله برای شما مفید بوده باشه ، منتظر نظرات شما هستیم …

2 Comments

  1. امین گفت:

    سلام من با آخرین ورژن گرویتی فرم و گرویتی فرم فارسی تست کردم ولی بعد از اضافه کردن این کدها کلا دیگه سایت بالا نمیاد و کفن سفید میشه
    نیاز به تخفیف درصدی دارم
    ـآیا راه حلی هست؟

پاسخی بگذارید