J'utilise la fonction suivante pour ajouter un champ personnalisé appelé "price_1_50" à chaque variante de produit:
add_action( 'woocommerce_variation_options_pricing', 'bbloomer_add_custom_field_to_variations', 10, 3 );
function bbloomer_add_custom_field_to_variations( $loop, $variation_data, $variation ) {
woocommerce_wp_text_input( array(
'id' => 'price_1_50[' . $loop . ']',
'class' => 'short',
'label' => __( 'Price 1-50:', 'woocommerce' ),
'value' => get_post_meta( $variation->ID, 'price_1_50', true )
));
}
add_action( 'woocommerce_save_product_variation', 'bbloomer_save_custom_field_variations', 10, 2 );
function bbloomer_save_custom_field_variations( $variation_id, $i ) {
$price_1_50 = $_POST['price_1_50'][$i];
if ( isset( $price_1_50 ) ) update_post_meta( $variation_id, 'price_1_50', esc_attr( $price_1_50 ) );
}
add_filter( 'woocommerce_available_variation', 'bbloomer_add_custom_field_variation_data' );
function bbloomer_add_custom_field_variation_data( $variations ) {
$variations['price_1_50'] = '<div class="woocommerce_custom_field">Price 1-50:
<span>'get_post_meta( $variations[ 'variation_id' ], 'price_1_50', true ) . '</span></div>';
return $variations;
}
Dans functions.php, j'ai écrit une fonction qui remplace le prix du produit par le champ personnalisé "price_1_50" mais je pense que je ne peux pas obtenir l'ID de variation pour afficher le champ personnalisé dans le frontend.
J'ai essayé
var price = <?php echo get_post_meta( $variation_id, 'price_1_50', true ); ?>;
var price = <?php echo get_post_meta( get_the_ID(), 'price_1_50', true ); ?>;
$arrvariations = $variation->get_children (); $price_1_50 = get_post_meta( $arrvariations, 'price_1_50', true ); echo $price_1_50;
La seule façon d'obtenir un résultat dans le frontend sur une seule page de produit est d'écrire l'ID de variation.
var price = <?php echo get_post_meta( 10652, 'price_1_50', true ); ?>;
Ok, j'ai réussi à résoudre ça. Voici comment j'ai finalement créé le champ personnalisé des variations:
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' => 'price_1_50[' . $variation->ID . ']',
'class' => 'price_1_50',
'type' => 'text',
'label' => __( 'Price | Product amount: 1-49', 'woocommerce' ),
'placeholder' => '',
'desc_tip' => 'true',
'description' => __( 'Enter price for product amount 1-49 (if available)', 'woocommerce' ),
'value' => get_post_meta( $variation->ID, 'price_1_50', true )
)
);
}
function save_variation_settings_fields( $post_id ) {
$text_field = $_POST['_price_1_50'][ $post_id ];
if( ! empty( $text_field ) ) {
update_post_meta( $post_id, 'price_1_50', esc_attr( $text_field ) );
}
}
Et c'est ainsi que j'ai obtenu le résultat souhaité en frontend (basé sur: https://stackoverflow.com/questions/47646939/how-to-get-woocommerce-variation-id )
$args = array(
'post_type' => 'product_variation',
'post_status' => array( 'private', 'publish' ),
'numberposts' => -1,
'orderby' => 'menu_order',
'order' => 'asc',
'post_parent' => get_the_ID() // get parent post-ID
);
$variations = get_posts( $args );
foreach ( $variations as $variation ) {
$variation_ID = $variation->ID;
$product_variation = new WC_Product_Variation( $variation_ID );
get_post_meta( $variation_ID , 'price_1_50', true );
}
Essayez d'utiliser les éléments suivants:
$post = $wp_query->post;
global $post;
Utilisez ensuite:
$price = get_post_meta($post->ID,'price_1_50',true);
echo $price;