Переопределить URL внешнего продукта на кнопку «Добавить в корзину»

Я работаю на сайте, который использует внешние продукты Amazon, но вместо этого указывая пользователям на этот внешний URL, сначала добавьте в корзину этот продукт. У меня есть эта функция, которая меняет текст кнопки по умолчанию для каждого продукта, чтобы добавить в корзину.

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

Но эта функция не добавляет товар в корзину.

Как сделать эту функцию для добавления выбранного продукта в корзину?

Благодарю.

Это совершенно по-другому с простыми продуктами и настраиваемой внешней ссылкой.

В этом ответе мы будем использовать простые продукты вместо внешних продуктов.

1) Мы добавляем настраиваемое поле «Внешний URL» в настройках параметров продукта, и мы сохраняем данные.

введите описание изображения здесь

Добавьте настраиваемое поле в простые параметры общих параметров продукта:

 add_action( 'woocommerce_product_options_general_product_data', 'simple_product_with_external_url' ); function simple_product_with_external_url() { global $woocommerce, $post; // only WC products if( $post->post_type != 'product' ) return; // Get an instance of WC_Product object $product = wc_get_product( $post->ID ); // Only for simple products if ( 'simple' == $product->get_type() ): echo '<div class="options_group">'; // 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>'; endif; } 

Сохраните данные настраиваемого поля, если это простой продукт, а не пустой:

 add_action( 'woocommerce_process_product_meta', 'save_simple_product_with_external_url' , 10, 1); function save_simple_product_with_external_url( $post_id ) { // Get an instance of WC_Product object $product = wc_get_product( $post_id ); $external_url = $_POST['_ext_url_cust']; // Save data if it's not empty and only a simple product if( !empty( $external_url ) && 'simple' == $product->get_type() ) update_post_meta( $post_id, '_ext_url_cust', $external_url ); } 

2) Это не будет работать на страницах магазинов и архивов, если мы не установим в WooCommerce перенаправление корзины при добавлении продукта в корзину.

Таким образом, мы заменим кнопку «добавить в корзину» (только для наших простых продуктов с настраиваемым перенастройкой ссылок) на страницах магазина и на страницах архивов с помощью связанной пользовательской кнопки на отдельные страницы продуктов.

Замена кнопки «add-to-cart» на страницах магазинов и архивов (для простых продуктов с пользовательским внешним 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 ) { if ( method_exists( $product, 'get_id' ) ) { $product_id = $product->get_id(); } else { $product_id = $product->id; } $external_url = get_post_meta( $product_id, '_ext_url_cust', true ); if ( ! empty( $external_url ) ) { // Set HERE your button link $link = get_permalink($product_id); $html = '<a href="'.$link.'" class="button alt add_to_cart_button">'.__("Read More", "woocommerce").'</a>'; } return $html; } 

3) Если значение настраиваемого поля не пустое, продукт сначала добавляется в корзину, а затем перенаправляется на внешний URL (наше настраиваемое значение поля на страницах одного продукта)

Внешнее перенаправление URL-адресов после добавления в корзину (когда пользовательское поле не пусто в простых продуктах):

 add_filter( 'woocommerce_add_to_cart_redirect', 'redirect_simple_product_with_external_url', 10, 1 ); function redirect_simple_product_with_external_url( $url ) { $product_id = absint( $_REQUEST['add-to-cart'] ); $external_url = get_post_meta( $product_id, '_ext_url_cust', true ); $product = wc_get_product( $product_id ); if ( 'simple' == $product->get_type() && ! empty( $external_url ) ) $url = $external_url; return $url; } 

Код идет в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.

Этот код проверен и работает на WooCommerce версии 2.6.x

Вы должны попытаться использовать woocommerce_product_add_to_cart_url фильтр, чтобы изменить ссылку «add-to-cart» (здесь для сгруппированных продуктов), таким образом:

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

Код идет в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.

Обновление. Но это не добавит в корзину этот внешний продукт, прежде чем перенаправить на внешний URL-адрес, даже если он будет отображать URL-адрес, добавленный в корзину (так как add-to-cart является ajax-ведомым).

Я исправил себя. Для Внешних продуктов, чтобы заменить по умолчанию «Купить этот продукт» с другим общим текстом, добавьте эти функции в файл functions.php в тему:

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

и этот:

 function wpf_custom_add_cart_text() { return __( 'Add to Cart', 'woocommerce' ); } 

заменить текст повсюду.