Estoy tratando de actualizar el precio normal del producto usando la clave meta _regular_price con un número entero o una cadena cuando el producto se actualiza en el wp-admin.

Mi flujo de usuario deseado es:

  1. Abra la página de edición del producto
  2. Haga clic en el botón actualizar
  3. Vea que _regular_price se establece en 20 después de que la página se haya recargado.

add_action( 'woocommerce_process_product_meta', 'update_test' );
function update_test( $post_id ) {
    update_post_meta( $post_id, '_regular_price', 20 );
}

Ayúdeme a encontrar lo que estoy haciendo mal en la función anterior y avíseme de otras formas de lograrlo.

1
Justin Waulters 14 nov. 2017 a las 07:27

2 respuestas

La mejor respuesta

Actualizada (agosto de 2018)

Su código es correcto pero el gancho es maid para campos personalizados de Metaboxes.

En su lugar, debería utilizar save_post_{$post->post_type} Gancho de Wordpress orientado solo al tipo de publicación de producto .

Además, es posible que deba actualizar el precio activo y actualizar la caché transitoria del producto con la función wc_delete_product_transients().

Entonces su código será:

add_action( 'save_post', 'update_the_product_price', 10, 3 );
function update_the_product_price( $post_id, $post, $update ) {

    if ( $post->post_type != 'product') return; // Only products

    // If this is an autosave, our form has not been submitted, so we don't want to do anything.
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;

    // Check the user's permissions.
    if ( ! current_user_can( 'edit_product', $post_id ) )
        return $post_id;

    $price = 50; // <===  <===  <===  <===  <===  <=== Set your price

    $product = wc_get_product( $post_id ); // The WC_Product object

    // if product is not on sale
    if( ! $product->is_on_sale() ){
        update_post_meta( $post_id, '_price', $price ); // Update active price
    }
    update_post_meta( $post_id, '_regular_price', $price ); // Update regular price
    wc_delete_product_transients( $post_id ); // Update product cache
}

El código va en el archivo function.php de su tema secundario activo (o tema) o también en cualquier archivo de complemento.

Probado y funciona ...

1
LoicTheAztec 1 ago. 2018 a las 04:37

Para procesar woocommerce_process_product_meta, supongo que le faltan los parámetros. Espero que el siguiente código se adapte a sus necesidades.

add_action( 'woocommerce_process_product_meta',  $wc_meta_box_product_data_save,  $int,  $int ); 

Parámetros (3)

  • $ wc_meta_box_product_data_save (string) => 'WC_Meta_Box_Product_Data :: save' Se guardan los datos del producto de wc meta box.
  • $ int (int) => 10 El int.
  • $ int (int) => 2 La int.

Puede encontrar los detalles en este enlace.

0
mukesh 14 nov. 2017 a las 04:32