WordPress WooCommerce get_sign_up_fee 基于可用的变体

标签 wordpress woocommerce hook-woocommerce woocommerce-subscriptions

我正在使用一些自定义逻辑来显示或隐藏使用此 Hook 的可变产品的变化 woocommerce_get_children https://stackoverflow.com/a/67804835/6829420并且按照我的预期运行良好。

但是,我在可变产品页面中的“注册费”有误,因为它一直从我的隐藏变体中获取值。下面是我的尝试以及我到目前为止所做的。

add_filter( 'woocommerce_subscriptions_product_price_string', 'subscr_product_price_string', 10, 3 );
function subscr_product_price_string( $subscription_string, $product, $include ){
        
    if (is_admin() || (! $product->is_type( 'variable-subscription' ))) return $subscription_string;


    if ( $include['sign_up_fee'] && $product->get_sign_up_fee( $product ) > 0 ) {
    
         $available_variations = $product->get_available_variations();
        echo count($available_variations);
    
        echo $product->get_sign_up_fee();
            exit;
        //echo $prices    = get_price_sign_up_fee($product);
        exit;
}

例如,我有 3 个变体“蓝色、黄色和绿色”,我隐藏了“蓝色”并转到变体产品页面。

如果我这样做,

$available_variations = $product->get_available_variations();
echo count($available_variations);

然后它显示 2 但我的 echo $product->get_sign_up_fee(); 一直从“Blue”获取值,它具有最低值,但这是错误的值。

enter image description here

谁能指导我如何仅根据我的可用变体获得注册值。

我已经使用下面的代码和 woocommerce_variable_price_html 钩子(Hook)更新了默认的 From 值,它的工作正常,因为它根据可用的变化获取值。

function updateFromDefaultValue($price, $product) {
    $prefix = sprintf('%s: ', __('From', 'iconic'));
    $min_price_regular = $product->get_variation_regular_price('min', true);
    $min_price_sale    = $product->get_variation_sale_price('min', true);
    $max_price = $product->get_variation_price('max', true);
    $min_price = $product->get_variation_price('min', true);
    $price = ($min_price_sale == $min_price_regular) ?
        wc_price($min_price_regular) :
        '<del>' . wc_price($min_price_regular) . '</del>' . '<ins>' . wc_price($min_price_sale) . '</ins>';

    return ($min_price == $max_price) ?
        $price :
        sprintf('%s%s', $prefix, $price);
}

add_filter('woocommerce_variable_price_html', 'updateFromDefaultValue', 10, 2);

谢谢

更新


我找到了一个 Hook woocommerce_subscriptions_product_price_string_inclusions,通过它我可以根据我的“可用订阅”获得更新的 sign_up_fee 值。下面是我的代码。

add_filter('woocommerce_subscriptions_product_price_string_inclusions', 'updateSubscriptionPeriod', 10, 2);

function updateSubscriptionPeriod( $include, $product ) {
    
    
    if (is_admin() || (! $product->is_type( 'variable-subscription' ))) return $include;


    $min_max_variation_data = $product->get_min_and_max_variation_data( array_keys( $prices ) );

    if(empty($min_max_variation_data) || empty($min_max_variation_data['subscription'])) return $include;
    
    
    
    $include['sign_up_fee'] = $min_max_variation_data['subscription']['signup-fee'];
    $include['trial_length'] = 5; 
    $include['subscription_period'] = 50; 
    $include['subscription_length'] = $min_max_variation_data['subscription']['interval']; 
    $include['subscription_price'] = $min_max_variation_data['max']['price'];    
     
     
    return $include;
}

现在我可以得到值20,请看下面的截图。

enter image description here

但是正如您在我的屏幕截图中看到的不同,我仍然没有在此处获取更新值每 3 年一次 2 周的免费试用 a 应该说, 4 年免费试用 2 个月 因为这是我可用变体的值(value)观。

您还可以看到我正在尝试放置一些静态值以及像这样的动态值。

  $include['trial_length'] = 5; 
    $include['subscription_period'] = 50; 
    $include['subscription_length'] = $min_max_variation_data['subscription']['interval']; 
    $include['subscription_price'] = $min_max_variation_data['max']['price'];    

但它只是没有在我的产品页面上更新。

有人可以指导我如何更新这些到期值。

提前致谢。

更新 2


我已经搜索并找到了 woocommerce_subscriptions_product_price_string 钩子(Hook),这是我的尝试。

add_filter( 'woocommerce_subscriptions_product_price_string', 'subscriptions_custom_price_string', 20, 3 );
function subscriptions_custom_price_string( $price_string, $product, $args ) {

    
    // Get the trial length to check if it's enabled
    $trial_length = $args['trial_length'];
    
    $speriod = $args['subscription_period'];
    
    $sfee = $args['sign_up_fee'];
    $sfee = wc_price($sfee);
    $sign_up_fee = isset($args['sign_up_fee']) ? __(" and a $sfee sign-up fee", "woocommerce") : '';
    if( $trial_length > 0 )
        $price_string = $args['price'] . ' / ' . $speriod . $sign_up_fee;

    return $price_string;
}

它的显示如下。

enter image description here

所以现在基本上是更新了,但它不正确,因为我丢失了格式和其他一些重要值。

有人可以指导我如何正确覆盖此过滤器吗?

谢谢

最佳答案

woocommerce_variable_subscription_price_html 是您应该使用的正确 Hook ,下面是一个可能适合您的示例:

add_filter( 'woocommerce_variable_subscription_price_html', 'variable_subscription_custom_price_html', 10, 2 );
function variable_subscription_custom_price_html( $price, $product ) {
    // Unhook to avoid infinite loop.
    remove_filter( 'woocommerce_variable_subscription_price_html', __FUNCTION__, 10, 2 );

    // List of product IDs for variations you're hiding.
    $hidden_products = array( 4171 );

    // Check if the product has any variations that you manually hid.
    $hidden = array_intersect( $hidden_products, get_children( array(
        'post_parent' => $product->get_id(),
        'post_type'   => 'product_variation',
        'fields'      => 'ids',
    ) ) );

    if ( ! empty( $hidden ) ) {
        $prices = $product->get_variation_prices( true )['price'];
        asort( $prices ); // sort from lowest to highest price

        $variation = wc_get_product( array_keys( $prices )[0] );

        // It's a variation, so we manually add the 'From: text'.
        $price = 'From: ' . $variation->get_price_html();
    }

    // Re-hook this function.
    add_filter( 'woocommerce_variable_subscription_price_html', __FUNCTION__, 10, 2 );

    return $price;
}

关于WordPress WooCommerce get_sign_up_fee 基于可用的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68311716/

相关文章:

wordpress - 从 WooCommerce Storefront 主题中删除面包屑

wordpress - 如何在 Wordpress 中获得二级菜单?

php - 如何使用 php 函数而不是默认的 WP 函数从主页中排除类别?

php - 不同产品的 Woocommerce 不同 T&C 页面

php - 不应直接访问订单属性 - WooCommerce 3.0

php - WooCommerce 自定义变体下拉列表

php - 如何在 Woocommerce 中的自定义产品类型中添加变体选项卡?

html - Wordpress:将侧边栏菜单移到底部

CSS 绝对定位和响应式设计

php - 如果在 WooCommerce 中选中结账自定义复选框,请更改用户角色