Woocommerce 订阅中的订阅频率和价格变化挂钩

Posted

技术标签:

【中文标题】Woocommerce 订阅中的订阅频率和价格变化挂钩【英文标题】:Subscription Frequency and Price Change hook in Woocommerce Subscriptions 【发布时间】:2016-04-27 20:10:14 【问题描述】:

也许我忽略了它,但尽管我搜索了很多,但当订阅在 Woocommerce 订阅中更改价格或频率时,我找不到要挂钩的 action

documentation 表示要支持支付网关中的价格变化,您必须列出 subscription_amount_changes,但没有说明当金额实际发生变化时将调用哪个函数。..

同样在Action reference 中,我找不到在订阅量或频率发生变化时调用的动作挂钩。如果有人知道要使用哪个钩子或如何实现此特定功能,请告诉我。


编辑

好的,感谢 cmets 和 @Reigel 的回答,所以如果我正确理解管理菜单中的订阅更改(我确实提到过),则必须由 save_post 操作处理。您能否提供一个小示例,如何挂钩此操作并检查它是否为订阅并获取$order_id(我猜这与post_id 相同?)以在订阅管理调用中使用?

已经非常感谢了!

【问题讨论】:

你说的是在管理区更改订阅产品的价格或频率吗? 我找不到任何有关您所追求的文档。我发现仅仅查看 lib 的源代码对我有很多帮助。使用 grep 查找 'amount' 或 'changes' 或 'amount(' 或 'changes(' 之类的关键字可以帮助您找到该函数。如果您还没有这样做,请尝试一下。 这里还有其他文档:docs.woothemes.com/wc-apidocs/class-WC_Payment_Gateway.html 这不是最清楚的,但可能会让您走得更远。不过,我需要问一下,因为您的问题不清楚,您能否举例说明您尝试挂钩的过程中的哪个位置?很难想象你在寻找什么。举个例子? 我还在 paypal 中看到了 WC_Subscriptions_Manager 和 WC_Subscriptions_Order 类的使用。也许这会有所帮助。例如这里:docs.woothemes.com/document/subscriptions/develop/functions/…,可以看到 WC_Subscriptions_Manager::update_users_subscriptions( $user_id, $subscription_details ) @JamesJones 是的,我想在管理区域中的订阅更改时捕获更改。 【参考方案1】:

我会试着解释一下supports

subscription_amount_changes 只是一个辅助,不会开火。您可以将其用于条件语句,例如:

if ( !$chosen_gateway->supports( 'subscription_amount_changes' ))  
     echo 'Please be considerate and do not change the price for the chosen gateway does not support it.';

现在,其他插件可以检查所选网关是否支持subscription_amount_changes 并执行相应操作。

订阅数量或频率时调用的动作挂钩 变化

订阅只是一种产品类型。这意味着这只是一个带有post_type 产品的帖子。数量和频率只是发布元数据。所有都在save_post 操作上处理。 add_action( 'save_post', __CLASS__ . '::save_subscription_meta', 11 );。这是在post_type=product。您还必须在post_type=shop_order 上检查save_post,因为它更适合检查支持。因为已经选择了一个网关。

【讨论】:

谢谢,它变得更清楚了,对不起,我在 Woocommerce 上有点菜鸟(用 post 来做所有事情似乎很丑……但没关系)。我更新了我的问题更清楚,如果你能提供一个非常小的例子如何捕捉帖子保存,我将非常感激。【参考方案2】:

这应该被视为@Reigel 答案的附加内容。如果您对此表示赞同,请也支持他的回答。

这是一个挂钩pre_post_update 操作的示例。它发生在save_post 操作之前一点点。这两个动作都在post.php 中的wp_insert_post() 函数中触发。

function post_save_subscription_check( $post_ID, $data )

    if( $data['post_type'] == 'product' ) 
        if (!empty($_POST['_subscription_price']) && get_post_meta($post_ID, '_subscription_price', true) != $_POST['_subscription_price']) 
                /* do stuff here */
        
        if (!empty($_POST['_subscription_period']) && get_post_meta($post_ID, '_subscription_period', true) != $_POST['_subscription_period']) 
                /* do stuff here */
        
    

add_action('pre_post_update', 'post_save_subscription_check', 10, 2 );
在逻辑中,我们检查通过get_post_meta() 获得的旧值和保存在$_POST 变量中的新值并比较它们。 此代码仅在帖子更新时执行,不适用于新帖子 代码被放置在您的主题 functions.php 或自定义插件代码中。 在实时代码中,我建议在使用之前清理任何$_POST 数据。我没有在这里打扰。

【讨论】:

是的,这正是接下来的步骤。但我仍然认为你可以使用save_post。你只需要玩优先级。不过我没试过.. @Reigel 我使用了pre_post_update,因为它可以很容易地使用get_post_meta() 获得旧值。 save_post 发生在数据写入 db 之后,因此有点困难。我同意在save_post 期间可能有一种比较方法,但它不会受到挂钩优先级的影响。 非常感谢@JamesJones,这正是我所需要的。我会给你赏金并将 Reigel 标记为他帮助使其公平的答案。 @BasvanStein。非常感谢。我只是用谷歌搜索并意识到你不能分割赏金。在这种情况下,这将是理想的,因为我觉得答案真的相互补充。虽然我比 Reigel 更需要代表,但我并不会感到内疚! 这很公平......不用担心...... ;) 很高兴我能提供帮助。

以上是关于Woocommerce 订阅中的订阅频率和价格变化挂钩的主要内容,如果未能解决你的问题,请参考以下文章

从 Woocommerce 订阅价格中隐藏“免费试用”文本,但保留注册费

从 Woocommerce 订阅价格中隐藏“免费试用”文本

更改现有定期付款的 woocommerce 订阅率

以编程方式为 WooCommerce 订阅中的购物车项目设置免费试用

SQLServer数据库订阅发布

如何更改 WooCommerce 订阅中的注册费文本?