• I’m running WordPress 4.4, Woocommerce 2.4.12 and Woocommerce Subscriptions 1.5.25.

    I noticed that on many subscriptions, the last automatic renewal should have happened in Nov, with last payment happening in Oct. These have the ‘Next Payment’ column still set to some Nov date. Any idea why subscription renewals did not occur automatically? It is now Dec 17. The subscriptions are handled by SimplifyCommerce, which is supposed to do automatic renewals.

    Thanks.

Viewing 5 replies - 1 through 5 (of 5 total)
  • Moderator James Huff

    (@macmanx)

    Since that is a commercial plugin, we ask that you please go to their official support channel, so you can get support from the people who know it best.

    https://support.woothemes.com/hc/en-us

    Forum volunteers are also not given access to commercial products, so they would not know why it is not working properly. Other community members who may have faced your issue might be able to help you but your best bet is your product’s developer. Keep in mind we encourage you to use the official support venues, as it allows the developers to be aware of issues with their code and gives back to the community in a more robust way.

    Hello @gtvracer

    Do you find any solution for your problem, I am facing same issue.

    Thread Starter gtvracer

    (@gtvracer)

    Yes, I did, you have to setup a cron job to force woocommerce to check to see if it needs to update it’s subscription status. Basically, WP’s automatic cron’ing mechanism isn’t doing (don’t ask me why).

    Here’s the php code:

    <?php
    /**
    * WordPress Cron Implementation for hosts, which do not offer CRON or for which
    * the user has not set up a CRON job pointing to this file.
    *
    * The HTTP request to this file will not slow down the visitor who happens to
    * visit when the cron job is needed to run.
    *
    * @package WordPress
    */

    ignore_user_abort(true);

    if ( !empty($_POST) || defined(‘DOING_AJAX’) || defined(‘DOING_CRON’) )
    die();

    /**
    * Tell WordPress we are doing the CRON task.
    *
    * @var bool
    */
    define(‘DOING_CRON’, true);

    if ( !defined(‘ABSPATH’) ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . ‘/wp-load.php’ );
    }

    /**
    * Retrieves the cron lock.
    *
    * Returns the uncached doing_cron transient.
    *
    * @ignore
    * @since 3.3.0
    *
    * @return string|false Value of the doing_cron transient, 0|false otherwise.
    */
    function _get_cron_lock() {
    global $wpdb;

    $value = 0;
    if ( wp_using_ext_object_cache() ) {
    /*
    * Skip local cache and force re-fetch of doing_cron transient
    * in case another process updated the cache.
    */
    $value = wp_cache_get( ‘doing_cron’, ‘transient’, true );
    } else {
    $row = $wpdb->get_row( $wpdb->prepare( “SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1”, ‘_transient_doing_cron’ ) );
    if ( is_object( $row ) )
    $value = $row->option_value;
    }

    return $value;
    }

    if ( false === $crons = _get_cron_array() )
    die();

    $keys = array_keys( $crons );
    $gmt_time = microtime( true );

    if ( isset($keys[0]) && $keys[0] > $gmt_time )
    die();

    // The cron lock: a unix timestamp from when the cron was spawned.
    $doing_cron_transient = get_transient( ‘doing_cron’ );

    // Use global $doing_wp_cron lock otherwise use the GET lock. If no lock, trying grabbing a new lock.
    if ( empty( $doing_wp_cron ) ) {
    if ( empty( $_GET[ ‘doing_wp_cron’ ] ) ) {
    // Called from external script/job. Try setting a lock.
    if ( $doing_cron_transient && ( $doing_cron_transient + WP_CRON_LOCK_TIMEOUT > $gmt_time ) )
    return;
    $doing_cron_transient = $doing_wp_cron = sprintf( ‘%.22F’, microtime( true ) );
    set_transient( ‘doing_cron’, $doing_wp_cron );
    } else {
    $doing_wp_cron = $_GET[ ‘doing_wp_cron’ ];
    }
    }

    /*
    * The cron lock (a unix timestamp set when the cron was spawned),
    * must match $doing_wp_cron (the “key”).
    */
    if ( $doing_cron_transient != $doing_wp_cron )
    return;

    foreach ( $crons as $timestamp => $cronhooks ) {
    if ( $timestamp > $gmt_time )
    break;

    foreach ( $cronhooks as $hook => $keys ) {

    foreach ( $keys as $k => $v ) {

    $schedule = $v[‘schedule’];

    if ( $schedule != false ) {
    $new_args = array($timestamp, $schedule, $hook, $v[‘args’]);
    call_user_func_array(‘wp_reschedule_event’, $new_args);
    }

    wp_unschedule_event( $timestamp, $hook, $v[‘args’] );

    /**
    * Fires scheduled events.
    *
    * @ignore
    * @since 2.1.0
    *
    * @param string $hook Name of the hook that was scheduled to be fired.
    * @param array $args The arguments to be passed to the hook.
    */
    do_action_ref_array( $hook, $v[‘args’] );

    // If the hook ran too long and another cron process stole the lock, quit.
    if ( _get_cron_lock() != $doing_wp_cron )
    return;
    }
    }
    }

    if ( _get_cron_lock() == $doing_wp_cron )
    delete_transient( ‘doing_cron’ );

    die();
    // end php code

    Then I setup a crontab job that calls a script, which in turn runs the php script.

    Hope that helped.

    Hi gtvracer,

    I think I am dealing with a similar bug in Woocommerce subscriptions.

    At one point renewal was working properly – when the next payment date was reached, a sequence of events would trigger (renewal order created, invoice sent to customer, etc.). For some reason this is no longer happening: instead the next payment date/time for the subscription passes without firing the trigger and then the next payment date shows as a backdate (i.e. “3 hours ago”).

    Is this similar to what you were experiencing? It seems like it is a cron-related bug and possibly it was created by adding another plugin, since it was working fine initially. I’ve been trying to deactivate recently added plugins one by one with no luck so far. I don’t know enough to venture any other solution.

    I urgently need to get this fixed as I’m under a tight deadline and starting to panic! Any help would be much appreciated.

    Thread Starter gtvracer

    (@gtvracer)

    You should try to solution I posted earlier, by taking control of wp’s cron process yourself.

Viewing 5 replies - 1 through 5 (of 5 total)

The topic ‘Subscription renewal not working’ is closed to new replies.