在产品页面上显示运费 - WooCommerce

Posted

技术标签:

【中文标题】在产品页面上显示运费 - WooCommerce【英文标题】:Display shipping cost on product page - WooCommerce 【发布时间】:2018-05-04 17:14:11 【问题描述】:

我正在尝试在 Wordpress 上创建一个自定义页面,该页面以一个表单显示 2 种订阅类型,每种类型有 3 种变体(每月、6 个月、12 个月)。每个变体都有一个单选按钮,当用户单击单选按钮时,我有一个实时更新的总价。这部分工作正常。

但现在,我想添加 3 个其他单选按钮来选择发货方式。 (当用户选择一个时,它也会实时更新总价)。

我一直在寻找如何获取产品的运费,但没有任何效果。

有人知道吗:)?

【问题讨论】:

在 woocommerce 中,仅在您将产品添加到购物车后,才会在购物车和结帐中启用发货选项,因为它们基于运输区域(客户位置)......所以当新客户购买东西时,他可以在结帐页面(可选在购物车中)添加运输所需的相关位置数据……对于每个运输区域中的每种运输方式,您可以使用运输类别设置不同的价格,然后您可以为每个产品设置正确的运输类别或产品变化……在产品本身中实现运输选择,是一个先进而复杂的发展。 [...] 我是一名开发人员,所以我可以使用 php 代码、钩子或任何可以帮助我做到这一点的东西在我的自定义页面上添加它。也许我必须做一些棘手的事情才能让它发挥作用。实际上,我使用自定义表单制作了一个自定义页面,用于在我的变量订阅之间进行选择。如果你想要一个我想要的例子,它几乎完全一样:lepetitballon.com/subscription(对不起,它是法语)。 我制作了这个免费插件,可以在产品页面上直接显示运费,用户可以更改地址以根据那里的位置查看运费wordpress.org/plugins/… 【参考方案1】:

这个问题太笼统了。所以我可以部分回答,因为你应该需要自己做一些工作,然后再问更具体的问题……

现在在产品页面上设置发货数据的正确方法是使用 Ajax更新数据,随着操作的进行由客户在客户端(浏览器),避免“发布”并重新加载页面。但这应该是你的工作......

1) 客户位置 (适用于运输区域)

您应该首先获取客户位置或送货区域。

然后您需要在WC()->sessionWC()->customer 对象中更新客户国家/地区。这可以通过以下方式完成:

## Get the geolocated customer country code *(if enabled)*:
$country_code = WC()->customer->get_billing_country();
// or
// $country_code = WC()->customer->get_shipping_country();


## Set a new country code
$new_country_code = 'FR';

## 1. WC_session: set customer billing and shipping country

// Get the data
$customer_session = WC()->session->get( 'customer' );
// Change some data
$customer_session['country'] = $new_country_code; // Billing
$customer_session['shipping_country'] = $new_country_code; // Shipping
// Set the changed data
$customer_session = WC()->session->set( 'customer', $customer_session );

## 2. WC_Customer: set customer billing and shipping country

WC()->customer->set_billing_country( $new_country_code );
WC()->customer->set_shipping_country( $new_country_code );

2) 运输方式 (按运输区,有成本)

在 Woocommerce 中,配送区域的配送方式仅在客户将产品添加到购物车时可用……

基于此答案代码:Display shipping methods to frontend as in the admin panel? 我们可以创建一个自定义数组,用于通过运输区域获取运输方式,包括成本和所需的一切。

下面的代码更完整,包括运输方式的费用:

// Initializing variable
$zones = $data = $classes_keys = array();

// Rest of the World zone
$zone                                              = new \WC_Shipping_Zone(0);
$zones[$zone->get_id()]                            = $zone->get_data();
$zones[$zone->get_id()]['formatted_zone_location'] = $zone->get_formatted_location();
$zones[$zone->get_id()]['shipping_methods']        = $zone->get_shipping_methods();

// Merging shipping zones
$shipping_zones = array_merge( $zones, WC_Shipping_Zones::get_zones() );

// Shipping Classes
$shipping           = new \WC_Shipping();
$shipping_classes   = $shipping->get_shipping_classes();

// The Shipping Classes for costs in "Flat rate" Shipping Method
foreach($shipping_classes as $shipping_class) 
    //
    $key_class_cost = 'class_cost_'.$shipping_class->term_id;

    // The shipping classes
    $classes_keys[$shipping_class->term_id] = array(
        'term_id' => $shipping_class->term_id,
        'name' => $shipping_class->name,
        'slug' => $shipping_class->slug,
        'count' => $shipping_class->count,
        'key_cost' => $key_class_cost
    );


// For 'No class" cost
$classes_keys[0] = array(
    'term_id' => '',
    'name' =>  'No shipping class',
    'slug' => 'no_class',
    'count' => '',
    'key_cost' => 'no_class_cost'
);

foreach ( $shipping_zones as $shipping_zone ) 
    $zone_id = $shipping_zone['id'];
    $zone_name = $zone_id == '0' ? __('Rest of the word', 'woocommerce') : $shipping_zone['zone_name'];
    $zone_locations = $shipping_zone['zone_locations']; // array
    $zone_location_name = $shipping_zone['formatted_zone_location'];

    // Set the data in an array:
    $data[$zone_id]= array(
        'zone_id'               => $zone_id,
        'zone_name'             => $zone_name,
        'zone_location_name'    => $zone_location_name,
        'zone_locations'        => $zone_locations,
        'shipping_methods'      => array()
    );

    foreach ( $shipping_zone['shipping_methods'] as $sm_obj ) 
        $method_id   = $sm_obj->id;
        $instance_id = $sm_obj->get_instance_id();
        $enabled = $sm_obj->is_enabled() ? true : 0;
        // Settings specific to each shipping method
        $instance_settings = $sm_obj->instance_settings;
        if( $enabled )
            $data[$zone_id]['shipping_methods'][$instance_id] = array(
                '$method_id'    => $sm_obj->id,
                'instance_id'   => $instance_id,
                'rate_id'       => $sm_obj->get_rate_id(),
                'default_name'  => $sm_obj->get_method_title(),
                'custom_name'   => $sm_obj->get_title(),
            );

            if( $method_id == 'free_shipping' )
                $data[$zone_id]['shipping_methods'][$instance_id]['requires'] = $instance_settings['requires'];
                $data[$zone_id]['shipping_methods'][$instance_id]['min_amount'] = $instance_settings['min_amount'];
            
            if( $method_id == 'flat_rate' || $method_id == 'local_pickup' )
                $data[$zone_id]['shipping_methods'][$instance_id]['tax_status'] = $instance_settings['tax_status'];
                $data[$zone_id]['shipping_methods'][$instance_id]['cost'] = $sm_obj->cost;
            
            if( $method_id == 'flat_rate' )
                $data[$zone_id]['shipping_methods'][$instance_id]['class_costs'] = $instance_settings['class_costs'];
                $data[$zone_id]['shipping_methods'][$instance_id]['calculation_type'] = $instance_settings['type'];
                $classes_keys[0]['cost'] = $instance_settings['no_class_cost'];
                foreach( $instance_settings as $key => $setting )
                    if ( strpos( $key, 'class_cost_') !== false )
                        $class_id = str_replace('class_cost_', '', $key );
                        $classes_keys[$class_id]['cost'] = $setting;
                    

                $data[$zone_id]['shipping_methods'][$instance_id]['classes_&_costs'] = $classes_keys;
            
        
    


// Row output (for testing)
echo '<pre>'; print_r($data); echo '</pre>';

自定义送货方式 现在,如果您使用自定义运输方式 (有时由 3rd 方运输插件启用),您将需要对代码进行一些更改......

成本和税金计算 您应该需要进行税金计算,因为成本的显示方式与运费设置中的设置一样......


3) 产品页面

客户所在地: 您首先需要有一个位置选择器(用于定义发货区)或根据 Woocommerce 地理位置设置位置。

运送方式: 定义运输区域后,您可以获得相应的运输方式和费率 (成本),并在此产品页面上显示运输方式的单选按钮。

为此,您需要更改单个产品页面:

Overriding the Woocommerce templates via your theme (and WC Subscriptions templates too) Using the available filters and action hooks 使用 JavascriptjQuery 更改价格并使用 Ajax 更新客户数据(WC_SessionWC_Customer)。李>

您应该需要使用以下代码(Ajax)获取/设置/更新“chosen_shipping_methods”

获取选择的运输方式:

$chosen_shipping = WC()->session->get('chosen_shipping_methods')[0];

设置/更新选择的运输方式(通过 javascript/Ajax 和 admin-ajax.php):

// HERE the new method ID
$method_rate_id = array('free_shipping:10');

// Set/Update the Chosen Shipping method
WC()->session->set( 'chosen_shipping_methods', $method_rate_id );

【讨论】:

你的回答对我有很大帮助!我认为这正是我所需要的。我错过了有关 Woocommerce 如何工作的“基本”信息。现在更容易找到新的缺失信息。非常感谢您花时间解决我的问题。我希望它也能帮助其他一些人。当我完成它时,我会在这里发布我的解决方案。祝你有美好的一天 很好的答案和***代码示例。你今天帮助了我。 感谢您的回答!考虑当前货币是否可以重写2) The shipping methods @YuraKosyak 你可以使用 wc_price 方法。

以上是关于在产品页面上显示运费 - WooCommerce的主要内容,如果未能解决你的问题,请参考以下文章

html 在购物车页面上收取运费

在 magento 中更改运费计算

从 WooCommerce 中的订单总额中删除运费总额

上课时关闭模态,与另一个保持打开状态

总和问题 - 不给出单独的行总和,显示每行的总和

php [在存档页面上显示产品尺寸]在存档页面上显示WooCommerce 3.0+产品尺寸,位于产品标题下方。