php - How to link external products on the Shop page to the Product page in WooCommerce for specific product categories ONLY

Hi Everyone.

So i have found this code shown below: (credit to https://www.tychesoftwares.com/how-to-link-external-products-on-the-shop-page-to-the-product-page-in-woocommerce/)

The quesion i need help with is how to modify this code so it only works on certain product categories, at the moment the code is applied to all products sitewide.

add_filter( 'woocommerce_loop_add_to_cart_link', 'ts_link_external_product_page', 16, 3 );
function ts_link_external_product_page( $button, $product, $args ) {
  $url = $product->add_to_cart_url();
  $button_text = $product->add_to_cart_text();
  if ( 'external' === $product->get_type() ) {
    $url = $product->get_permalink();
    $button_text = "View Details";
  }
  return sprintf( '<a href="%s" data-quantity="%s" class="%s" %s>%s</a>',
    esc_url($url),
    esc_attr( isset( $args['quantity'] ) ? $args['quantity'] : 1 ),
    esc_attr( isset( $args['class'] ) ? $args['class'] : 'button' ),
    isset( $args['attributes'] ) ? wc_implode_html_attributes( $args['attributes'] ) : '',
    esc_html( $button_text)
  );
}

 

I feel like i need to add a line like "if(is_product_category( array( 'catslugurl', 'anothercatslugurl' ) )){" but can not seem to be able to get it to work.

Any help with this would be great. Thank you so much :)

I feel like i need to add a line like "if(is_product_category( array( 'catslugurl', 'anothercatslugurl' ) )){" but can not seem to be able to get it to work.

Answer

Solution:

Try this:

add_filter( 'woocommerce_loop_add_to_cart_link', 'ts_link_external_product_page', 16, 3 );

function ts_link_external_product_page( $button, $product, $args ) {
    $url         = $product->add_to_cart_url();
    $button_text = $product->add_to_cart_text();
    $categories  = array( 'music', 'clothes' ); //Your specific categories 
    $product_id  = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id;
    if ( has_term( $categories, 'product_cat', $product_id ) && 'external' === $product->get_type() ) {
            $url         = $product->get_permalink();
            $button_text = 'View Details';

    }
    return sprintf(
        '<a href="%s" data-quantity="%s" class="%s" %s>%s</a>',
        esc_url( $url ),
        esc_attr( isset( $args['quantity'] ) ? $args['quantity'] : 1 ),
        esc_attr( isset( $args['class'] ) ? $args['class'] : 'button' ),
        isset( $args['attributes'] ) ? wc_implode_html_attributes( $args['attributes'] ) : '',
        esc_html( $button_text )
    );
}

Source