Je suis ce didacticiel comment ajouter un champ supplémentaire à mes produits de variantes.
J'ai juste besoin d'ajouter un champ de texte supplémentaire. La partie admin fonctionne bien - le champ affiche et enregistre/met à jour, cependant, la page de produit unique ne s'affiche pas - le champ ne s'affichera pas .
Donc, dans mon functions.php
j'ai ajouté:
add_action( 'woocommerce_product_after_variable_attributes', 'variation_settings_fields', 10, 3 );
add_action( 'woocommerce_save_product_variation', 'save_variation_settings_fields', 10, 2 );
function variation_settings_fields( $loop, $variation_data, $variation ) {
woocommerce_wp_text_input(
array(
'id' => '_text_field[' . $variation->ID . ']',
'label' => __( 'Some label', 'woocommerce' ),
'placeholder' => '',
'desc_tip' => 'true',
'description' => __( 'Some description.', 'woocommerce' ),
'value' => get_post_meta( $variation->ID, '_text_field', true )
)
);
}
function save_variation_settings_fields( $post_id ) {
$text_field = $_POST['_text_field'][ $post_id ];
if( ! empty( $text_field ) ) {
update_post_meta( $post_id, '_text_field', esc_attr( $text_field );
}
}
add_filter( 'woocommerce_available_variation', 'load_variation_settings_fields' );
function load_variation_settings_fields( $variations ) {
$variations['text_field'] = get_post_meta( $variations[ 'variation_id' ], '_text_field', true );
return $variations;
}
Et dans plugins/plugins/woocommerce/templates/single-product/add-to-cart/variation.php
j'ai ajouté (le thème n'a pas son propre variation.php
):
<div class="woocommerce-variation-custom-text-field">
{{{ data.variation.text_field }}}
</div>
Comment afficher le champ personnalisé sur une seule page de produit?
Merci
Update : Si j'inspecte la page de produit unique, le script est présent:
<script type="text/template" id="tmpl-variation-template">
<div class="woocommerce-variation-description">
{{{ data.variation.variation_description }}}
</div>
<div class="woocommerce-variation-price">
{{{ data.variation.price_html }}}
</div>
<div class="woocommerce-variation-custom-text-field">
{{{ data.variation.text_field }}}
</div>
<div class="woocommerce-variation-availability">
{{{ data.variation.availability_html }}}
</div>
</script>
Le thème est belise .
Update : Je regarde le fichier thèmes woocommerce functions.php
(belise/inc/woocommerce/functions.php) personnalisé et la logique semble exister.
/**
* Shop page woocommerce-Price-amount amountption on product archives
*/
function belise_woocommerce_template_single_excerpt() {
global $post;
if ( ! $post->post_excerpt ) {
return;
}
?>
<div class="woocommerce-Price-amount amountption" itemprop="woocommerce-Price-amount amountption">
<!-- if I add <p>test</p> it is printed on the product page -->
<!-- I would like for the custom field element to be printed here -->
<?php echo apply_filters( 'woocommerce_short_woocommerce-Price-amount amountption', $post->post_excerpt ); ?>
</div><?php
}
Answer - La première solution de @ClemC fonctionne, le champ ne s'affichait pas à cause du cache des navigateurs.
Pour serious reference, voyez comment WC ajoute le textarea variable_description
aux variations here .
Nous constatons de multiples problèmes (potentiels) dans votre implémentation de champ de texte.
name
...id
a not une structure correcte, mais la structure name
à la place ...id
ou name
sont pas identiques à ceux de votre modèle ...Donc, en prenant comme référence l'implémentation WC variable_description
textarea, implémentons notre champ de texte de la manière suivante:
add_action( 'woocommerce_product_after_variable_attributes', 'variation_settings_fields', 10, 3 );
add_action( 'woocommerce_save_product_variation', 'save_variation_settings_fields', 10, 2 );
add_filter( 'woocommerce_available_variation', 'load_variation_settings_fields' );
function variation_settings_fields( $loop, $variation_data, $variation ) {
woocommerce_wp_text_input(
array(
'id' => "my_text_field{$loop}",
'name' => "my_text_field[{$loop}]",
'value' => get_post_meta( $variation->ID, 'my_text_field', true ),
'label' => __( 'Some label', 'woocommerce' ),
'desc_tip' => true,
'description' => __( 'Some description.', 'woocommerce' ),
'wrapper_class' => 'form-row form-row-full',
)
);
}
function save_variation_settings_fields( $variation_id, $loop ) {
$text_field = $_POST['my_text_field'][ $loop ];
if ( ! empty( $text_field ) ) {
update_post_meta( $variation_id, 'my_text_field', esc_attr( $text_field ));
}
}
function load_variation_settings_fields( $variation ) {
$variation['my_text_field'] = get_post_meta( $variation[ 'variation_id' ], 'my_text_field', true );
return $variation;
}
Maintenant, dans le modèle que doit obligatoirement avoir le chemin suivant:
yourtheme/woocommerce/single-product/add-to-cart/variation.php
Ajoute ça:
<div class="random-class woocommerce-variation-custom-text-field">
{{{ data.variation.my_text_field }}}
</div>
EDIT:
Si vous voulez sortir votre champ personnalisé de la manière "classique":
<div class="woocommerce-variation-custom-text-field">
<p><?php echo esc_html( get_post_meta( $post->ID, 'my_text_field', true ) ); ?></p>
</div>