获取产品变化并修改价格 - woocommerce

时间:2016-11-20 11:28:46

标签: php wordpress variables woocommerce product

我正在寻找一种方法来定位产品差异,并根据每个变体的属性修改其价格。下面的代码在某种程度上正朝着正确的方向发展,但我不是使用产品属性来定位变体,而是依靠将变体的当前价格与变量相匹配来定位它。它有效,但它留下了很大的错误空间,它有多模糊。

add_filter('woocommerce_get_price','change_price', 10, 2);
function change_price($price, $productd){

if (  $productd->product_type == 'variation' || $productd->product_type == 'variable' ) {

$basicmp3 = 25;

$vprice = get_post_meta( $productd->variation_id, '_regular_price',true);

    if ($vprice == $basicmp3) {

            $vprice2 = $vprice * .5;    
            return $vprice2;
    }
    else{           
         return $vprice;
    } 
}
}

更新在下方发布了有效的解决方案

3 个答案:

答案 0 :(得分:2)

当你在一个函数中运行一个woocommerce类时,需要调用一些全局函数。

 global $woocommerce; $product;
 $product_variation = new WC_Product_Variation($_POST['variation_id']);
 $regular_price = $product_variation->regular_price;

在另一个词中,不是因为你有$product作为参数,你可以使用类功能(它只是一个扁平的对象,如数组可)。您需要初始化类的新对象以使用$ newproductobject-> regular_price()。

可能,如果您的代码是woocommerce类尚未加载的插件的一部分,那么您需要包含包含WC_Product _Variation类的文件。 (不要以为它就是这样)

希望它有所帮助!

答案 1 :(得分:0)

找到了一个有效的解决方案因为我不是代码大师,所以它可能有点臃肿,但我做到了!以下是基本版本,但这种灵活性将允许更多有用的功能,例如,对于共享某些属性的产品,按用户角色自动批量折扣变化价格。

add_filter('woocommerce_get_price','change_price', 10, 2);
function change_price($price, $productd){


global $post, $woocommerce;
$post_id = $variation->ID;


    $args = array(
                 'post_type'     => 'product_variation',
                 'post_status'   => array( 'private', 'publish' ),
                 'numberposts'   => -1,
                 'orderby'       => 'menu_order',
                 'order'         => 'asc',
                 'post_parent'   => $post->ID
             );
             $variations = get_posts( $args ); 

    //declare variables for later use        
    $demomp3 = '';
    $basicmp3 = '';
    $basicwav = '';
    $premiummp3 = '';
    $premiumwav = '';
    $syncmp3 = '';
    $syncwav = '';

    foreach ( $variations as $variation ) {

                $variation_id           = absint( $variation->ID );$variable_id = $this['variation_id'];
                $variation_post_status  = esc_attr( $variation->post_status );
                $variation_data         = get_post_meta( $variation_id );
                $variation_data['variation_post_id'] = $variation_id;

                //find attributes
                $option1 = 'pa_license-options';
                $option2 = 'pa_delivery-format';
                $getmeta1 = get_post_meta($variation_id , 'attribute_'.$option1, true);
                $getmeta2 = get_post_meta($variation_id , 'attribute_'.$option2, true);
                $attribute1 = get_term_by('slug', $getmeta1, $option1);
                $attribute2 = get_term_by('slug', $getmeta2, $option2);
                $license = $attribute1->name;
                $format = $attribute2->name;


                //get the prices of each variation by the attribute combinations they have              
                if ($format === "mp3" && $license === "Demo License" ){

                    //retrieve variation price and assign it to the previously created variable
                    $demomp3 = get_post_meta($variation_id, '_regular_price', true ); 

                }   
                if ($format === "mp3" && $license === "Basic License" ){
                    $basicmp3 = get_post_meta($variation_id, '_regular_price', true ); 

                }
                if ($format === "WAV" && $license === "Basic License" ){
                    $basicwav = get_post_meta($variation_id, '_regular_price', true ); 

                }   
                if ($format === "mp3" && $license === "Premium License" ){
                    $premiummp3 = get_post_meta($variation_id, '_regular_price', true ); 

                }
                if ($format === "WAV" && $license === "Premium License" ){
                    $premiumwav = get_post_meta($variation_id, '_regular_price', true ); 

                }   
                if ($format === "mp3" && $license === "Sync License" ){
                    $syncmp3 = get_post_meta($variation_id, '_regular_price', true ); 

                }   
                if ($format === "WAV" && $license === "Sync License" ){
                    $syncwav = get_post_meta($variation_id, '_regular_price', true ); 

                }   
    }
        //Simple product doesn't need to be modified
        if($productd->product_type == 'simple'){


            return $price;

        }
        //adjust prices of variable products    
        if (  $productd->product_type == 'variation' || $productd->product_type == 'variable' ) {

            $regprice = get_post_meta( $productd->variation_id, '_regular_price',true);
            //target the current variation by matching its price to the one stored in the variable
            if ($regprice == $demomp3) {

                    //apply price adjustment and return the new value
                    $price = $regprice * .5;    
                    return $price;
            }
            else if ($regprice == $basicmp3) {

                    $price = $regprice * .5;    
                    return $price;
            }
            else if ($regprice == $basicwav) {

                    $price = $regprice * .5;    
                    return $price;
            }
            else if ($regprice == $premiummp3) {

                    $price = $regprice * .5;    
                    return $price;
            }
            else if ($regprice == $premiumwav) {

                    $price = $regprice * .5;    
                    return $price;
            }
            else if ($regprice == $syncmp3) {

                    $price = $regprice * .5;    
                    return $price;
            }
            else if ($regprice == $syncwav) {

                    $price = $regprice * .5;    
                    return $price;
            }
            else{           
                 return $price;
            }   
       }
}

答案 2 :(得分:0)

使用以下脚本更新产品差异。点击此处获取详细说明。 https://www.pearlbells.co.uk/bulk-update-product-variation-price-woocommerce/

function getExistingProducts($updatedPrices,$skuArray) {

$loop = new WP_Query(array('post_type' => array('product', 'product_variation'), 'posts_per_page' => -1));

while ($loop->have_posts()) : $loop->the_post();

    $id = get_the_ID();
    $product = wc_get_product( $id );
    $sku = get_post_meta($id, '_sku', true);

    if( in_array( $sku, $skuArray  ) ) {

        $attributes = $product->get_attributes();
        $attributes['medium-quantity-price']['value'] = $updatedPrices[$sku][4];
        $attributes['low-quantity-price']['value'] = $updatedPrices[$sku][3];
      //  $attributes['v-low-quantity-price']['value'] = $updatedPrices[$sku][2];
        update_post_meta( $id,'_product_attributes',$attributes);
        echo ' Update Sku : '.$sku.' '.PHP_EOL;

    }

endwhile;

}