php - ingles - qué significa en español
Anular la URL del producto externo al botón del producto "Agregar al carrito" (3)
Trabajo en un sitio que usa productos externos de Amazon, pero en lugar de eso quiero señalar a los usuarios a esa URL externa, primero para agregar al carrito ese producto. Tengo esta función, que cambia el texto del botón predeterminado para cada producto, para agregar al carrito.
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 );
Pero esta función no agrega producto al carrito.
¿Cómo hacer que esta función agregue el producto seleccionado al carro?
Gracias.
Esta es una forma completamente diferente con productos simples y un enlace externo de campo personalizado.
En esta respuesta utilizaremos productos simples en lugar de productos externos.
1) Agregamos un campo personalizado "URL externa" en la configuración de opciones del producto y guardamos los datos.
Agregue un campo personalizado en la configuración de opciones generales de productos simples:
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;
}
Guarde los datos del campo personalizado si es un producto simple y no está vacío:
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) Esto no funcionará en páginas de tiendas y archivos, si no configuramos en WooCommerce la redirección de carritos al agregar un producto al carrito.
Por lo tanto, reemplazaremos el botón Agregar al carrito (solo para nuestros productos sencillos con una redirección de enlaces personalizada) en las páginas de las tiendas y archiva páginas mediante un botón personalizado vinculado a las páginas de productos individuales.
Reemplazar el botón Agregar al carrito en páginas de tiendas y archivos (para productos simples con url externo personalizado):
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) Si el valor del campo personalizado no está vacío, el producto se agrega primero al carrito y luego se redirige a la URL externa (nuestro valor de campo personalizado en páginas de productos individuales)
Redirección de URL externa después de agregar al carro (cuando el campo personalizado no está vacío en productos simples):
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;
}
El código va en el archivo function.php de su tema hijo activo (o tema) o también en cualquier archivo de complemento.
Este código está probado y funciona en WooCommerce versión 2.6.x
Debería intentar utilizar el gancho del filtro woocommerce_product_add_to_cart_url
para cambiar el enlace agregar al carro (aquí para productos agrupados), de esta manera:
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;
}
El código va en el archivo function.php de su tema hijo activo (o tema) o también en cualquier archivo de complemento.
Actualización: Pero esto no agregará al carrito este producto externo antes de redireccionar a una url externa, incluso si funciona mostrando la url de agregar al carro (ya que add-to-cart está impulsado por Ajax).
Me arreglé a mí mismo. Para productos externos, para reemplazar el predeterminado "Comprar este producto" con otro texto genérico, agregue estas funciones al archivo functions.php en el tema:
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);
y éste:
function wpf_custom_add_cart_text() {
return __( ''Add to Cart'', ''woocommerce'' );
}
para reemplazar el texto en todas partes.