Woocommerce adăugare câmp extra pentru produse cu variații
Urmăresc acest tutorial despre cum să adaug un câmp suplimentar la produsele mele cu variații.
Trebuie doar să adaug un câmp text suplimentar. Partea de administrare funcționează bine - câmpul se afișează și se salvează/actualizează, totuși, pagina produsului individual nu funcționează - câmpul nu se afișează.
Deci în fișierul meu functions.php
am adăugat:
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' => __( 'O etichetă', 'woocommerce' ),
'placeholder' => '',
'desc_tip' => 'true',
'description' => __( 'O descriere.', '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;
}
Și în plugins/plugins/woocommerce/templates/single-product/add-to-cart/variation.php
am adăugat (tema nu are propriul său fișier variation.php
):
<div class="woocommerce-variation-custom-text-field">
{{{ data.variation.text_field }}}
</div>
Cum pot afișa câmpul personalizat pe pagina produsului individual?
Mulțumesc
Actualizare: Dacă inspectez pagina produsului individual, scriptul este prezent:
<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>
Tema este belise.
Actualizare: Mă uit la fișierul personalizat functions.php
al temei pentru WooCommerce (belise/inc/woocommerce/functions.php) și logica pare să fie acolo.
/**
* Descriere pe pagina de magazin în arhivele de produse
*/
function belise_woocommerce_template_single_excerpt() {
global $post;
if ( ! $post->post_excerpt ) {
return;
}
?>
<div class="woocommerce-Price-amount amountption" itemprop="woocommerce-Price-amount amountption">
<!-- dacă adaug <p>test</p> este afișat pe pagina produsului -->
<!-- aș dori ca elementul câmpului personalizat să fie afișat aici -->
<?php echo apply_filters( 'woocommerce_short_woocommerce-Price-amount amountption', $post->post_excerpt ); ?>
</div><?php
}
Răspuns - Prima soluție a lui @ClemC funcționează, câmpul nu se afișa din cauza cache-ului browserului.

Pentru o referință serioasă, vezi cum WC însuși adaugă textarea variable_description
la variații aici.
Observăm mai multe probleme (potențiale) în implementarea câmpului tău de text.
- Lipsește atributul
name
... - Șirul
id
nu are o structură corectă, ci are structura atributuluiname
în schimb... id
sauname
nu sunt la fel ca în template-ul tău...
Luând ca referință implementarea textarea-ului variable_description
din WC, să implementăm câmpul nostru de text astfel:
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' => __( 'Etichetă', 'woocommerce' ),
'desc_tip' => true,
'description' => __( 'Descriere.', '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;
}
Acum, în template-ul care trebuie să aibă următorul path:
yourtheme/woocommerce/single-product/add-to-cart/variation.php
Adaugă asta:
<div class="random-class woocommerce-variation-custom-text-field">
{{{ data.variation.my_text_field }}}
</div>
EDIT:
Dacă vrei să afișezi câmpul tău personalizat în mod "clasic":
<div class="woocommerce-variation-custom-text-field">
<p><?php echo esc_html( get_post_meta( $post->ID, 'my_text_field', true ) ); ?></p>
</div>

Comentariile nu sunt pentru discuții extinse; această conversație a fost mutată în chat.

var_dump(get_post_meta( $post->ID, 'my_text_field', true ))
returnează string(0) ""
chiar dacă câmpul meu personalizat are un șir salvat.

Cred că este din cauza $post->ID
-ului care nu este o variație și pentru care nu ai introdus o valoare 'my_text_field'
. Chiar trebuie să fii în interiorul buclei de variații. De unde încerci să afișezi câmpul meta, se pare că același câmp meta va fi prezent pentru toate variațiile și pentru produsul principal în sine, nu este ceea ce vrei. Câmpul de text trebuie să apară doar pentru variația sa.

Nu prea ai multe alte opțiuni în afară de abordarea noastră inițială. Îți sugerez să intri în sala de chat pentru a rezolva problema ta.

Să continuăm această discuție în chat.

Este grozav, mulțumesc @ClemC - o mică problemă, pot să editez textul câmpului și să-l salvez din nou, dar dacă șterg tot conținutul și apoi salvez, nu pare să se salveze?

Ah, pur și simplu eliminați if ( ! empty( $field ) ) {} și funcționează. Există vreun dezavantaj în a face asta?
