草庐IT

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

coder 2024-04-07 原文

每当运行 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

摘要:Missing argument 1 for WC_Subscriptions_Manager::prepare_renewal()
我使用名为 WP_Crontrol 的插件创建了 cron,其 hook_name:woocommerce_scheduled_subscription_payment .

在 WP Crontrol 面板中,您确实可以选择传递参数 - 我尝试添加 $subscription_id (这就是代码所要求的)但它没有做任何事情。

所以问题是 - 我怎样才能得到那个 cron 工作来处理数据库中的所有内容?我缺少什么配置?

谢谢

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

最佳答案

根据 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;
    }
}

从中可以看出,它必须接收一个参数,该参数是一个整数,并且必须对应一个 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' ) );
    

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

    作业运行后,您需要检查以下事项:
  • 该消息显示在您的日志中(废话)
  • $subscription_id的值是一个整数,不为空或假。
  • $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';
    

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

    如果出现,您已经确认您正在传递一个有效的 ID,所以如果它仍然损坏,您的下一步是从实际的 Woo 函数中进行回溯,并找出它为什么不提供值的原因。

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

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

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

    从您的错误的外观来看,它似乎根本没有被传递。这很可能表明您收到了 null来自数据库或钩子(Hook)的结果,您的问题应该在本诊断的第一部分中得到解决。第二部分是冗余,以确保您确实已纠正了问题。
  • 该作业将需要针对修改代码的每个步骤运行。等待它的下一次执行,手动运行它,或者在可能有助于调试工作的情况下进行一次试运行。

  • 如果以前的开发人员入侵了 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
    

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

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

    关于php - WooCommerce 缺少 WC_Subscriptions_Manager::prepare_renewal() 的参数 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47437775/

    有关php - WooCommerce 缺少 WC_Subscriptions_Manager::prepare_renewal() 的参数 1的更多相关文章

    1. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

      按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

    2. ruby-on-rails - Rails 还是 Sinatra? PHP程序员入门学习哪个好? - 2

      按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?

    3. ruby - 通过 API 和 ruby​​ 创建优惠券返回错误 : woocommerce_api_missing_coupon_data - 2

      我正在尝试使用本页文档中的示例代码通过我的Rails4应用程序的其余API创建优惠券:https://woocommerce.github.io/woocommerce-rest-api-docs/?ruby#create-a-coupon这是我使用的代码:data={code:"10off",discount_type:"percent",amount:"10",individual_use:true,exclude_sale_items:true,minimum_amount:"100.00"}woocommerce.post("coupons",data).parsed_resp

    4. ruby-on-rails - PHP 魔术方法 __call、__get 和 __set 的 Ruby 等价物 - 2

      我很确定Ruby有这些(等同于__call、__get和__set),否则find_by将如何在Rails中工作?也许有人可以举一个简单的例子来说明如何定义与find_by相同的方法?谢谢 最佳答案 简而言之你可以映射__调用带有参数的method_missing调用__设置为方法名称以'='结尾的method_missing调用__获取不带任何参数的method_missing调用__调用PHPclassMethodTest{publicfunction__call($name,$arguments){echo"Callingob

    5. ruby - Lisp - 是否适合网络编程/应用程序(交互式)? ruby 的方式是? php的方式是? - 2

      Lisp是否适合Web编程/应用程序(交互式),就像ruby​​和php一样?需要考虑的事情是:易于使用可部署性难度(尤其是对于编程初学者而言)(编辑)在阅读PaulGraham'sessay之后,我特别提到了CommonLisp.将是我的第一门编程语言。在这方面。这样做合适吗?我听说Clojure的宏功能不如CommonLisp的强大,这就是我尝试学习Clojure的原因。它教授编程并且非常强大。 最佳答案 Lisp是一个语系,而不是单一的语言。为了稍微回答您的问题,是的,存在用于各种Lisp方言的Web框架,例如用于Common

    6. 软件工程毕业设计课题(81)微信小程序毕业设计PHP校园跑腿小程序系统设计与实现 - 2

          项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信校园跑腿小程序系统,前台用户使用小程序发布跑腿任何和接跑腿任务,后台管理使用基于PHP+MySql的B/S架构;通过后台管理跑腿的用户、查看跑腿信息和对应订单。意义:手机网络时代,大学生通过手机网购日常用品、外卖外卖、代取快递等已不再是稀奇的事情。此外,不少高校还流行着校园有偿工作,校园跑腿就成了大学生创业服务项目。        因为你在校园里,所以不会有进入的限制。并不是所有的外卖平台都可以随意进入校园,比如小黄和小蓝的双打外卖平台。许多大学禁止送餐进入学校,更不用说送餐进入宿舍了。这一措施使得校园服务市场的竞争相对不

    7. K8s部署PHP项目 - 2

      前言    前端时间PHP项目部署升级需要,需要把Laravel开发的项目部署K8s上,下面以laravel项目为例,讲解采用yaml文件方式部署项目。一、部署步骤1.创建Dockerfile文件Dockerfile是一个用来构建镜像的文本文件,在容器运行时,需要把项目文件和项目运行所必须的组件安装其中。#基础镜像FROMphp:7.4-fpm#时区ARGTZ=Asia/Shanghai#更换容器时区RUNcp"/usr/share/zoneinfo/$TZ"/etc/localtime&&echo"$TZ">/etc/timezone#替换成阿里apt-get源RUNsed-i"s@http

    8. ruby-on-rails - PHP 开发人员学习 Ruby 和 Ruby on Rails - 2

      关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion我对学习Rails很感兴趣已经有一段时间了,我觉得现在正是浸入其中并实际动手实践的好时机。在过去的一周里,我阅读了所有我能找到的关于Ruby和RubyonRails的免费电子书。我刚刚读完RubyEssentials。我也一直在玩htt

    9. ruby-on-rails - Ruby 相当于 PHP 的 ucfirst() 函数 - 2

      在Ruby中(使用Rails,如果相关)将字符串首字母大写的最佳方法是什么?请注意String#capitalize不是我想要的,因为除了将字符串的首字母大写外,此函数还使所有其他字符变为小写(这是我不想要的——我想让它们保持原样):>>"aA".capitalize=>"Aa" 最佳答案 在Rails中你有String#titleize方法:"测试字符串标题化方法".titleize#=>"测试字符串标题化方法" 关于ruby-on-rails-Ruby相当于PHP的ucfirst()

    10. Internet Download Manager2023最好用的HTTP下载神器 - 2

      InternetDownloadManager介绍2023最佳下载利器。InternetDownloadManager(简称IDM)是一款Windows平台功能强大的多线程下载工具,国外非常受欢迎。支持断点续传,支持嗅探视频音频,接管所有浏览器,具有站点抓取、批量下载队列、计划任务下载,自动识别文件名、静默下载、网盘下载支持等功能。一款下载器软件,也可以叫它网页嗅探下载工具可以理解为和迅雷差不多,但是没有迅雷那么多广告,而且功能也更加强大(ps:我也是不久前知道迅雷可以下载网页的视频了)。这是一款互联网下载管理器,看着名字挺长的,但它还有一个简称,你一定知道:IDM,在很多论坛技术贴中被称为H

    随机推荐