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

Subscription Frequency and Price Change hook in Woocommerce Subscriptions

也许我忽略了它,但就我的搜索而言,我无法找到当订阅在 Woocommerce 订阅中更改价格或频率时挂钩的 action

documentation 说要支持支付网关中的价格变化,您必须列出 subscription_amount_changes,但没有任何地方说当金额实际变化时将调用哪个函数..

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


编辑

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

非常感谢!

我会尽量解释一下 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 并执行适当的操作。

action hook which is called when the subscription amount or frequency changes

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

这应该被视为@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 变量中的新值并比较它们。
  • 此代码仅在 post 更新时执行,而不是针对新的 post
  • 代码被放置在您的主题 functions.php 或自定义插件代码中。
  • 在实时代码中,我建议在使用前清理任何 $_POST 数据。我没有打扰这里。