Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save racmanuel/5e496943f00695750a1c3779c31fa7f4 to your computer and use it in GitHub Desktop.
Save racmanuel/5e496943f00695750a1c3779c31fa7f4 to your computer and use it in GitHub Desktop.
WooCommerce custom sale price based on role
<?php
/**
* Put this into your functions.php of your child-theme or custom plugin
* you can create the role with wp-cli by running `wp shell` and running the command:
* add_role('merchant','Merchant',array('read' => true, 'delete_posts' => false) );
*/
/**
* Step #1: create the field used to store the new sale_price for product_variation and for products
*/
add_action( 'woocommerce_product_after_variable_attributes', 'ran_variation_settings_fields', 10, 3 );
function ran_variation_settings_fields( $loop, $variation_data, $variation ) {
woocommerce_wp_text_input(
array(
'id' => '_merchant_price[' . $variation->ID . ']',
'label' => __( 'Merchant-Price', 'ran' ),
'desc_tip' => 'true',
'description' => __( 'What is the merchant price of this product?', 'ran' ),
'value' => get_post_meta( $variation->ID, '_merchant_price', true ),
'type' => 'text'
)
);
}
add_action( 'woocommerce_product_options_general_product_data', 'ran_add_custom_general_fields' );
function ran_add_custom_general_fields() {
global $woocommerce, $post;
echo '<div class="options_group">';
woocommerce_wp_text_input(
array(
'id' => '_merchant_price[' . $post->ID . ']',
'label' => __( 'Merchant-Price', 'ran' ),
'placeholder' => '',
'desc_tip' => 'true',
'description' => __( 'What is the merchant price of this product?', 'ran' ),
'value' => get_post_meta( $post->ID, '_merchant_price', true ),
'type' => 'text'
)
);
echo '</div>';
}
/**
* Step #2: save the merchant value
*/
add_action( 'woocommerce_process_product_meta', 'ran_add_custom_general_fields_save' );
add_action( 'woocommerce_save_product_variation', 'ran_add_custom_general_fields_save', 10, 2 );
function ran_add_custom_general_fields_save( $post_id ) {
if (!array_key_exists('_merchant_price', $_POST)) return;
if (!is_array($_POST['_merchant_price'])) return;
if (!array_key_exists($post_id, $_POST['_merchant_price'])) return;
$woocommerce_field = $_POST['_merchant_price'][ $post_id ];
update_post_meta( $post_id, '_merchant_price', esc_attr( $woocommerce_field ) );
}
/**
* Step #3: define when the new price will be used for discounts
*/
function ran_current_user_is_merchant() {
$user = wp_get_current_user();
if ( empty( $user ) ) {
return false;
}
if ( $user->user_email == "alexander@rent-a-ninja.org" || in_array( 'merchant', (array) $user->roles ) ) {
return true;
}
return false;
}
/**
* Step #4: change the price based on the above function
*/
add_filter( 'woocommerce_product_get_price', 'ran_custom_price', 10, 2 );
add_filter( 'woocommerce_product_variation_get_price', 'ran_custom_price', 10, 2 );
add_filter( 'woocommerce_product_get_sale_price', 'ran_custom_price', 10, 2 );
add_filter( 'woocommerce_product_variation_get_sale_price', 'ran_custom_price', 10, 2 );
add_filter( 'woocommerce_variation_prices_price', 'ran_custom_price', 10, 2 );
add_filter( 'woocommerce_variation_prices_sale_price', 'ran_custom_price', 10, 2 );
function ran_custom_price( $price, $product ) {
if ( ran_current_user_is_merchant() ) {
// get the merchant_price and return if available
$merchant_price = floatval( $product->get_meta( '_merchant_price', true ) );
if ( $merchant_price ) {
return $merchant_price;
}
}
return $price;
}
/**
* Step #5: Make sure the variation price hash is is affected by the function defined in step #3
*/
add_filter( 'woocommerce_get_variation_prices_hash', 'ran_woocommerce_get_variation_prices_hash', 10, 3 );
function ran_woocommerce_get_variation_prices_hash( $price_hash, $product, $for_display ) {
$price_hash['merchant'] = ran_current_user_is_merchant() ? 'true' : 'false';
return $price_hash;
}
/**
* (optional) Step #6: Make the cart look a little nicer
*/
add_filter( 'woocommerce_cart_product_price', 'ran_woocommerce_cart_product_price', 20, 2 );
function ran_woocommerce_cart_product_price( $price_html, $product ) {
if ( ! $product->get_sale_price() || ! $product->get_regular_price() || $product->get_sale_price() >= $product->get_regular_price() ) {
return $price_html;
}
return wc_format_sale_price(
wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ),
wc_get_price_to_display( $product, array( 'price' => $product->get_sale_price() ) )
) . $product->get_price_suffix();
}
/**
* (optional) Step #7: Show net prices based on the function in step #3
*/
add_filter( 'option_woocommerce_tax_display_shop', 'ran_show_vat' );
add_filter( 'option_woocommerce_tax_display_cart', 'ran_show_vat' );
function ran_show_vat( $value ) {
if ( is_admin() ) {
return $value;
}
if ( ran_current_user_is_merchant() ) {
return 'excl';
}
return $value;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment