web-dev-qa-db-fra.com

Woocommerce obtenir le prix du produit de la variation

J'essaie d'afficher le prix de la variation du produit dans la liste déroulante des variations . Je tente de modifier le comportement par défaut lorsque le prix est affiché dans une division lorsque vous choisissez une variation dans la liste déroulante.

Le problème est que je ne peux pas trouver où cette division obtient le prix de la variation. J'ai cherché tout le javascript mais je n'ai pas pu le trouver

Si j'utilise:

add_filter('woocommerce_variation_option_name' ,'add_price_to_dropdown');

function add_price_to_dropdown($name){

    global $product;
    return $name.' '.$product->get_price_html();
}

Je viens d'obtenir le prix de variation min pour toutes les options. Je veux obtenir le prix pour chaque variation. Un indice?

17
chifliiiii

Voici le code que vous recherchez

add_filter( 'woocommerce_variation_option_name', 'display_price_in_variation_option_name' );

function display_price_in_variation_option_name( $term ) {
    global $wpdb, $product;

    if ( empty( $term ) ) return $term;
    if ( empty( $product->id ) ) return $term;

    $result = $wpdb->get_col( "SELECT slug FROM {$wpdb->prefix}terms WHERE name = '$term'" );

    $term_slug = ( !empty( $result ) ) ? $result[0] : $term;

    $query = "SELECT postmeta.post_id AS product_id
                FROM {$wpdb->prefix}postmeta AS postmeta
                    LEFT JOIN {$wpdb->prefix}posts AS products ON ( products.ID = postmeta.post_id )
                WHERE postmeta.meta_key LIKE 'attribute_%'
                    AND postmeta.meta_value = '$term_slug'
                    AND products.post_parent = $product->id";

    $variation_id = $wpdb->get_col( $query );

    $parent = wp_get_post_parent_id( $variation_id[0] );

    if ( $parent > 0 ) {
         $_product = new WC_Product_Variation( $variation_id[0] );
         return $term . ' (' . wp_kses( woocommerce_price( $_product->get_price() ), array() ) . ')';
    }
    return $term;

}

J'espère que cela vous sera utile.

38

Cela pourrait vous aider les gars; en cherchant comment faire de même avec la nouvelle version de WC:

global $woocommerce;
$product_variation = new WC_Product_Variation($_POST['variation_id']);
$regular_price = $product_variation->regular_price;

J'utilise ajax et passe l'ID de la variante avec la méthode post.

12
numediaweb

J'avais exactement la même question que l'OP, mais mon cas était un peu différent. Voici ma solution qui peut aider d'autres personnes qui atterrissent également sur cette page.

function get_product_variation_price($variation_id) {
    $product = new WC_Product_Variation($variation_id);
    return $product->product_custom_fields['_price'][0];
}

UPDATE pour WooCommerce 2.2.10: Le code ci-dessus ne fonctionne pas sur la version actuelle de WooCommerce. Ce code, ci-dessous, fonctionne et mérite d'être pris en compte puisqu'il utilise l'API WooCommerce, il évite les requêtes SQL manuelles et est assez simple ...

/*
 * You can find the $variation_id in the Product page (go to Product Data > Variations, and it is shown with a preceeding "#" character)
 */
function get_product_variation_price($variation_id) {

    global $woocommerce; // Don't forget this!
    $product = new WC_Product_Variation($variation_id);
    //return $product->product_custom_fields['_price'][0]; // No longer works in new version of WooCommerce
    //return $product->get_price_html(); // Works. Use this if you want the formatted price
    return $product->get_price(); // Works. Use this if you want unformatted price

}
4
ban-geoengineering

J'utilisais ce code sur Woocommerce pour afficher mes prix de variation et lors de ma mise à jour vers Woocommerce 2.0, j'ai constaté des erreurs de base de données dans wp-admin/error-log chaque fois que je modifiais un produit. Je ne sais pas si les erreurs se produisaient également avant la mise à jour vers la version 2.0, car je n'utilisais pas Woocommerce bien avant la mise à jour et je ne pense pas avoir consulté le journal des erreurs jusqu'à ce jour. 

Les prix de variation se présentaient comme prévu, mais le journal des erreurs se remplissait de l'erreur suivante chaque fois que j'ouvrais un produit pour le modifier. Il y avait une erreur pour chaque variante associée au produit que je modifiais. 

WordPress database error You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 8 for query SELECT postmeta.post_id AS product_id
            FROM wp_postmeta AS postmeta
                LEFT JOIN wp_posts AS products ON ( 

products.ID = postmeta.post_id )
            WHERE postmeta.meta_key LIKE 'attribute_%'
                AND postmeta.meta_value = '12'
                AND products.post_parent =  made by 

include('wp-admin/edit-form-advanced.php'), do_meta_boxes, call_user_func, woocommerce_product_data_box, do_action('woocommerce_product_write_panels'), call_user_func_array, variable_product_type_options, include('/plugins/woocommerce/admin/post-types/writepanels/variation-admin-html.php'), apply_filters('woocommerce_variation_option_name'), call_user_func_array, display_price_in_variation_option_name

J'ai changé la ligne suivante dans votre code: AND products.post_parent = $ product-> id "; À ceci AND products.post_parent = '$ product-> id'";

et maintenant, plus d'erreurs. Le journal des erreurs reste sympa et vide.

Je voulais juste partager si quelqu'un d'autre rencontrait le problème.

4
Janine

Mon point de vue sur cette question, travaillant dans le dernier Woocommerce: 3.2.1 (Octobre 2017) Price montrera à côté de la variation dans la liste déroulante.

add_filter( 'woocommerce_variation_option_name', 'display_price_in_variation_option_name' );

function display_price_in_variation_option_name( $term ) {
    global $wpdb, $product;

    $result = $wpdb->get_col( "SELECT slug FROM {$wpdb->prefix}terms WHERE name = '$term'" );

    $term_slug = ( !empty( $result ) ) ? $result[0] : $term;


    $query = "SELECT postmeta.post_id AS product_id
                FROM {$wpdb->prefix}postmeta AS postmeta
                    LEFT JOIN {$wpdb->prefix}posts AS products ON ( products.ID = postmeta.post_id )
                WHERE postmeta.meta_key LIKE 'attribute_%'
                    AND postmeta.meta_value = '$term_slug'
                    AND products.post_parent = $product->id";

    $variation_id = $wpdb->get_col( $query );

    $parent = wp_get_post_parent_id( $variation_id[0] );

    if ( $parent > 0 ) {
        $_product = new WC_Product_Variation( $variation_id[0] );
        $_currency = get_woocommerce_currency_symbol();
        return $term . ' ('.$_currency.' '. $_product->get_price()  . ')';
    }
    return $term;

}

J'espère que celui-ci aide quelqu'un . Ajoutez ceci dans le thème de votre enfant functions.php

0
Cynthia Lara