2
votes

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?

2
What is your code currently doing compared to what you want it to do? Also, I think that the redirect occurs after the product is added to the cart. Do you still want it to be added to the cart? That seems at odds with your desire to redirect towards a contact page.helgatheviking
@helgatheviking No I don't want to add it to the cart it'll be a special orderYara Joe
In that case, I think the redirect is the wrong approach.helgatheviking
@YaraJoe I have updated my code, there was a little mistake with your custom url… Now the custom redirect works. Reading your comments, you could use this answer code: Customize “Add to cart” button for a specific product category in WooCommerceLoicTheAztec

2 Answers

2
votes

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

0
votes

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' ) );
}