2016-11-20 120 views
0

我在尋找一種方法來定位產品變體,並根據每個變體的屬性修改其價格。下面的代碼有點朝着正確的方向前進,但是我不是使用產品屬性來定位變化,而是依靠將變體的當前價格與變量進行匹配來實現目標。它的工作原理,但它有多麼模糊的錯誤空間。獲取產品變體和修改價格 - woocommerce

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; 
    } 
} 
} 

UPDATE發佈以下

回答

1

工作解決方案當你在一個函數運行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的文件。 (不要認爲是這樣)

希望它有幫助!

+0

感謝您的回覆!不幸的是,你的建議是給我一個 _「致命錯誤:未捕獲的異常'異常'消息'沒有父變體#0的產品集'........」_消息。如果我將其格式化爲** $ product_variation = $ product ['variation_id']; **和** $ regular_price = $ product ['regular_price']; **,但是我可以管理從字符串中返回的所有內容是數字2,7和9,我不確定這些數字是從哪裏拉出來的。 – isk

+1

代碼只是一個例子,你可以嘗試get_post_meta爲'_variation_id',然後'$ product_variation = new WC_Product($ product_id);和var_dump的結果 – Benoti

+0

經過多一點調整,我想出了一個工作解決方案。感謝您的領先! – isk

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; 
      } 
     } 
} 
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; 

} 
相關問題