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