#php #wordpress #woocommerce #advanced-custom-fields
#php #wordpress #woocommerce #дополнительно-пользовательские-поля
Вопрос:
Мне нужна помощь, пожалуйста… Вот код, на отдельной странице продукта он отображает входные данные для размеров (в фоновом режиме это множественный выбор в полях повторителя), прикрепленных к флажкам для цветов (в фоновом режиме это выбор в полях повторителя), они вызываются полями повторителя 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;
}
Ответ №1:
Ваша главная проблема в вашем коде заключается
product ID
в том, чтобы везде получать правильные.
1) В вашей первой функции, подключенной для получения идентификатора продукта, у вас есть 2 варианта:
Первый вариант — использовать это:
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()
, заменяющую все ваши $_product->id
вхождения на get_the_id()
.
2) В ваших вторых функциях у вас есть:
function save_my_custom_product_field( $cart_item_data, $product_id ) {
Таким образом, вы можете использовать непосредственно переменную $product_id
везде вместо $_product->id
3) В вашей третьей и последней функции, как у вас есть $cart_item
, вы будете использовать ее для получения корзины 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
Ответ №2:
Я нашел ответ! Сначала я добавляю свои входные данные, которые поступают от ретрансляторов переменного тока :
add_action( 'woocommerce_before_add_to_cart_button', 'add_custom_fields' );
function add_custom_fields($key_couleur) {
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);
if($valeur_couleur){
foreach( $select_couleur['choices'] as $key_couleur => $nom_couleur ):
if( $key_couleur == $valeur_couleur ):
$couleuralaligne=str_replace(" (","<br>(",$nom_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.'">'.$couleuralaligne.'</div></label>';
foreach( $select_taille['choices'] as $key_taille => $nom_taille ):
if (in_array($key_taille, $valeur_taille)):
$key_couleur_et_taille = $key_couleur.'_'.$key_taille;
echo '<div class="conteneur_taille"><label for="'.$key_couleur_et_taille.'">'.$nom_taille.'</label><input class="quantite_prdt" type="text" name="'.$key_couleur_et_taille.'" id="'.$key_couleur_et_taille.'" data-type="text" ></div>';
$_SESSION['valeur_couleur']=$key_couleur_et_taille;
endif;
endforeach;
endif;
endforeach;
}else{
foreach( $select_taille['choices'] as $key_taille => $nom_taille ):
if (in_array($key_taille, $valeur_taille)):
$key_couleur_et_taille = $key_couleur.'_'.$key_taille;
echo '<div class="conteneur_taille"><label for="'.$key_couleur_et_taille.'">'.$nom_taille.'</label><input class="quantite_prdt" type="text" name="'.$key_couleur_et_taille.'" id="'.$key_couleur_et_taille.'" data-type="text" ></div>';
$_SESSION['valeur_couleur']=$key_couleur_et_taille;
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,$key_couleur,$variation_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);
// $cart_item_data['couleurs_selectionnees']=array();
$cart_item_data['tailles_couleurs']=array();
if(isset($_POST[$valeur_couleur])){
foreach( $select_couleur['choices'] as $key_couleur => $nom_couleur ):
if(( $key_couleur == $valeur_couleur ) amp;amp; (isset($_POST[$valeur_couleur]))):
$macouleur=$_REQUEST[$key_couleur];
$cart_item_data['couleurs_selectionnees'][$valeur_couleur] = $macouleur;
endif;
foreach( $select_taille['choices'] as $key_taille => $nom_taille ):
if($key_taille != 'qte'){
$key_couleur_et_taille = $key_couleur.'_'.$key_taille;
$nom_couleur_et_taille = $nom_couleur.' Taille '.$nom_taille;
if ((isset($_POST[$key_couleur_et_taille])) amp;amp; (!empty($_POST[$key_couleur_et_taille]))):
$qty_taille=$_REQUEST[$key_couleur_et_taille];
$cart_item_data['tailles_couleurs'][$nom_couleur_et_taille] = $qty_taille;
endif;
}else{
$key_couleur_et_taille = $key_couleur.'_'.$key_taille;
$nom_couleur_et_taille = $nom_couleur;
if ((isset($_POST[$key_couleur_et_taille])) amp;amp; (!empty($_POST[$key_couleur_et_taille]))):
$qty_taille=$_REQUEST[$key_couleur_et_taille];
$cart_item_data['tailles_couleurs'][$nom_couleur_et_taille] = $qty_taille;
endif;
}
endforeach;
endforeach;
}else{
foreach( $select_taille['choices'] as $key_taille => $nom_taille ):
if($key_taille != 'qte'){
$key_couleur_et_taille = $key_couleur.'_'.$key_taille;
$nom_couleur_et_taille = $nom_couleur.' Taille '.$nom_taille;
if ((isset($_POST[$key_couleur_et_taille])) amp;amp; (!empty($_POST[$key_couleur_et_taille]))):
$qty_taille=$_REQUEST[$key_couleur_et_taille];
$cart_item_data['tailles_couleurs'][$nom_couleur_et_taille] = $qty_taille;
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,$product_id,$key_couleur) {
$custom_items = array();
if( !empty( $cart_data ) ) {
$custom_items = $cart_data;
}
$qty_input_taille = $cart_item['tailles_couleurs'];
if( (isset( $cart_item['couleurs_selectionnees'] )) amp;amp; (empty($qty_input_taille)) ) {
$couleurselect =$cart_item['couleurs_selectionnees'];
foreach($couleurselect as $key => $value){
$custom_items[] = array( "name" => 'Couleur', "value" => $value );
}
}else if( !empty($qty_input_taille) ) {
$valeurtaille =$cart_item['tailles_couleurs'];
foreach($valeurtaille as $key => $value){
$custom_items[] = array( "name" => $key, "value" => $value );
}
}
return $custom_items;
}
И, наконец, вот функция для отображения моего варианта на страницах chackout и благодарности (и подтверждения заказа по электронной почте):
function tshirt_order_meta_handler( $item_id, $values, $cart_item_key ) {
$qty_input_taille = $values['tailles_couleurs'];
if( (isset( $values['couleurs_selectionnees'] )) amp;amp; (empty($qty_input_taille)) ) {
$couleurselect =$values['couleurs_selectionnees'];
foreach($couleurselect as $key => $value){
wc_add_order_item_meta( $item_id, 'Couleur ', $value );
}
}else if( !empty($qty_input_taille) ) {
$valeurtaille =$values['tailles_couleurs'];
foreach($valeurtaille as $key => $value){
wc_add_order_item_meta( $item_id, $key, $value );
}
}
}
add_action( 'woocommerce_add_order_item_meta', 'tshirt_order_meta_handler', 1, 3 );