我正在使用一些自定义逻辑来显示或隐藏使用此 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”获取值,它具有最低值,但这是错误的值。
谁能指导我如何仅根据我的可用变体获得注册值。
我已经使用下面的代码和 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,请看下面的截图。
但是正如您在我的屏幕截图中看到的不同,我仍然没有在此处获取更新值每 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;
}
它的显示如下。
所以现在基本上是更新了,但它不正确,因为我丢失了格式和其他一些重要值。
有人可以指导我如何正确覆盖此过滤器吗?
谢谢
最佳答案
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/