textos - personalizar pagina de producto woocommerce
woocommerce cambia el precio mientras lo agregas al carrito (4)
En primer lugar, quiero advertirle que si usa el precio en la URL de su enlace add_to_cart puede hacer que su tienda sea vulnerable. Si usa esto en meta del producto, estaría más seguro. De todos modos, te estoy mostrando el código para lograr cómo establecer el precio de la url.
add_filter( ''woocommerce_add_cart_item'', ''c_other_options_add_cart_item'', 20, 1 );
function c_other_options_add_cart_item( $cart_item ) {
if (isset($cart_item[''_other_options''])) :
if( isset($cart_item[''_other_options''][''product-price'']) )
$extra_cost = floatval($cart_item[''_other_options''][''product-price'']);
$cart_item[''data'']->adjust_price( $extra_cost );
// here the real adjustment is going on...
endif;
return $cart_item;
}
add_filter( ''woocommerce_add_cart_item_data'', ''c_other_options_add_cart_item_data'', 10, 2 );
function c_other_options_add_cart_item_data($cart_item_meta, $product_id){
global $woocommerce;
$product = new WC_Product( $product_id);
$price = $product->price;
if(empty($cart_item_meta[''_other_options'']))
$cart_item_meta[''_other_options''] = array();
$cart_item_meta[''_other_options''][''product-price''] = esc_attr($_REQUEST[''price'']) - $price;
// as woocommerce allows to adjust the price (i don''t know if there is any way to reset it, but this procedure works), we need to return the adjustable price
return $cart_item_meta;
}
Tengo un producto de 1 € y uso el parámetro e GET para cambiar el precio en tiempo de ejecución:
http://url/warenkorb/?add-to-cart=1539&price=18.45
Este cambio no es el precio en la cesta (todavía quedan 1 €)
Cómo lograr esto
Yo uso el siguiente enlace:
add_filter( ''woocommerce_add_cart_item'', ''my_woocommerce_add_cart_item'', 5, 1 );
function my_woocommerce_add_cart_item( $cart_item ) {
if(get_post_meta( $cart_item[''data'']->id, ''isConfigurableProduct'', true)==''1'')
{
if(isset($_GET[''price'']))
{
$price=$_GET[''price''];//keep it simpel for testing
$cart_item[''data'']->set_price( $price );
$_SESSION[$cart_item[''data'']->id]=$price;
}
else
{
$cart_item[''data'']->set_price($_SESSION[$cart_item[''data'']->id]);
}
}
return $cart_item;
}
Gracias
No funciona para mí, lo modifiqué para modificar el precio pasado por un parámetro
spainbox.com/carro/?add-to-cart=28792&shippingprice=141
El producto tiene un precio de 1 euro, y necesito agregar al carrito este producto porque es un servicio que tendrá el precio del costo de envío
<?
add_filter( ''woocommerce_add_cart_item'', ''c_other_options_add_cart_item'', 20, 1 );
function c_other_options_add_cart_item( $cart_item ) {
if (isset($cart_item[''_other_options''])) :
if( isset($cart_item[''_other_options''][''product-price'']) )
$extra_cost = floatval($cart_item[''_other_options''][''product-price'']);
$cart_item[''data'']->adjust_price( $extra_cost );
// here the real adjustment is going on...
endif;
return $cart_item;
}
add_filter( ''woocommerce_add_cart_item_data'', ''c_other_options_add_cart_item_data'', 10, 2 );
function c_other_options_add_cart_item_data($cart_item_meta, $product_id){
global $woocommerce;
$product = new WC_Product( $product_id);
$price = $product->price;
if(empty($cart_item_meta[''_other_options'']))
$cart_item_meta[''_other_options''] = array();
$cart_item_meta[''_other_options''][''product-price''] = esc_attr($_REQUEST[''shippingprice'']);
// as woocommerce allows to adjust the price (i don''t know if there is any way to reset it, but this procedure works), we need to return the adjustable price
return $cart_item_meta;
}
?>
Con WooCommerce 2.5 descubrí que se trata de un proceso de dos partes. El primer paso es cambiar la visualización del precio en tiempo de ejecución cuando se agrega al carro a través del filtro woocommerce_add_cart_item. La segunda parte es establecer los datos de sesión persistentes que se leen durante la verificación a través del filtro woocommerce_get_cart_item_from_session.
add_filter( ''woocommerce_add_cart_item'' , ''set_woo_prices'');
add_filter( ''woocommerce_get_cart_item_from_session'', ''set_session_prices'', 20 , 3 );
function set_woo_prices( $woo_data ) {
if ( ! isset( $_GET[''price''] ) || empty ( $_GET[''price''] ) ) { return $woo_data; }
$woo_data[''data'']->set_price( $_GET[''price''] );
$woo_data[''my_price''] = $_GET[''price''];
return $woo_data;
}
function set_session_prices ( $woo_data , $values , $key ) {
if ( ! isset( $woo_data[''my_price''] ) || empty ( $woo_data[''my_price''] ) ) { return $woo_data; }
$woo_data[''data'']->set_price( $woo_data[''my_price''] );
return $woo_data;
}
Establecer my_price como parte de woo_data en woocommerce_add_cart_item permite que los datos se recuperen más tarde a través del filtro de precios de la sesión. Un método más seguro es no pasar el precio en la URL y establecerlo directamente para evitar la manipulación del precio de la URL.
En mi implementación en el mundo real conectando Store Locator Plus a WooCommerce, almaceno los datos de precios por ubicación para cada producto WooCommerce en una tabla interna y solo establezco / recupero la ID de ubicación en lugar de ''mi_precio'' en este ejemplo. Los métodos internos se utilizan para obtener el precio establecido de la tabla de datos en los dos métodos anteriores, utilizando la ID de ubicación como búsqueda y solo dejando la URL pública con una ID de ubicación que no les permitirá modificar los precios.
Después del lanzamiento de woocommerce versión 3.0.0, el precio del producto se actualiza al agregar al carro usando la función set_price ($ price). El ejemplo se da de la siguiente manera:
add_action( ''woocommerce_before_calculate_totals'', ''mj_custom_price'' );
function mj_custom_price( $cart_object ) {
$woo_ver = WC()->version;
$custom_price = 10;
foreach ( $cart->cart_contents as $key => $value )
{
if($woo_ver < "3.0.0" && $woo_ver < "2.7.0")
{
$value[''data'']->price = $custom_price;
}
else
{
$value[''data'']->set_price($custom_price);
}
}
}
Muchas gracias