Avisos
Vaciar todo

Consulta

13 Respuestas
3 Usuarios
0 Reactions
45 Visitas
 Isi
Respuestas: 682
Honorable Member
Topic starter
 

Hola, buenos días,

Tengo un sitio con productos digitales en venta, pero sucede que las compras que son realizadas por Paypal no se completan, quedan en "pendiente de pago" y ya están pagadas.

Quisiera saber si es necesario utilizar un plugin o agregar un código para que este proceso quede automatizado? Utilizo Woocommerce.

Muchas gracias.

 

Contenido solo visible a usuarios registrados


 
Respondido : 28/10/2023 2:57 pm
 Isi
Respuestas: 682
Honorable Member
Topic starter
 

Como dato adicional al ticket enviado. Son productos digitales para descargar.  Como quedan en "pendiente de pago" y no "completado" no llegan al email del cliente para su descarga. Por lo tanto, este proceso hay que hacerlo manualmente. Necesito que quede automatizado.

Gracias. 


 
Respondido : 28/10/2023 3:00 pm
Pepe
 Pepe
Respuestas: 41133
Illustrious Member Admin
 

Hola Isi

Puedes añadir lo siguiente en el archivo functions.php o si utilizas algún plugin para añadir código como puede ser Code Snippets

// Actualiza automáticamente el estado de los pedidos a Completado
add_action( 'woocommerce_order_status_processing', 'actualiza_estado_pedidos_a_completado' );
add_action( 'woocommerce_order_status_on-hold', 'actualiza_estado_pedidos_a_completado' );
function actualiza_estado_pedidos_a_completado( $order_id ) {
global $woocommerce;

//ID's de las pasarelas de pago a las que afecta
$paymentMethods = array( 'paypal' );

if ( !$order_id ) return;
$order = new WC_Order( $order_id );

if ( !in_array( $order->payment_method, $paymentMethods ) ) return;
$order->update_status( 'completed' );
}

 

Tienes más información en esta entrada del blog:

-> Cambiar estado del pedido en WooCommerce automáticamente

 

Un Saludo


 
Respondido : 28/10/2023 3:09 pm
 Isi
Respuestas: 682
Honorable Member
Topic starter
 

@pepesolerh

Hola Pepe, gracias por tu ayuda. Seguiré tu recomendación.

Saludos!


 
Respondido : 28/10/2023 3:13 pm
 Isi
Respuestas: 682
Honorable Member
Topic starter
 

@pepesolerh

Hola Pepe, me salé error. Copié todo el texto de código tal cual.

 

Error:

Los cambios en tu código PHP se han revertido debido a un error en la línea 838 del archivo wp-content/themes/cocco/functions.php. Por favor, arréglalo y trata de guardar de nuevo.

Cannot redeclare actualiza_estado_pedidos_a_completado() (previously declared in wp-content/plugins/code-snippets/php/snippet-ops.php(581) : eval()'d code:4)

 


 
Respondido : 28/10/2023 3:21 pm
 Isi
Respuestas: 682
Honorable Member
Topic starter
 

Ésta es la línea 838:

function actualiza_estado_pedidos_a_completado( $order_id ) {


 
Respondido : 28/10/2023 3:27 pm
Pepe
 Pepe
Respuestas: 41133
Illustrious Member Admin
 

Hola Isi

Este es el error:

PHP Fatal error:  Cannot redeclare actualiza_estado_pedidos_a_completado() 

Lo que te indica es que ya está declarada esa función, es posible que la tengas en el plugin de Code Snippets para otra pasarela o que la tengas en el archivo functions.php

Revisa los códigos que tienes en Code Snippets y comprueba si ya esta declarada esa función en algún otro bloque de código.

 

Para que dominio es la consulta ? porque no veo que tengas instalado Code Snippets en el dominio miapsicologiainfantil

 

Un Saludo

 


 
Respondido : 28/10/2023 4:02 pm
 Isi
Respuestas: 682
Honorable Member
Topic starter
 

@pepesolerh

Hola Pepe, efectivamente tengo el plugin de Code Snippets instalado en este dominio, está activo y tiene el mismo texto de código que me compartiste. Entonces, por qué no funciona? Cuál podría ser la causa?


 
Respondido : 28/10/2023 6:36 pm
Bruno
Respuestas: 6488
Illustrious Member Moderator
 

Hola Isi,

Por favor muestranos como estas colocando el codigo, ademas tal como menciona mi compañero puede que ya estes empleando un fragmento de codigo que declare dicha funcion, es por ello el motivo del error, puedes validar que este no sea el caso?

Quedamos atento

Saludos!


 
Respondido : 28/10/2023 6:56 pm
 Isi
Respuestas: 682
Honorable Member
Topic starter
 

@bruno-vichettih

Hola Bruno, gracias por tu respuesta. Comparto el código que tengo:

// Actualiza automáticamente el estado de los pedidos a Completado
add_action( 'woocommerce_order_status_processing', 'actualiza_estado_pedidos_a_completado' );
add_action( 'woocommerce_order_status_on-hold', 'actualiza_estado_pedidos_a_completado' );
function actualiza_estado_pedidos_a_completado( $order_id ) {
global $woocommerce;

//ID's de las pasarelas de pago a las que afecta
$paymentMethods = array( 'paypal', 'transbank_webpay_plus_rest' );

if ( !$order_id ) return;
$order = new WC_Order( $order_id );

if ( !in_array( $order->payment_method, $paymentMethods ) ) return;
$order->update_status( 'completed' );
}


 
Respondido : 28/10/2023 7:44 pm
Bruno
Respuestas: 6488
Illustrious Member Moderator
 

Hola Isi,

He probado el codigo que nos compartes y se implementa sin problemas con Code Snippets

image

Has validado si tienes otros fragmentos de codigo que puedan declarar una funcion igual a la que ya esta presentada en el codigo actual?

Tambien puede ser algun conflicto de plugins o tema activo, es necesario descartar para encontrar la causa

Saludos!


 
Respondido : 29/10/2023 12:48 am
 Isi
Respuestas: 682
Honorable Member
Topic starter
 

@bruno-vichetti

Hola Bruno, gracias por tu ayuda.  Haré una nueva revisión, y ante cualquier consulta regreso a este ticket.

Gracias, saludos! 


 
Respondido : 29/10/2023 1:23 pm
Pepe
 Pepe
Respuestas: 41133
Illustrious Member Admin
 

Hola Isi.

Por lo que comentas son productos Virtuales.

Prueba añadiendo 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' );
}
}

Un saludo

 
Respondido : 29/10/2023 2:43 pm