Woocommerce get variation product price
Here is the code you are looking for
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;
$id = $product->get_id();
$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 = $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;
}
Hope this will be useful.
This might help you guys; while searching how to do the same with the new version of WC:
global $woocommerce;
$product_variation = new WC_Product_Variation($_POST['variation_id']);
$regular_price = $product_variation->regular_price;
I'm using ajax and passing the ID of the variation with post method.
I had exactly the same question as the OP, but my case was a bit different. Here is my solution which may help others who also land on this page.
function get_product_variation_price($variation_id) {
$product = new WC_Product_Variation($variation_id);
return $product->product_custom_fields['_price'][0];
}
UPDATE for WooCommerce 2.2.10: The above code doesn't work on the current version of WooCommerce. This code, below, works and is worth considering as it uses the WooCommerce API, it avoids manual SQL queries and is pretty 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
}
I have been using this code on Woocommerce to show my variation prices and when I updated to Woocommerce 2.0 I noticed database errors showing up in wp-admin/error-log whenever I edited a product. I am not sure if the errors were also happening prior to updating to 2.0 because I wasn't using Woocommerce for long before the update and don't think I checked the error log until today.
The variation prices showed up as expected but the error log would fill up with the following error every time I opened a product for editing. There was an error for every variation associated with the product I was editing.
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
I changed the following line in your code: AND products.post_parent = $product->id"; to this AND products.post_parent = '$product->id' ";
and now, no more errors. The error log stays nice and empty.
Just wanted to share in case anybody else ran into the problem.