2

I work on site that use External products from Amazon, but want instead pointing users to that external URL, first to add to cart that product. I have this function, that change Default Button text for each product, to Add to cart.

function sv_wc_external_product_button( $button_text, $product ) {

    if ( 'external' === $product->get_type() ) {
        // enter the default text for external products
        return $product->button_text ? $product->button_text : 'Add To Cart';
    }
    return $button_text;
}
add_filter( 'woocommerce_product_single_add_to_cart_text', 
'sv_wc_external_product_button', 10, 2 );

But this function not add product to cart.

How to make this function to Add selected product to cart?

Thanks.

LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
Dora
  • 285
  • 5
  • 19

3 Answers3

2

Updated 2020

This is a complete different way with simple products and a custom field external link.

In this answer we will use simple products instead of external products.

  1. We add an "External URL" custom field in product option settings and we save the data.

enter image description here

Add a custom field on general product option settings for simple products only :

add_action( 'woocommerce_product_options_general_product_data', 'simple_product_with_external_url' );
function simple_product_with_external_url() {
    global $product_object;

    echo '<div class="options_group show_if_simple hidden">';

    // External Url
    woocommerce_wp_text_input( array(
        'id'          => '_ext_url_cust',
        'label'       => 'External Url',
        'description' => 'Custom external URL',
        'desc_tip'    => 'true',
        'placeholder' => 'Enter here your custom external URL'
    ) );

    echo '</div>';
}

Save the custom field data if it's a simple product and not empty:

add_action( 'woocommerce_admin_process_product_object', 'save_simple_product_with_external_url' );
function save_simple_product_with_external_url( $product ) {
    if( $product->is_type('simple') && isset($_POST['_ext_url_cust']) ) {
        $product->update_meta_data( '_ext_url_cust', sanitize_url($_POST['_ext_url_cust']) );
    }
}

2) This will not work on shop pages and archives pages, if we don't set in WooCommerce the cart redirection when adding a product to cart.

So we will replace add-to-cart button (just for our simple products with a custom link redirection) on shop pages and archives pages by a linked custom button to single product pages.

Replacing add-to-cart button in shop pages and archives pages (for simple products with custom external url):

add_filter( 'woocommerce_loop_add_to_cart_link', 'quantity_inputs_for_woocommerce_loop_add_to_cart_link', 10, 2 );
function quantity_inputs_for_woocommerce_loop_add_to_cart_link( $html, $product ) {
    $external_url = $product->get_meta('_ext_url_cust');

    if ( ! empty($external_url) ) {
        $html = sprintf( '<a href="%s" class="button alt add_to_cart_button">%s</a>', $product->get_permalink(), __("Read More", "woocommerce") );
    }
    return $html;
}

3) If the custom field value is not empty, the product is added to cart first and then redirected to the external URL (our custom field value in single product pages)

External URL redirection after adding to cart (when custom field is not empty in simple products):

add_filter( 'woocommerce_add_to_cart_redirect', 'redirect_simple_product_with_external_url' );
function redirect_simple_product_with_external_url( $url ) {
    if( isset($_REQUEST['add-to-cart']) && absint( $_REQUEST['add-to-cart'] ) > 0 )
        return get_post_meta( absint( $_REQUEST['add-to-cart'] ), '_ext_url_cust', true );

    return $url;
}

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

This code is tested and works on WooCommerce version 3+

LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
  • 1
    Thank you. I have upvoted and said thanks to your post. – xojijog684 Jul 18 '20 at 19:27
  • Hi LoicTheAztec, thanks for the updated answer. I have tried the updated code. While I am able to enter the URL (https://i.imgur.com/T9E05rP.png), I don't think it correctly works on the front end (https://i.imgur.com/YYi35bV.png)? In the first screenshot, I changed the URL for a product to `https://www.hotmail.com`. However, when I hover my mouse over the `Read More` button on the front end, the second screenshot shows that it is still the original product URL. May I know how to resolve this? Thanks. – xojijog684 Jul 19 '20 at 04:03
  • 1
    @xojijog684 There was still some mistakes in my code… Now it works just fine. It's normal that the "read more" link goes to the product single page. Then on the product single page, you can add the product to cart getting redirected to the custom URL at the same time *(just like in the initial answer that was for WooCommerce version 2.6.x)* – LoicTheAztec Jul 19 '20 at 05:02
1

Use https://stackoverflow.com/a/44036965/3730754 instead.

You should try to use woocommerce_product_add_to_cart_url filter hook to change the add-to-cart link (here for grouped products), this way:

add_filter( 'woocommerce_product_add_to_cart_url', 'override_external_product_url', 10, 2 );
function override_external_product_url( $url, $product ){
    if ( 'external' === $product->get_type() ) {
        //Get product ID -- WooCommerce compatibility
        if ( method_exists( $product, 'get_id' ) ) {
            $product_id = $product->get_id();
        } else {
            $product_id = $product->id;
        }
        // custom add to cart url example
        $url = home_url( "/product/?add-to-cart=$product_id");
    }
    return $url;
}

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

Update: But this will not add to cart this external product before redirecting to an external url even if it works displaying the add-to-cart url (as add-to-cart is ajax driven).

LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
0

I fixed myself. For External products, to replace default "Buy This Product" with other generic text, add this functions into functions.php file into theme:

add_filter( 'woocommerce_product_add_to_cart_text' , 
'wpf_custom_add_cart_text_archive',11);


function wpf_custom_add_cart_text_archive() {

   global $product;


   $product_type = $product->product_type;


   switch ( $product_type ) {

          case 'external':

                 return __( 'Add to Cart', 'woocommerce' );

                 break;

          case 'grouped':

                 return __( 'View products', 'woocommerce' );

                 break;

          case 'simple':

                 return __( 'Add to cart', 'woocommerce' );

                 break;

          case 'variable':

                 return __( 'Select options', 'woocommerce' );

                 break;

          default:

                 return __( 'Read more', 'woocommerce' );

   }

}

   add_filter( 'woocommerce_product_single_add_to_cart_text', 
'wpf_custom_add_cart_text',11);

and this one:

function wpf_custom_add_cart_text() {

  return __( 'Add to Cart', 'woocommerce' );

 }

to replace text everywhere.

Dora
  • 285
  • 5
  • 19