¿Cómo establecer la próxima fecha de pago en las suscripciones de Woocommerce?

4 minutos de lectura

avatar de usuario
SargentoPepperAut

Me gustaría cambiar la próxima fecha de pago de las suscripciones activas después de que se haya creado el (primer) pedido inicial.

código actual que no funciona. ¿Por qué? ¿Qué me estoy perdiendo?

//fires when new order payment is complete (NOT RENEWAL but original order!)
add_action('woocommerce_payment_complete', 'fm_upate_next_payment_datetime');

function fm_upate_next_payment_datetime ( $order_id ) {

if (WC_Subscriptions_Order::order_contains_subscription( $order_id ) == false) return;      
$subscription_key = WC_Subscriptions_Manager::get_subscription_key( $order_id, $product_id
= '');

 //hard code next payment date...(must be in future)
$next_payment = date( 'Y-m-d H:i:s', '2016-05-20 00:10:10' );

//set the new payment date  
WC_Subscriptions_Manager::set_next_payment_date( $subscription_key, $user_id = '', $next_payment );

}

lo que dijiste y también tenemos que establecer una fecha de inicio! (puede ser AHORA) pero si no se pasa arrojará un error. Conseguí que funcionara así:

function saveNewDate($post_id) {

    $subscription = wcs_get_subscription( $post_id );
    $dates        = array();

    $datetime           = current_time( 'timestamp', true );
    $dates[ 'start' ] = date( 'Y-m-d H:i:s', $datetime );
    $datetime = strtotime( "08/23/2016 23:30" );
    $dates['next_payment'] = date( 'Y-m-d H:i:s', $datetime );

    try {
        $subscription->update_dates( $dates, 'gmt' );
        wp_cache_delete( $post_id, 'posts' );
    } catch ( Exception $e ) {
        wcs_add_admin_notice( $e->getMessage(), 'error' );
    }
}

solución de trabajo para mí es (ver también https://docs.woocommerce.com/document/subscriptions/develop/functions/#section-4):

function update_next_payment_date($subscription) {
    $date = new DateTime('2021-05-28');
    $date->setTime(8, 55);

    $subscription_next_payment_date = date_format($date, 'Y-m-d H:i:s'); // = '2021-05-28 08:55:00'

    $new_dates = array(
        'start' => $subscription->get_date('start'),
        'trial_end' => $subscription->get_date('trial_end'),
        'next_payment' => $subscription_next_payment_date,
        'last_payment' => $subscription->get_date('last_payment'),
        'end' => $subscription->get_date('end'),
    );

    $subscription->update_dates($new_dates);
}

avatar de usuario
Federico Ricci

Creo que esto no funciona porque estás llamando. $subscription_key utilizando una variable vacía $product_id.
En su función, con este código, no tiene valor para $product_id.

Debe pasarlo por referencia o extrayéndolo de la función.

avatar de usuario
sagar

La suscripción de Woocommerce cambió la próxima fecha de pago hace 3 días:

add_action('woocommerce_thankyou', 'nextpaymentdatechange', 10, 1);  

function nextpaymentdatechange( $order_id ){
    if ( wcs_order_contains_subscription( $order_id ) ) {
        $subid = $order_id + 1;
        $nextdate = get_post_meta( $subid, '_schedule_next_payment', true );
        $threedays_ago = date( 'Y-m-d H:i:s', strtotime( '-3 days', strtotime( $nextdate )) );
        update_post_meta( $subid , '_schedule_next_payment', $threedays_ago, $nextdate );
    }
}

avatar de usuario
Wprog_dy

add_action('woocommerce_thankyou', 'nextpaymentdatechange', 10, 1);  

function nextpaymentdatechange( $order_id ){
    if ( wcs_order_contains_subscription( $order_id ) ) {
        $subid = $order_id + 1;
        $nextdate = get_post_meta( $subid, '_schedule_next_payment', true );
        $threedays_ago = date( 'Y-m-d H:i:s', strtotime( '-3 days', strtotime( $nextdate )) );
        update_post_meta( $subid , '_schedule_next_payment', $threedays_ago);
    }
}

Por favor, no use 4 valores en update_post_meta().

Solo use 3 valores cambiando esto:

update_post_meta( $subid , '_schedule_next_payment', $threedays_ago, $nextdate );

a :

update_post_meta( $subid , '_schedule_next_payment', $threedays_ago);

  • Gracias por tu contribución. Si bien este código puede resolver el problema del OP, es mejor agregar contexto o explicar por qué/cómo este código soluciona el problema. SO es valioso para aprender y compartir conocimientos (en lugar de traer un código que brinda servicio para problemas individuales). De esta manera, los futuros visitantes pueden aprender y aplicar esta información a sus propios problemas o prevenirlos en primer lugar. También se recomiendan los enlaces a la documentación fuente como información de seguimiento. (Además, ¿por qué le pide al usuario que “por favor” pase 3 valores, no 4? Si eso es por definición, indique este hecho y posiblemente incluya un enlace de documento).

    – SherylHohman

    11 de mayo de 2020 a las 8:53

  • Gracias por tu contribución. Si bien este código puede resolver el problema del OP, es mejor agregar contexto o explicar por qué/cómo este código soluciona el problema. SO es valioso para aprender y compartir conocimientos (en lugar de traer un código que brinda servicio para problemas individuales). De esta manera, los futuros visitantes pueden aprender y aplicar esta información a sus propios problemas o prevenirlos en primer lugar. También se recomiendan los enlaces a la documentación fuente como información de seguimiento. (Además, ¿por qué le pide al usuario que “por favor” pase 3 valores, no 4? Si eso es por definición, indique este hecho y posiblemente incluya un enlace de documento).

    – SherylHohman

    11 de mayo de 2020 a las 8:53

¿Ha sido útil esta solución?