Hola,
Espero que esteis bien. 🙂
Hay alguna forma de que cuando alguien compre un producto virtual en la web (como un servicio) al pagar, el estado del pedido quede en completado, pero si compra un articulo físico (para enviar por correo) despues del pago de éste el pedido que de en procesando?
Es para controlar los pedidos de productos reales.
Los virtuales con que quede en completado es suficiente.
Quedo a la espera de vuestra ayuda.
Gracias!
Ana
Contenido solo visible a usuarios registrados
Hola Ana,
En este caso puedes verificar si el siguiente plugin te permite completar los pedidos virtuales automáticamente como deseas -> https://wordpress.org/plugins/autocomplete-woocommerce-orders/
Una vez lo instalas ve al apartado de WooCommerce -> Ajustes Completar automáticamente los pedidos y configurar que tipo de pedidos se deben autocompletar, en tu caso pedidos pagos virtuales
Guarda los cambios y revisa si al resalizarse un pedido virtual este se marca como completado automaticamente.
Un Saludo
Hola Karen, 😊
Gracias por tu ayuda.
He puesto el plugin y activado como has dicho, pero tanto si hago pedidos virtuales como no virtuales me aparece el pedido
como completado. Debería salir el producto virtual completado y el fisico como pendiente, pero no los dos completados.
Que puede fallar?
Quedo pendiente de tu ayuda.
Muchas gracias por adelantado 🙂
Ana
Hola Ana,
Entiendo, en este caso probemos lo siguiente, desactiva el plugin de autocompletar órdenes y prueba añadir el siguiente código en el function.php de tu tema (preferiblemente un tema hijo) o a través de un plugin como code snippets
add_filter( 'woocommerce_payment_complete_order_status', 'auto_complete_virtual_orders', 10, 3 );
function auto_complete_virtual_orders( $payment_complete_status, $order_id, $order ) {
$current_status = $order->get_status();
// We only want to update the status to 'completed' if it's coming from one of the following statuses:
$allowed_current_statuses = array( 'on-hold', 'pending', 'failed' );
if ( 'processing' === $payment_complete_status && in_array( $current_status, $allowed_current_statuses ) ) {
$order_items = $order->get_items();
// Create an array of products in the order
$order_products = array_filter( array_map( function( $item ) {
// Get associated product for each line item
return $item->get_product();
}, $order_items ), function( $product ) {
// Remove non-products
return !! $product;
} );
if ( count( $order_products > 0 ) ) {
// Check if each product is 'virtual'
$is_virtual_order = array_reduce( $order_products, function( $virtual_order_so_far, $product ) {
return $virtual_order_so_far && $product->is_virtual();
}, true );
if ( $is_virtual_order ) {
$payment_complete_status = 'completed';
}
}
}
return $payment_complete_status;
}
Guarda los cambios y revisa si con ello solo se marca como completado los productos que se encuentren asignado como virtual
Revisa esto y nos comentas como ha ido todo
Un Saludo
Hola Karen,
Puse el código en functions.php del theme child, pero no funciona 🙁
Pasa igual
Que puede pasar?
En la pasarela de pago Redsys tengo configurado en completado, no se si eso influye en algo.
Gracias
Ana
Hola Ana,
Para poder validar el código anteriormente compartido por mi compañera si no ha ejecutado su acción como lo esperado editando el archivo functions.php te sugiero que lo agregues por medio de un fragmento de código con el plugin ya sugerido https://es.wordpress.org/plugins/code-snippets/
Si aun asi sigue sin funcionar puedes probar lo siguiente
add_action('woocommerce_thankyou', 'we_autocomplete_virtual_orders', 10, 1 );
function we_autocomplete_virtual_orders( $order_id ) {
if( ! $order_id ) return;
// Get order
$order = wc_get_order( $order_id );
// get order items = each product in the order
$items = $order->get_items();
// Set variable
$only_virtual = true;
foreach ( $items as $item ) {
// Get product id
$product = wc_get_product( $item['product_id'] );
// Is virtual
$is_virtual = $product->is_virtual();
// Is_downloadable
$is_downloadable = $product->is_downloadable();
if ( ! $is_virtual && ! $is_downloadable ) {
$only_virtual = false;
}
}
// true
if ( $only_virtual ) {
$order->update_status( 'completed' );
}
}
Por ultimo si ninguna de estas 3 opciones soluciona del todo lo que deseas puede que la configuración de Redsys tenga que ver y de cierta manera omita los cambios de estatus de los productos y en este caso estaríamos condicionados por esta acción.
Saludos!
Hola Bruno,
Pues no hay manera 😤
Lo he probado con el plugin code-snippets, con el otro código en functions.php, e incluso por si acaso he configurado el redsys a "procesando", por si así lo cambiaba en los productos virtuales a "Completado" y ese fuese el motivo, pero nada, entonces lo que pasa es que me marca los dos (virtuales y reales) como "Procesando".
Vaya tela.
Cual podría ser el motivo de que no haga caso?
Que desespero 🙄
Gracias,
Ana
Hola Ana,
Es muy raro que no funcione, he realizado varias pruebas y veo que los códigos funciona de forma correcta marcado solo como completado los pedidos procesados, si analizamos el código este añade específicamente una comprobación para marcar como completado solo productos virtuales o descargables, es posible que el plugin de redsys no esté tomando este código.
En este caso consulta con el soporte del plugin si existe alguna función específica para su complemento que permita completar de forma automática únicamente pedidos virtuales.
Revisa esto y nos comentas como ha ido todo
Un saludo