php 在结帐页面中获取“免运费”方法的最低订单金额

v440hwme  于 2023-01-12  发布在  PHP
关注(0)|答案(5)|浏览(137)

我确实尝试过使用下面答案中的代码:
How to get minimum order amount for free shipping in woocommerce
但是它返回了一个**NULL结果,直到现在我才找到修复此代码的方法。
如何在结帐页面上获得正确的
最低订单金额**?

kcugc4gi

kcugc4gi1#

此答案的代码:How to get minimum order amount for free shipping in woocommerce

在WooCommerce版本2.6+中已过时,但它对这个功能性答案很有帮助...

经过一些搜索和一些尝试,我已经找到了方法来获得最低订单金额是在免费送货方法中设置,为特定的区域(地区):

下面是工作的测试代码(解释在里面注解):

// Here you get (as you already know) the used shipping method reference
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );

// Replacing inside the string ':' by '_'
$option_value = str_replace(':', '_', $chosen_methods[0]);

// We concatenate the string with additional sub-strings
$option_value = 'woocommerce_'.$option_value.'_settings';

// Just a test => outputting the string to see what we get
echo $option_value; echo '<br>';

// Now we can get the options values with that formatted string
$free_shipping_settings = get_option( $option_value );

// Just for test => we output the (pre-formatted) array of values to check
echo '<pre>'; print_r($free_shipping_settings); echo '</pre><br>'; 

// Here we get the value of the order min amount (Finally!)
$order_min_amount = $free_shipping_settings['min_amount'];

// We output the value (to check)
echo 'Order min amount: '.$order_min_amount;

答对了!你猜对了。

ppcbkaq5

ppcbkaq52#

正确的方式得到这个..

function get_free_shipping_minimum($zone_name = 'England') {
    if ( ! isset( $zone_name ) ) return null;

    $result = null;
    $zone = null;

    $zones = WC_Shipping_Zones::get_zones();
    foreach ( $zones as $z ) {
        if ( $z['zone_name'] == $zone_name ) {
            $zone = $z;
        }
    }

    if ( $zone ) {
        $shipping_methods_nl = $zone['shipping_methods'];
        $free_shipping_method = null;
        foreach ( $shipping_methods_nl as $method ) {
            if ( $method->id == 'free_shipping' ) {
                $free_shipping_method = $method;
                break;
            }
        }

        if ( $free_shipping_method ) {
            $result = $free_shipping_method->min_amount;
        }
    }

    return $result;
}
rhfm7lfc

rhfm7lfc3#

你需要通过获得,

get_option( 'woocommerce_free_shipping_1_settings' );

然后通过执行以下操作来反序列化数据,

maybe_unserialize();
35g0bw71

35g0bw714#

这2个过滤器允许您获得最小订单金额,甚至更改其值:

  • woocommerce_shipping_free_shipping_instance_option
  • woocommerce_shipping_free_shipping_option

例如,您可以这样使用它:

add_filter( 'woocommerce_shipping_free_shipping_instance_option', 'get_free_shipping_min_amount', 10, 3 );
add_filter( 'woocommerce_shipping_free_shipping_option', 'get_free_shipping_min_amount', 10, 3 );
function get_free_shipping_min_amount( $option, $key, $method ){
    if (
        'min_amount' !== $key ||
        ! is_numeric( $option )     
    ) {
        return $option;
    }
    // Minimum amount
    $min_amount = $option;
    return $option;
}

如果愿意,可以使用$method参数(如instance_id或类似参数)从发货方法中获取更多信息。
你也可以从钩子中替换'free_shipping'来获取其他送货方式的信息。钩子的工作原理如下:'woocommerce_shipping_' . $shipping_method_id . '_option' .
您可以在文档中查看它:

  • https://docs.woocommerce.com/wc-apidocs/source-class-WC_Shipping_Method.html#469
  • https://docs.woocommerce.com/wc-apidocs/source-class-WC_Shipping_Method.html#495
mccptt67

mccptt675#

也许它会帮助一些人。你可以创建一个新的免费送货对象,并从它获得最小量。我认为这比@LoicTheAztec答案简单。

if ( class_exists( 'WC_Shipping_Free_Shipping' ) ) {
    $free_shipping = new WC_Shipping_Free_Shipping();
    $min_amount = $free_shipping->min_amount;
    echo $min_amount;
}

相关问题