我需要帮助…
下面是代码,在单个产品页面中,它显示了大小的输入(在后端,这是转发器字段中的多选项)附加到颜色的复选框(在后端这是转发器字段中的选择),它们被调用通过acf中继器字段.每种颜色都可以与多种尺寸相关联.第一个功能运行良好,它显示我想要的.但我无法检索结果,将它们显示在购物车中作为自定义元产品(作为产品变体),你能告诉我哪里出错吗?非常感谢,我迷路了…… 🙁
这是测试产品:
http://neo2.agencepoint.com/boutique/t-shirt-col-rond-manches-courtes-femme/
add_action( 'woocommerce_before_add_to_cart_button', 'add_custom_fields' );
function add_custom_fields() {
global $product;
$product_id = $product->id;
if( get_field('tailles_et_couleurs', $product_id) ):
while( has_sub_field('tailles_et_couleurs', $product_id) ):
$select_couleur = get_sub_field_object('couleurs', $product_id);
$valeur_couleur = get_sub_field('couleurs', $product_id);
$select_taille = get_sub_field_object('tailles', $product_id);
$valeur_taille = get_sub_field('tailles', $product_id);
foreach( $select_couleur['choices'] as $key_couleur => $nom_couleur ):
if( $key_couleur == $valeur_couleur ):
echo '<div class="conteneur_taille_couleur"><label class="label-couleur label-couleurs-meta-'.$key_couleur.'" for="couleurs-meta-'.$key_couleur.'"> <input id="couleurs-meta-'.$key_couleur.'" name="'.$key_couleur.'" data-type="palettes" type="checkbox" value="'.$nom_couleur.'"><div class="palette-box" id="palette_couleur_'.$key_couleur.'"></div><div class="nom-couleur nom-couleur-couleurs-meta-'.$key_couleur.'">'.$nom_couleur.'</div></label>';
endif;
endforeach;
foreach( $select_taille['choices'] as $key_taille => $nom_taille ):
if (in_array($key_taille, $valeur_taille)):
echo '<div class="conteneur_taille"><label for="'.$key_taille.'">'.$nom_taille.'</label><input class="quantite_prdt" type="text" name="'.$key_taille.'" id="'.$key_taille.'" data-type="text" ></div>';
endif;
endforeach;
echo '</div>';
endwhile;
endif;
}
add_action( 'woocommerce_add_cart_item_data', 'save_my_custom_product_field', 10, 2 );
function save_my_custom_product_field( $cart_item_data, $product_id ) {
while( has_sub_field('tailles_et_couleurs', $product_id) ):
$select_couleur = get_sub_field_object('couleurs', $product_id);
$valeur_couleur = get_sub_field('couleurs', $product_id);
$select_taille = get_sub_field_object('tailles', $product_id);
$valeur_taille = get_sub_field('tailles', $product_id);
foreach( $select_couleur['choices'] as $key_couleur => $nom_couleur ):
if( $key_couleur == $valeur_couleur ):
$cart_item_data[$key_couleur] = $valeur_couleur;
$cart_item_data['unique_key'] = md5( microtime().rand() );
endif;
endforeach;
foreach( $select_taille['choices'] as $key_taille => $nom_taille ):
if (in_array($key_taille, $valeur_taille)):
$cart_item_data[$key_taille] = $valeur_taille;
$cart_item_data['unique_key'] = md5( microtime().rand() );
endif;
endforeach;
endwhile;
return $cart_item_data;
}
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 10, 2 );
function render_meta_on_cart_and_checkout( $cart_data, $cart_item ) {
if($cart_item['variation_id'] == 0){
$item_id = $cart_item['product_id'];
}
else
{
$item_id = $cart_item['variation_id'];
}
$custom_items = array();
if( !empty( $cart_data ) ):
$custom_items = $cart_data;
endif;
while( has_sub_field('tailles_et_couleurs', $product_id) ):
$select_couleur = get_sub_field_object('couleurs', $product_id);
$valeur_couleur = get_sub_field('couleurs', $product_id);
$select_taille = get_sub_field_object('tailles', $product_id);
$valeur_taille = get_sub_field('tailles', $product_id);
foreach( $select_couleur['choices'] as $key_couleur => $nom_couleur ):
if( $key_couleur == $valeur_couleur ):
if( isset( $cart_item[$nom_couleur] ) ):
$custom_items[] = array( "name" => $nom_couleur, "value" => $cart_item[$valeur_couleur] );
endif;
endif;
endforeach;
foreach( $select_taille['choices'] as $key_taille => $nom_taille ):
if (in_array($key_taille, $valeur_taille)):
if( isset( $cart_item[$nom_taille] ) ):
$custom_items[] = array( "name" => $nom_taille, "value" => $cart_item[$valeur_taille] );
endif;
endif;
endforeach;
endwhile;
return $custom_items;
}
最佳答案
Your main problem in your code is getting the right
product ID
everywhere.
1)在您获取产品ID的第一个函数中,您有两个选择:
第一个选择是使用这个:
add_action( 'woocommerce_before_add_to_cart_button', 'add_custom_fields' );
function add_custom_fields() {
global $product;
$product_id = $product->id; // Here you really get the product ID
if( get_field('tailles_et_couleurs', $product_id) ):
// . . .
// And you will replace everywhere in this function $_product->id by $product_id
}
或者您也可以使用WordPress函数get_the_id()替换get_the_id()替换所有$_product-> id出现次数.
2)在你的第二个职能中你有:
function save_my_custom_product_field( $cart_item_data, $product_id ) {
因此,您可以直接使用变量$product_id,而不是$_product-> id
3)在你的第三个也是最后一个函数中,因为你有$cart_item,你将使用它以这种方式获得购物车项目ID:
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 10, 2 );
function render_meta_on_cart_and_checkout( $cart_data, $cart_item ) {
if($cart_item['variation_id'] == 0)
$item_id = $cart_item['product_id'];
else
$item_id = $cart_item['variation_id'];
// Your code goes here replacing everywhere $_product->id by $item_id