¿Cómo obtener el ID de Variación en WooCommerce?

14 ene 2014, 19:44:48
Vistas: 27.1K
Votos: 3

Estoy tratando de crear funcionalidad adicional en mi backend de WooCommerce donde agrego un campo personalizado a la sección de variaciones del backend. Sin embargo, no logro encontrar la manera de obtener el ID de la variación actual para obtener el post meta.

Esto es con lo que he estado trabajando:

<?php
        // Obtener variaciones
        $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';
                 }
     ?>

Cuando reviso el backend, parece que está extrayendo todos los post meta en cada variación de esta manera:

captura de pantalla del backend de WooCommerce mostrando post meta

Sin embargo, si uso el ID de variación real como se muestra a continuación, funciona para esa variación:

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


ACTUALIZACIÓN:
Aquí está todo en su totalidad por si ayuda.

// Mostrar Campos
add_action( 'woocommerce_product_after_variable_attributes', 'variable_fields' );
//JS para agregar campos para nuevas variaciones
add_action( 'woocommerce_product_after_variable_attributes_js', 'variable_fields_js' );
// Guardar Campos
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( 'Mi Campo Personalizado', '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;

        //funciona 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( 'Mi Campo Personalizado', '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;
}
Comentarios

¿cuál es el contexto? ¿en qué posición necesitas obtener el variation_id? para agregar tu campo, ¿estás usando el hook woocommerce_product_after_variable_attributes, o cuál?

Shazzad Shazzad
15 ene 2014 02:49:37

Gracias @Shazzad, actualicé la pregunta para mostrar mi código completo, sí estaba usando ese hook. Gracias por tu ayuda

Derek Derek
15 ene 2014 16:24:28

El tercer argumento $variation es un objeto post que tiene el id, ej. $variation->ID. De lo contrario, el array $variation_data también tiene el id $variation_data['variation_post_id']. Y para actualizar los valores en meta, puedes usar el hook woocommerce_save_product_variation, que viene con dos argumentos $variation_id, $i (clave/número índice)

Shazzad Shazzad
15 ene 2014 23:57:33

Cuando intento cambiar get_post_meta a $variation->ID entonces no obtengo nada impreso en la página de edición de producto en el admin. ¿Podrías publicar un ejemplo (aprendo mejor visualmente) donde pueda verlo y probarlo?

Derek Derek
16 ene 2014 04:17:03

Lo haré, pero estoy un poco confundido sobre lo que intentas lograr. ¿Podrías explicarlo para que pueda intentar explicarte?

Shazzad Shazzad
16 ene 2014 07:35:41

Todo lo que necesito es una forma de obtener el ID de la variación al usar la función get_post_meta. Como ves en la captura de pantalla, tengo un metabox personalizado al final de cada variación donde alguien ingresará información. Los datos se guardan en la base de datos sin problema, pero obtener el ID de la variación para get_post_meta parece ser mi problema. Actualmente, si escribes algo en cualquiera de esas cajas y haces clic en "Actualizar", se guarda pero no muestra los datos guardados en el cuadro de texto como se ve en la captura de pantalla anterior. Por ejemplo, escribí "opiolik" en el metabox de la primera variación y usé "qefqe" para el segundo metabox.

Derek Derek
16 ene 2014 15:13:21

Así que mi problema radica en que $variation_id en realidad no está obteniendo el ID de la variación en 'echo get_post_meta( $variation_id, '_my_custom_field', true) . ' - Test';' sino que muestra todos los metadatos de variación como en la captura de pantalla para cada uno. Si uso algo como echo get_post_meta( 134, '_my_custom_field', true) . ' - Test';' entonces funciona y muestra los metadatos _my_custom_meta para la variación #134.. Espero no haberte confundido. En resumen, solo necesito una manera de mostrar los datos que se ingresaron una vez que hacen clic en actualizar. (Se guarda en la base de datos pero no se muestra cuando la página se actualiza)

Derek Derek
16 ene 2014 15:17:11

Por favor intenta con esto una vez - <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 ene 2014 00:27:22

ehh, eso tampoco funcionó.. Puse información en el cuadro de texto y hice clic en guardar y aún no aparece? ¿Alguna otra idea? (PD: Muchas gracias por ayudarme con esto)

Derek Derek
17 ene 2014 02:36:59

Por favor, evita discusiones extensas en los comentarios. Si necesitas aclarar algo, realiza una [edición] en lugar de un comentario. @Shazzad Si crees que tienes una solución, por favor publícala como respuesta, no como comentario. Gracias.

kaiser kaiser
10 feb 2014 20:23:34
Mostrar los 5 comentarios restantes