Come ottenere l'ID della Variazione in WooCommerce?

14 gen 2014, 19:44:48
Visualizzazioni: 27.1K
Voti: 3

Sto cercando di creare delle funzionalità aggiuntive nel backend di WooCommerce dove aggiungo un campo personalizzato alla sezione delle variazioni. Tuttavia, non riesco assolutamente a capire come ottenere l'ID della variazione corrente per recuperare i meta post.

Ecco su cosa sto lavorando:

<?php

        // Ottieni le variazioni
        $args = array(
                     'post_type'     => 'product_variation',
                     'post_status'   => array( 'private', 'publish' ),
                     'numberposts'   => -1,
                     'orderby'       => 'menu_order',
                     'order'         => 'asc',
                     'post_parent'   => $post->ID
                 );
                 $variations = get_posts( $args ); 

        foreach ( $variations as $variation ) {

                     $variation_id           = absint( $variation->ID );$variable_id = $this['variation_id'];
                     $variation_post_status  = esc_attr( $variation->post_status );
                     $variation_data         = get_post_meta( $variation_id );
                     $variation_data['variation_post_id'] = $variation_id;
                    echo get_post_meta( $variation_data['variation_post_id'], '_my_custom_field', true) . ' - TEST';

                 }

     ?>

Quando controllo il backend, sembra che stia caricando tutti i meta post in ogni variazione in questo modo:

schermata del backend di WooCommerce che mostra i meta dati delle variazioni

Tuttavia, se uso l'ID della variazione effettiva come mostrato di seguito, funziona per quella variazione:

echo get_post_meta( 134, '_my_custom_field', true) . ' - Test Variazione #134';


AGGIORNAMENTO:
Ecco tutto il codice completo nel caso possa essere d'aiuto.

// Visualizza i Campi
add_action( 'woocommerce_product_after_variable_attributes', 'variable_fields' );
//JS per aggiungere campi per nuove variazioni
add_action( 'woocommerce_product_after_variable_attributes_js', 'variable_fields_js' );
// Salva i Campi
add_action( 'woocommerce_process_product_meta_variable', 'variable_fields_process', 10, 1 );

function variable_fields( $loop, $variation_data, $variation ) {
?>  
    <tr>
        <td>
            <div>
                    <label><?php _e( 'Il Mio Campo Personalizzato', 'woocommerce' ); ?></label>
                    <input type="text" size="5" name="my_custom_field[<?php echo $loop; ?>]" value="<?php echo $variation_data['_my_custom_field'][0]; ?>"/>

      <?php
      if (isset( $_POST['variable_sku'] ) ) :
        $variable_sku = $_POST['variable_sku'];
        $variable_post_id = $_POST['variable_post_id'];
        $variable_custom_field = $_POST['my_custom_field'];
        for ( $i = 0; $i < sizeof( $variable_sku ); $i++ ) :
            $variation_id = (int) $variable_post_id[$i];
            if ( isset( $variable_custom_field[$i] ) ) {
                update_post_meta( $variation_id, '_my_custom_field', stripslashes( $variable_custom_field[$i] ) );
            }
            echo get_post_meta( $variation_id, '_my_custom_field', true) . ' - Test';
        endfor;
    endif;

        //funziona echo get_post_meta( 134, '_my_custom_field', true) . ' - Test 134';



     ?>
            </div>
        </td>
    </tr>
<?php
}

function variable_fields_js() {
?>
<tr>
        <td>
            <div>
                    <label><?php _e( 'Il Mio Campo Personalizzato', 'woocommerce' ); ?></label>
                    <input type="text" size="5" name="my_custom_field[' + loop + ']" />
            </div>
        </td>
    </tr>
<?php
}

function variable_fields_process( $post_id ) {
    if (isset( $_POST['variable_sku'] ) ) :
        $variable_sku = $_POST['variable_sku'];
        $variable_post_id = $_POST['variable_post_id'];
        $variable_custom_field = $_POST['my_custom_field'];
        for ( $i = 0; $i < sizeof( $variable_sku ); $i++ ) :
            $variation_id = (int) $variable_post_id[$i];
            if ( isset( $variable_custom_field[$i] ) ) {
                update_post_meta( $variation_id, '_my_custom_field', stripslashes( $variable_custom_field[$i] ) );
            }
        endfor;
    endif;
}
Commenti

qual è il contesto? In quale posizione devi ottenere il variation_id? Per aggiungere il tuo campo, stai usando l'hook woocommerce_product_after_variable_attributes, o cosa?

Shazzad Shazzad
15 gen 2014 02:49:37

Grazie @Shazzad, ho aggiornato la domanda per mostrare il mio codice completo, sì stavo usando quell'hook. Grazie per il tuo aiuto

Derek Derek
15 gen 2014 16:24:28

Il terzo argomento $variation è un oggetto post che contiene l'id, es. $variation->ID. Altrimenti anche l'array $variation_data ha l'id $variation_data['variation_post_id']. E per aggiornare i valori nei meta, puoi usare l'hook woocommerce_save_product_variation, che accetta due argomenti $variation_id, $i (indice/chiave numerica)

Shazzad Shazzad
15 gen 2014 23:57:33

Quando provo a cambiare get_post_meta con $variation->ID non ottengo nulla da visualizzare nella pagina di modifica del prodotto in admin. Potresti mostrarmi un esempio (imparo meglio visivamente) dove posso vedere e testarlo?

Derek Derek
16 gen 2014 04:17:03

Ok lo farò, ma sono un po' confuso su cosa stai cercando di ottenere? Puoi spiegarmelo così posso provare a chiarirti?

Shazzad Shazzad
16 gen 2014 07:35:41

Tutto ciò di cui ho bisogno è un modo per ottenere l'ID della variazione quando uso la funzione get_post_meta. Come vedi nello screenshot, ho un meta box personalizzato in fondo a ogni variazione dove qualcuno inserirà alcune informazioni. I dati vengono salvati nel database senza problemi, ma ottenere l'ID della variazione per get_post_meta sembra essere il mio problema. Attualmente, se digiti qualcosa in una di quelle caselle e clicchi "Aggiorna", il dato viene salvato ma non viene mostrato il contenuto salvato nella casella di testo come vedi nello screenshot sopra. Ad esempio ho digitato "opiolik" nel meta box della prima variazione e "qefqe" per il secondo meta box.

Derek Derek
16 gen 2014 15:13:21

Quindi il mio problema risiede nel fatto che $variation_id in realtà non recupera l'ID della variante in 'echo get_post_meta( $variation_id, '_my_custom_field', true) . ' - Test';' ma invece mostra tutti i metadati delle varianti come nello screenshot per ciascuna. Se uso qualcosa come echo get_post_meta( 134, '_my_custom_field', true) . ' - Test';' allora funziona e mostra i metadati _my_custom_ per la variante #134.. Spero di non averti confuso. In breve ho solo bisogno di un modo per mostrare i dati inseriti una volta che l'utente clicca su aggiorna. (I dati vengono salvati nel database ma non vengono visualizzati quando la pagina si ricarica)

Derek Derek
16 gen 2014 15:17:11

Per favore prova una volta con questo - <input type="text" size="5" name="my_custom_field[<?php echo $loop; ?>]" value="<?php echo get_post_meta( $variation->ID, '_my_custom_field', true ); ?>"/>

Shazzad Shazzad
17 gen 2014 00:27:22

Eh, neanche questo ha funzionato.. Ho inserito informazioni nella casella di testo e cliccato su salva ma ancora non viene mostrato nulla? Hai altre idee? (PS Grazie mille per l'aiuto)

Derek Derek
17 gen 2014 02:36:59

Si prega di evitare discussioni prolungate nei commenti. Se hai bisogno di chiarire qualcosa, invia una [modifica] invece di un commento. @Shazzad Se pensi di avere una soluzione, per favore pubblicala come risposta, non come commento. Grazie.

kaiser kaiser
10 feb 2014 20:23:34
Mostra i restanti 5 commenti