• April 8, 2018
  • Development

WooCommerce Memberships: Change Cart Price

Recently, we had a project using WooCommerce Memberships and needed to be able to offer a free membership subscription to first time buyers in addition to giving the membership discounted price so long as the customer is buying both.  We run a check using wc_memberships_get_user_memberships( $user_id ) to check if the user has ever been a member, and then check the cart for each product using $cart_object->get_cart().  The full code is below:

add_filter( 'woocommerce_before_calculate_totals', 'mps_registration_price', 10, 1 );

function mps_registration_price( $cart_object ) {
  // Bail if memberships is not active
  if ( ! function_exists( 'wc_memberships' ) ) return; // Exit

  // Only for non members
  $user_id = get_current_user_id();
  if ( wc_memberships_get_user_memberships( $user_id ) ) return; // Exit

  // First loop to check if product 1 is in cart
  foreach ( $cart_object->get_cart() as $cart_item ){
    $is_in_cart = $cart_item['product_id'] == 1 ? true : false;
  }

  // Second loop change prices
  foreach ( $cart_object->get_cart() as $cart_item ) {

    // Get an instance of the WC_Product object (or the variation product object)
    $product = $cart_item['data'];

    // Method is_on_sale() manage everything (dates…)
    // Here we target product ID 2
    if( $product->is_on_sale() && $product->get_id() == 2 ) {

      // When product 1 is not cart
      if( ! $is_in_cart ){
        $product->set_price( $product->get_sale_price() + 50);
      }
    }
  }
}

In this example, product 1 is an item that has a special discounted price for active membership subscriptions. Product 2 is the membership subscription. If product 1 is in the cart and the user has never been a member, the price will be set to 0.  If product 2 is added to the cart AND product 1 is in the cart, the price for product 2 will change to the sale price.  If product 1 is removed, the price for product 2 is changed back to the original price.

%d bloggers like this: