WooCommerce Falta el argumento 1 para WC_Subscriptions_Manager::prepare_renewal()

8 minutos de lectura

avatar de usuario
WeeDom

Obtengo esto en los registros de errores cada vez que se ejecuta un cron para renovar automáticamente las suscripciones de mi cliente.

[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: Stack trace:, referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: #0 [internal function]: WC_Subscriptions_Payment_Gateways::gateway_scheduled_subscription_payment(), referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: #1 /var/home/hybrid/completehumanperformance.com/www/wp-includes/class-wp-hook.php(298): call_user_func_array('WC_Subscription...', Array), referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: #2 /var/home/hybrid/completehumanperformance.com/www/wp-includes/class-wp-hook.php(323): WP_Hook->apply_filters('', Array), referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: #3 /var/home/hybrid/completehumanperformance.com/www/wp-includes/plugin.php(515): WP_Hook->do_action(Array), referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: #4 /var/home/hybrid/completehumanperformance.com/www/wp-cron.php(117): do_action_ref_array('woocommerce_sch...', Array), referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: #5 {main}, referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000
[Wed Nov 22 06:45:01 2017] [error] [client 204.187.12.186] FastCGI: server "/php-completehumanperformancecom.fpm" stderr: thrown in /var/home/hybrid/completehumanperformance.com/www/wp-content/plugins/woocommerce-subscrip..., referer: http://completehumanperformance.com/wp-cron.php?doing_wp_cron=1511361900.1951580047607421875000

resumen: Missing argument 1 for WC_Subscriptions_Manager::prepare_renewal()

Creé el cron usando un complemento llamado WP_Crontrol, con hook_name: woocommerce_scheduled_subscription_payment.

en el panel de WP Crontrol, tiene una opción para pasar argumentos. Intenté agregar $subscription_id (eso es lo que pide el código) pero no hizo nada.

Entonces, la pregunta es: ¿cómo puedo hacer que ese trabajo cron procese todo en la base de datos? ¿Qué bit de configuración me estoy perdiendo?

Gracias

DESCARGO DE RESPONSABILIDAD: Heredé esto de un cliente que lo había estado manteniendo por su cuenta. ¡Estaba así cuando llegué aquí, jefe!

  • ¿Podría mostrarnos cómo implementó el woocommerce_scheduled_subscription_payment gancho de acción?

    – deferencia

    27/11/2017 a las 18:30

avatar de usuario
mopsid

según el Administrador de suscripciones de WooCommerce Git Repoesta es la función que está intentando ejecutar:

/**
 * Sets up renewal for subscriptions managed by Subscriptions.
 *
 * This function is hooked early on the scheduled subscription payment hook.
 *
 * @param int $subscription_id The ID of a 'shop_subscription' post
 * @since 2.0
 */
public static function prepare_renewal( $subscription_id ) {
    $order_note = _x( 'Subscription renewal payment due:', 'used in order note as reason for why subscription status changed', 'woocommerce-subscriptions' );
    $renewal_order = self::process_renewal( $subscription_id, 'active', $order_note );
    // Backward compatibility with Subscriptions < 2.2.12 where we returned false for an unknown reason
    if ( false === $renewal_order ) {
        return $renewal_order;
    }
}

Puede ver a partir de esto, que debe recibir un parámetro, que es un número entero y tiene que corresponder a una identificación de suscripción de tienda.

Entonces, hay un par de cosas que querrá hacer para resolver esto correctamente. Estoy partiendo de la suposición de que no desea profundizar demasiado en la depuración de la línea de comandos para no activar accidentalmente trabajos cron que potencialmente cambiarán las cosas de formas inesperadas (generalmente una buena idea cuando se puede evitar, particularmente cuando involucra dinero de otras personas).

  • Primero, asegúrese de que su registro de errores esté habilitado con define( 'WP_DEBUG_LOG', true );
  • En segundo lugar, debe registrar el valor de $subscription_id tal como existe cuando se pasa al trabajo.

Algo así dentro del woocommerce_scheduled_subscription_payment gancho:

error_log(sprintf('Parameter [%s] with type [%s] is the [$subscription_id], as passed to the job: [%s]', (string) $subscription_id, gettype( $subscription_id), 'WC_Subscriptions_Manager::prepare_renewal' ) );

Esto debería recoger la identificación que se está pasando y ponerla en su registro de errores. A continuación, espere a que el trabajo se ejecute de nuevo o ejecútelo manualmente.

Después de que se haya ejecutado el trabajo, debe verificar lo siguiente:

  • El mensaje apareció en tu registro (duh)
  • El valor de $subscription_id es un número entero y no es nulo ni falso.
  • El valor de $subscription_id corresponde a una válida shop_subscription publique la identificación en su base de datos.

Probablemente esto esté en tu posts tabla, pero se sabe que Woo hace algunas cosas extrañas en la base de datos en ocasiones, por lo que si no puede encontrarlo en postsluego use una consulta como la siguiente para encontrarlo:

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'shop_subscription'
    AND TABLE_SCHEMA='YourDatabase';

Es posible que tenga que jugar un poco con lo anterior para obtener el campo correcto, pero entre PhpMyAdmin o alguna otra herramienta de visualización de MySql y la consulta INFORMATION_SCHEMA.COLUMNSno deberías tener tanta dificultad para encontrarlo.

Siempre que aparezca, ha confirmado que está pasando una identificación válida, por lo que si aún está rota, su próximo paso es retroceder desde dentro de la función Woo real y descubrir por qué no está proporcionando el valor.

Esto es profundizar un poco en las partes internas de WordPress, así que asegúrese de hacer una copia de seguridad de su sitio antes de hacer esto con git o un archivo tar o algo así para no dejar hacks en el núcleo o complemento. Si aún está roto, ejecute una copia de seguridad en este punto antes de continuar.


Lo siguiente (suponiendo que aún no haya encontrado el problema real) es ir al WC_Subscriptions_Manager::prepare_renewal y registre dos cosas desde allí (vea el enlace del repositorio en la parte superior de esta respuesta para ayudar a navegar). quieres iniciar sesión print_r( debug_backtrace(), 1) para registrar el backtrace completo de Woo hacia atrás (esto será grande, no lo deje allí después de que haya terminado, a menos que le gusten los archivos de registro masivos que ocupan todo el espacio de su disco).

También querrá registrar directamente dentro de ese método el valor de $subscription_id para asegurarse de que es el mismo valor que pasó.

Por el aspecto de su error, parece que no se está pasando en absoluto. Lo más probable es que indique que tienes un null resultado de la base de datos o enlace, y su problema debe resolverse dentro de la primera parte de este diagnóstico. La segunda parte es una redundancia para asegurarse de que realmente ha corregido el problema.

  • El trabajo deberá ejecutarse para cada paso que modifique el código. Espere a que se ejecute la próxima vez, ejecútelo manualmente o haga una ejecución en seco si es posible para ayudarlo con su esfuerzo de depuración.

Si el desarrollador anterior pirateó el complemento Woo, puede usar git para aislar todos sus cambios con bastante facilidad haciendo lo siguiente:

cd /path/to/plugin
git init
git add --all
git remote add origin git@github.com:wp-premium/woocommerce-subscriptions.git
git commit
git pull

después git diff una de las confirmaciones de una versión estable de la página de github. Cualquier cambio se mostrará en el diff

Esto debería cubrir la depuración rápida del trabajo y también el aislamiento de cualquier otro problema remanente que pueda haber quedado del desarrollador anterior del que quizás ni siquiera esté al tanto hasta el momento.

  • No estoy seguro de qué versión de WC_Subscriptions_Manager está usando, pero la mayoría de los repositorios git bien estructurados usan etiquetas correspondientes a un lanzamiento de versión, por lo que querrá verificar qué versión tiene, verifique el repositorio para la etiqueta correspondiente y git diff en contra de ese compromiso para descartar cualquier cambio de desarrollador central como banderas falsas en la diferencia.

    – mopsyd

    28 de noviembre de 2017 a las 12:08

  • Hola, y gracias por el gran esfuerzo. Debería haberlo dejado más claro: estoy ejecutando una copia local de wordpress en mi mac, usando phpstorm como mi depurador y una copia de la base de datos de clientes aquí. Me temo que toda esa descripción de registro y demás se reemplaza al poder inspeccionar las variables directamente y hacer lo mismo hasta el final de la pila hasta wp_cron.php. El id_suscripción simplemente nunca se pasa.

    – WeeDom

    28 de noviembre de 2017 a las 17:13


  • ¿Tiene el id_suscripción disponible al menos en el gancho, o ni siquiera está llegando tan lejos?

    – mopsyd

    28 de noviembre de 2017 a las 20:22

  • ¿También comprobó programáticamente cómo WP_Control está pasando el valor, o solo lo configuró en un menú?

    – mopsyd

    28 de noviembre de 2017 a las 20:36

¿Ha sido útil esta solución?