Я работаю на сайте, который использует внешние продукты 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' ); }
заменить текст повсюду.