WooCommerce缺少WC_Subscriptions_Manager :: prepare_renewal()的参数1

Wee*_*Dom 5 php wordpress woocommerce hook-woocommerce

每当cron运行自动续订我的客户端订阅时,我都会在错误日志中收到此信息.

[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
Run Code Online (Sandbox Code Playgroud)

摘要: Missing argument 1 for WC_Subscriptions_Manager::prepare_renewal()

我使用一个名为WP_Crontrol的插件创建了cron,并使用了hook_name : woocommerce_scheduled_subscription_payment.

在WP Crontrol面板中,你有一个传递参数的选项 - 我尝试添加$subscription_id(这是代码要求的)但它没有做任何事情.

所以问题是 - 如何让cron作业处理数据库中的所有内容?我错过了什么配置?

谢谢

免责声明:我从一个自己维护它的客户那里继承了这个.我来到这里就是这样,guv!

mop*_*syd 2

根据WooCommerce Subscriptions Manager Git Repo,这是它尝试运行的函数:

/**
 * 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

从这里可以看出,它必须接收一个参数,该参数是一个整数,并且必须对应于 shop_subscription id。

因此,您需要采取一些措施来正确解决此问题。我的假设是,您不想过多地进行命令行调试,这样您就不会意外触发 cron 作业,这些作业可能会以意想不到的方式改变事情(通常是一个好主意,当可以避免时,特别是当它涉及别人的钱)。

  • 首先,确保您的错误日志已启用define( 'WP_DEBUG_LOG', true );
  • 其次,您需要记录$subscription_id传递给作业时存在的值。

钩子内有类似这样的东西woocommerce_scheduled_subscription_payment

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' ) );
Run Code Online (Sandbox Code Playgroud)

这应该会获取正在传递的 id 并将其放入错误日志中。接下来,等待作业再次运行或手动运行它。

作业运行后,您需要检查以下事项:

  • 该消息显示在您的日志中(废话)
  • 的值$subscription_id是一个整数,并且不为 null 或 false。
  • 的值$subscription_id对应于shop_subscription数据库中的有效帖子 ID。

这可能在您的posts表中,但众所周知,Woo 有时会在数据库中执行一些奇怪的操作,因此如果您在 中找不到它posts,请使用如下所示的查询来查找它:

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'shop_subscription'
    AND TABLE_SCHEMA='YourDatabase';
Run Code Online (Sandbox Code Playgroud)

您可能需要稍微修改一下上面的内容才能获得正确的字段,但是在 PhpMyAdmin 或其他一些 MySql 可视化工具和查询之间INFORMATION_SCHEMA.COLUMNS,您不应该花那么长时间找到它。

如果出现该信息,则表明您已确认正在传递有效的 ID,因此如果它仍然损坏,下一步就是从实际的 Woo 函数中回溯并找出它不提供该值的原因。

这是对 WordPress 内部结构的深入研究,因此请确保在使用 git 或 tar 文件或其他文件执行此操作之前备份您的网站,这样您就不会在核心或插件中留下黑客攻击。如果它仍然损坏,请在继续之前运行备份。


下一步(假设您还没有找到实际问题)是进入该WC_Subscriptions_Manager::prepare_renewal函数并从那里记录两件事(请参阅此答案顶部的存储库链接以帮助导航)。您想要print_r( debug_backtrace(), 1)记录从 Woo 向后的完整回溯(这会很大,完成后不要将其留在那里,除非您喜欢大量日志文件弄乱所有磁盘空间)。

您还需要直接在该方法中记录 的值,$subscription_id以确保它与传递的值相同。

从您的错误来看,它似乎根本没有被传递。这很可能表明您null从数据库或挂钩获得了结果,并且您的问题应该在此诊断的第一部分中得到解决。第二部分是冗余部分,以确保您确实纠正了问题。

  • 该作业需要针对修改代码的每个步骤运行。等待它的下一次执行,手动运行它,或者进行试运行(如果可能有助于您的调试工作)。

如果以前的开发人员破解了 Woo 插件,您可以通过执行以下操作,使用 git 轻松隔离他的所有更改:

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
Run Code Online (Sandbox Code Playgroud)

然后git diff是来自 github 页面的稳定版本的提交之一。任何更改都会显示在diff

这应该包括快速调试工作,以及隔离您可能还没有意识到的以前的开发人员留下的任何其他遗留问题。