首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WC_Subscriptions_Manager::prepare_renewal()的WooCommerce缺少参数1

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

Stack Overflow用户
提问于 2017-11-22 22:58:15
回答 1查看 306关注 0票数 5

每当运行cron为我的客户端自动续订订阅时,我都会在错误日志中看到这一点。

代码语言:javascript
复制
[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

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

我已经使用一个名为WP_Crontrol的插件创建了cron,该插件带有hook_name:woocommerce_scheduled_subscription_payment

在WP Crontrol面板中,您可以选择传递参数-我尝试添加$subscription_id (这是代码要求的),但它什么也没做。

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

谢谢

免责声明:我从一个客户那里继承了它,他一直在自己维护它。我刚来的时候就是这样的,老大!

EN

回答 1

Stack Overflow用户

发布于 2017-11-28 19:52:38

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

代码语言:javascript
复制
/**
 * 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;
    }
}

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

所以你需要做几件事来正确解决这个问题。我的假设是,你不想太深入地研究命令行调试,这样你就不会意外地触发可能会以意想不到的方式改变事情的cron作业(如果可以避免,通常是一个好主意,特别是当它涉及到其他人的金钱时)。

首先,确保使用define( 'WP_DEBUG_LOG', true );

  • Second,启用了错误日志。您需要记录$subscription_id的值,因为它在传递到作业时存在。

woocommerce_scheduled_subscription_payment钩子中类似这样的内容:

代码语言:javascript
复制
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' ) );

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

作业运行后,您需要检查以下内容:

  • 显示在您的日志(Duh)中的消息
  • $subscription_id的值是一个整数,并且不是null或false。
  • $subscription_id的值对应于数据库中有效的shop_subscription post id。

这可能在您的posts表中,但众所周知,Woo有时会在数据库中做一些奇怪的事情,所以如果您在posts中找不到它,那么使用如下查询来找到它:

代码语言:javascript
复制
SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'shop_subscription'
    AND TABLE_SCHEMA='YourDatabase';

您可能需要对上面的内容进行一些修改才能获得正确的字段,但是在PhpMyAdmin或其他MySql可视化工具和查询INFORMATION_SCHEMA.COLUMNS之间,您应该不会那么困难地找到它。

如果出现这种情况,您已经确认传递的是一个有效的ID,因此如果它仍然损坏,则下一步是从实际的Woo函数中进行回溯,并找出它没有提供该值的原因。

这是对Wordpress内部结构的深入研究,所以在使用git或tar文件或其他东西之前,请确保备份站点,这样就不会在核心或插件中留下漏洞。如果仍然损坏,请在此时运行备份,然后再继续。

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

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

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

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

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

代码语言:javascript
复制
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

然后从github页面git diff一个稳定发布的提交。任何更改都将显示在diff

这应该包括快速调试作业,并隔离您可能从以前的开发人员遗留下来的任何其他遗留问题,这些问题到目前为止您可能还没有意识到。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47437775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档