実用的な解決策が見つかりました。私はコードマスターではないので、おそらく少し肥大ですが、私はそれが仕事です!以下は基本的なバージョンですが、このような柔軟性により、特定の属性を共有する製品のユーザー役割による変動価格を自動的に一括して割り引くなど、より有用な機能が可能になります。
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;
}
}
}
出典
2016-11-21 09:51:20
isk
お返事ありがとうございました!残念ながら、あなたの提案は私に _ "致命的なエラーを通知しています:メッセージ ''バリエーション#0の親製品が設定されていません '........" _メッセージでキャッチされない例外'例外 ' ** product_variation = $ product ['variation_id']; **と** $ regular_price = $ product ['regular_price']; **のようにフォーマットすると消えますが、どちらの文字列からでも返すことができます数字は2、7、9で、どこから数字が引かれているのか分かりません。 – isk
コードは単なる例で、get_post_metaを '_variation_id'にしようとすると' $ product_variation = new WC_Product($ product_id); var_dump the result – Benoti
もう少し微調整した後、私は解決策を見つけました。ヘッドスタートをありがとう! – isk