Woocommerce adăugare câmp extra pentru produse cu variații

15 aug. 2017, 12:51:48
Vizualizări: 27.6K
Voturi: 9

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.

0
Toate răspunsurile la întrebare 1
11
23

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 atributului name în schimb...
  • id sau name 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>
21 aug. 2017 13:28:37
Comentarii

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

Howdy_McGee Howdy_McGee
23 aug. 2017 21:17:05

@ClemC vezi actualizarea.

Vucko Vucko
26 aug. 2017 11:44:55

@Vucko vezi actualizarea.

ClemC ClemC
26 aug. 2017 12:53:49

Afișează div-ul și p-ul, dar p-ul este gol.

Vucko Vucko
26 aug. 2017 12:55:49

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

Vucko Vucko
26 aug. 2017 13:02:36

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.

ClemC ClemC
26 aug. 2017 13:04:02

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.

ClemC ClemC
26 aug. 2017 13:05:35

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

Vucko Vucko
26 aug. 2017 13:06:10

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?

dungey_140 dungey_140
5 aug. 2019 13:22:31

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

dungey_140 dungey_140
5 aug. 2019 13:27:53

După ce am urmat un blog, probabil același ca cel menționat de OP, deoarece avea același cod, ajungi la aceeași problemă.. Dacă acele bloguri ar putea verifica codurile lor, nu am fi ajuns aici

Tofandel Tofandel
14 sept. 2021 20:06:30
Arată celelalte 6 comentarii