Yara Joe
Yara Joe

Reputation: 61

woocommerce add to cart button on single product page

On WooCommerce, I would like a custom add to cart button redirection for specific categories to contact us page (when customer click on the add to cart button in single product pages).

This is my code:

add_filter( 'woocommerce_add_to_cart_redirect', 'rv_redirect_to_url' );
function rv_redirect_to_url() {

    global $woocommerce, $post;

    $product_id = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $_REQUEST['add-to-cart'] ) );

    $rv_woo_redirect_url = get_post_meta( $product_id, '_rv_woo_product_custom_redirect_url', true );

    if ( ! empty( $rv_woo_redirect_url ) ) {

        wp_redirect( esc_url( $rv_woo_redirect_url ) ); exit;

    }

}

How can I change my code to get it working only for defined product categories?

Upvotes: 3

Views: 7856

Answers (2)

LoicTheAztec
LoicTheAztec

Reputation: 254373

Updated (the right custom url when it's a defined product category)

Using a custom function hooked in woocommerce_add_to_cart_redirect filter hook, that will redirect customer when a product is added to cart (for defined product category(ies)):

add_filter( 'woocommerce_add_to_cart_redirect', 'conditional_add_to_cart_redirection', 99, 1 );
function conditional_add_to_cart_redirection( $url ) {

    // ==> HERE define your product category or categories in the array
    $category = array( 'clothing', 'music' );

    if ( ! isset( $_REQUEST['add-to-cart'] ) ) return $url; // Very important!

    // When it's available (on add to cart click), get the product ID
    $product_id = absint( $_REQUEST['add-to-cart'] );

    // Get the custom url from product post meta data
    $custom_url = get_post_meta( $product_id, '_rv_woo_product_custom_redirect_url', true );

    // Exit to normal, If the custom URL redirection is not set in the product
    if( empty( $custom_url ) ) return $url;

    // Custom redirection only for your defined product category(ies)
    if( has_term( $category, 'product_cat', $product_id ) ){
        // Clear add to cart notice (with the cart link).
        wc_clear_notices();
        $url = $custom_url; // Updated here
    }
    return $url;
}

Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

Code is tested on Woocommerce 3+ and works


Add to cart redirection will not work with ajax add to cart on shop and archives pages. So you will have to choose between that 2 options for shop and archives pages:

  1. Disable ajax add-to-cart on shop and archives pages ( WC settings > Products > Display ).
  2. Add the following code to replace the add to cart button, by a button linked to the product:

This 2nd option seems to be the best (as this is conditional on some products only):

// Conditionally changing add to cart button link and text on shop and archives
add_filter( 'woocommerce_loop_add_to_cart_link', 'replacing_add_to_cart_button', 10, 2 );
function replacing_add_to_cart_button( $button, $product ) {
    if( $product->is_type( 'variable-subscription' ) || $product->is_type( 'variable' ) ) return $button;

    // ==> HERE define your product category or categories in the array
    $category = array( 'clothing', 'music' );

    // Check that the custom url from product post meta data is not empty
    $custom_url = get_post_meta( $post->ID, '_rv_woo_product_custom_redirect_url', true );
    if( empty( $custom_url ) )  return $button;

    // Check if the current product has a defined product category(ies)
    if( ! has_term( $category, 'product_cat', $post->ID ) ) return $button;

    $button_text = __( 'View product', 'woocommerce' );
    $button = '<a class="button" href="' . $product->get_permalink() . '">' . $button_text . '</a>';

    return $button;
}

Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

Code is tested on Woocommerce 3+ and works

Upvotes: 3

helgatheviking
helgatheviking

Reputation: 26319

If the product is not meant to be purchased outright, then I would filter woocommerce_is_purchasable and replace the add to cart button with a button-styled link to your contact form.

function so_46395830_not_purchasable( $is_purchasable, $product ) {

    $rv_woo_redirect_url = $product->get_meta( '_rv_woo_product_custom_redirect_url', true );

    if ( ! empty( $rv_woo_redirect_url ) ) {
        add_action( 'woocommerce_single_product_summary', 'so_46395830_redirect_to_contact' );
    }
    return $is_purchasable;
}
add_filter( 'woocommerce_is_purchasable', 'so_46395830_not_purchasable', 10, 2 );


function so_46395830_redirect_to_contact( $url ) {
    global $product;
    $rv_woo_redirect_url = $product->get_meta( '_rv_woo_product_custom_redirect_url', true );
    echo sprintf( '<a class="button" href="%s">%s</a>', esc_url( $rv_woo_redirect_url ), __( 'Contact Us for Info', 'your-plugin-textdomain' ) );
}

Upvotes: 0

Related Questions