在结账页面和 WooCommerce 数据字段中添加取货地点自定义字段

2024-04-03

我在另一个类似问题的答案中找到了以下解决方案:根据 WooCommerce 中的自定义字段值将文本添加到订单摘要 https://stackoverflow.com/questions/45906636/add-text-to-order-summary-based-on-a-custom-field-value-in-woocommerce。我有两个取货地点(第三个地点仅在明年添加)。

我设法在我的临时服务器上实现解决方案中的代码,但我对 INFO 数据有问题,因为每个位置都有不同的开放时间。那么,如何确保将这种差异添加到订单数据和电子邮件中,并显示所选位置的正确营业时间?

我的代码如下所示:

    // WC CHECKOUT PAGE: Add pickup location seletion on checkout page
add_filter( 'woocommerce_checkout_fields' , 'custom_store_pickup_field');
function custom_store_pickup_field( $fields ) {
    $fields['billing']['store_pickup'] = array(
        'type'     => 'select',
        'id'       => 'store_pickup_val',
        'label'    => __('For pickup, select a pickup location (Optional)', 'woocommerce'),
        'required' => true,
        'class'    => array('store-pickup form-row-wide'),
        'options'  => array(
            ''=> 'select a pickup location',
            'option_1' => 'Crossroads Farmers’ Market',
            'option_2' => 'Market on Macleod',
            'option_3' => '',
        ),
        'clear'     => true,
    );
    return $fields;
}

//* Process the checkout
add_action('woocommerce_checkout_process',  'wps_select_checkout_field_process');
function wps_select_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( $_POST['store_pickup'] == "option_0" )
        wc_add_notice( '<strong>Please select a pickup location</strong>', 'error' );
}

// Add opening hours for each location
add_action( 'woocommerce_after_checkout_form', 'shop_opening_hours', 6 );
function shop_opening_hours() {
     ?>
    <script type="text/javascript">
        (function($){
            $('#store_pickup_val').change( function(){
                $( ".shop-collection" ).remove();
                if (this.value == 'option_0') {
                    $('#shipping_method_0_flat_rate1').prop('checked', true);
                } else if (this.value == 'option_1') {
                     $( "<p>Order can be picked up between 9am - 5pm on Friday-Sunday</p>" ).addClass("shop-collection").insertAfter( "#store_pickup_val" );
                     $('#shipping_method_0_local_pickup3').prop('checked', true);
                } else if (this.value == 'option_2') {
                    $( "<p>Order can be picked up between 9pm - 5pm on Thursday-Sunday</p>" ).addClass("shop-collection").insertAfter( "#store_pickup_val" );
                    $('#shipping_method_0_local_pickup3').prop('checked', true);
                }
                $('body').trigger('update_checkout');
            });
        })(jQuery);
    </script>
<?php
}

// Now save the pickup location data to the order meta
add_action( 'woocommerce_checkout_update_order_meta', 'store_pickup_field_update_order_meta', 10, 1 );
function store_pickup_field_update_order_meta( $order_id ) {

    // BELOW update the data
    if ( $_POST['store_pickup'] == 'option_1' )
        $data = array( 
            'location' => 'Crossroads Farmers’ Market', 
            'address' => '1235 26 Avenue SW<br> Calgary, Alberta<br> T2G 1R7' 
        );
    elseif ( $_POST['store_pickup'] == 'option_2' )
        $data = array( 
        'location' => 'Market on Macleod', 
        'address' => '7711 Macleod Trail S<br> Calgary, Alberta<br> T2H 0M1' 
    );


    $collect_info = 'Order can be picked up between 9:00am - 5:00pm on Friday-Sunday';

    if ( $_POST['store_pickup'] == 'option_1' || $_POST['store_pickup'] == 'option_2' ){
        // HTML
        $store_pickup = "<h3>Pickup Information</h3>
        <table class='pickup td' cellspacing='0' cellpadding='6'>
            <tr>
                <th>Location:</th>
                <td>".$data['location']."</td>
            </tr>
            <tr>
                <th><strong>Adress:</strong></th>
                <td>".$data['address']."</td>
            </tr>
            <tr>
                <th><strong>Info:</strong></th>
                <td>".$collect_info."</td>
            </tr>
        </table>";

        // Save pickup html data (front end)
        update_post_meta( $order_id, '_store_pickup_data', $store_pickup );
        // Save pickup location (backend)
        update_post_meta( $order_id, '_store_pickup_location', $data['location'] );
    }
}

// Display 'pickup location' on the order edit page (backend)
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'display_store_pickup_location_on_order_edit_pages', 10, 1 );
function display_store_pickup_location_on_order_edit_pages( $order ){
    $pickup_location = get_post_meta( $order->get_id(), '_store_pickup_location', true );
    if( ! empty( $pickup_location ) )
        echo '<p><strong>Store pickup location: </strong> ' . $pickup_location . '</p>';
}

// Display 'pickup html data' in "Order received" and "Order view" pages (frontend)
add_action( 'woocommerce_order_details_after_order_table', 'display_store_pickup_data_in_orders', 10 );
function display_store_pickup_data_in_orders( $order ) {
    $pickup_data = get_post_meta( $order->get_id(), '_store_pickup_data', true );
    if( ! empty( $pickup_data ) )
        echo $pickup_data;
}

// Display 'pickup html data' in Email notifications (frontend)
add_action( 'woocommerce_email_order_meta', 'display_store_pickup_data_in_emails', 10 );
function display_store_pickup_data_in_emails( $order ) {
    $pickup_data = get_post_meta( $order->get_id(), '_store_pickup_data', true );
    if( ! empty( $pickup_data ) ){
        // Email CSS style rules
        echo '<style>
        table.pickup{width: 100%; font-family: \'Helvetica Neue\', Helvetica, Roboto, Arial, sans-serif;
            color: #737373; border: 1px solid #e4e4e4;}
        table.pickup th, table.pickup td{text-align: left; border-top-width: 4px;
            color: #737373; border: 1px solid #e4e4e4; padding: 12px;}
        table.pickup td{text-align: left; border-top-width: 4px; color: #737373; border: 1px solid #e4e4e4; padding: 12px;}
        </style>';
        // Html data
        echo $pickup_data;
    }

}

任何帮助将不胜感激 莱瑟


Updated:您只是忘记为每个取货地点添加不同的“信息”:

// Now save the pickup location data to the order meta
add_action( 'woocommerce_checkout_update_order_meta', 'store_pickup_field_update_order_meta', 10, 1 );
function store_pickup_field_update_order_meta( $order_id ) {
    // Only for chosen "option_1" and "option_2"
    if ( $_POST['store_pickup'] == 'option_1' || $_POST['store_pickup'] == 'option_2' ){

        // 1. Set the data in an array, conditionally on chosen option value

        $collect_info = __('Order can be picked up between ');
        if( $_POST['store_pickup'] == 'option_1' ){
            $data = array(
                'location' => __('Crossroads Farmers’ Market'),
                'address'  => __('1235 26 Avenue SW<br> Calgary, Alberta<br> T2G 1R7'),
                'info'     => $collect_info . __('9:00am - 5:00pm on Friday-Sunday')
            );
        } else {
            $data = array( 
                'location' => __('Market on Macleod'),
                'address'  => __('7711 Macleod Trail S<br> Calgary, Alberta<br> T2H 0M1'),
                'info'     => $collect_info . __('9:00am - 5:00pm on Thursday-Sunday')
            );
        }

        // 2. Set the data in a formatted HTML string

        $data_html = "<h3>Pickup Information</h3>
        <table class='pickup td' cellspacing='0' cellpadding='6'>
            <tr>
                <th>Location:</th>
                <td>".$data['location']."</td>
            </tr>
            <tr>
                <th><strong>Adress:</strong></th>
                <td>".$data['address']."</td>
            </tr>
            <tr>
                <th><strong>Info:</strong></th>
                <td>".$data['info']."</td>
            </tr>
        </table><br>";

        // 3. Save the data to the Order meta data

        // Pickup html formated data
        update_post_meta( $order_id, '_store_pickup_data', $data_html );

        // Pickup location
        update_post_meta( $order_id, '_store_pickup_location', $data['location'] );
    }
}

你的 jQuery 代码也可以简化一点:

// Add opening hours for each location
add_action( 'woocommerce_after_checkout_form', 'shop_opening_hours', 6 );
function shop_opening_hours() {
     ?>
    <script type="text/javascript">
        (function($){
            $('#store_pickup_val').change( function(){
                $( ".shop-collection" ).remove();
                if (this.value == 'option_1') {
                    $( "<p>Order can be picked up between 9am - 5pm on Friday-Sunday</p>" ).addClass("shop-collection").insertAfter( "#store_pickup_val" );
                    $('#shipping_method_0_local_pickup3').prop('checked', true);
                } else if (this.value == 'option_2') {
                    $( "<p>Order can be picked up between 9pm - 5pm on Thursday-Sunday</p>" ).addClass("shop-collection").insertAfter( "#store_pickup_val" );
                    $('#shipping_method_0_local_pickup3').prop('checked', true);
                } else {
                    $('#shipping_method_0_flat_rate1').prop('checked', true);
                }
                $('body').trigger('update_checkout');
            });
        })(jQuery);
    </script>
<?php
}

代码位于活动子主题(或主题)的 function.php 文件中或任何插件文件中。


经过测试并有效。您将得到:

For "option_1"收到订单/查看订单页面|电子邮件通知

For "option_2"收到订单/查看订单页面|电子邮件通知


一个建议:
在第一个代码函数(最后)中,您可以通过以下方式将所有非格式化数据保存在数组中,而不是仅保存拾取位置(非格式化数据):

 // Save all Pickup non formatted data array  
 update_post_meta( $order_id, '_store_pickup', $data );

因此,要访问这些数据,您只需使用:

 $data = get_post_meta( $order_id, '_store_pickup', true );

 $pickup_location = $data['location'];
 $pickup_address  = $data['address'];
 $pickup_info     = $data['info'];

这样您就可以确保在订单中保存可访问的非格式化完整提货数据。

在这种情况下,这可以替换:

$pickup_location = get_post_meta( $order->get_id(), '_store_pickup_location', true );

改为使用:

$pickup_location = get_post_meta( $order->get_id(), '_store_pickup', true )['location'];

所以你可以明确删除取货位置保存功能......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在结账页面和 WooCommerce 数据字段中添加取货地点自定义字段 的相关文章

随机推荐

  • 在 Javascript 中从本地数据保存文件

    场景如下 用户来到我的网站并打开一个带有一些 JavaScript 功能的网页 用户通过javascript编辑数据 用户单击保存按钮来保存数据 事情是 他们似乎不需要下载这些数据 因为它已经在本地计算机上的 JavaScript 中 是否
  • 用于检测 .NET CF 3.5 并安装它的 Windows Mobile Cab 设置

    我使用 NET CF 3 5 等目标框架和 professional 6 SDK 开发了 windows mobile 6 professional 应用程序 还创建了其 SmartDeviceCab 文件 当我将其安装在没有 CF 3 5
  • 如何控制.NET SoapFormatter中的命名空间?

    我正在编写一些需要向后兼容使用 SOAP 序列化某些对象的现有远程处理代码的代码 我的困难是我必须将一些对象移动到新程序集 因此远程处理被破坏 例如 我使用 NET SoapFormatter 序列化一个对象 如下所示 Person p n
  • vim 正则表达式用于替换引号内的空格

    我有以下格式的文本 ERR OUT OF MEM ERR OUT OF MEM ERR SOMETHING BAD ERR SOMETHING BAD 我想用下划线替换文本中引号内的所有空格 ERR OUT OF MEM ERR OUT O
  • MVVM 最佳实践:视图模型之间的通信

    我的简化程序结构如下所示 public class Manager public Item MyItem get set public void Recalculate public class Item public string Som
  • 每对观测值的马氏距离

    我正在尝试计算数据集的每个观测值之间的马哈拉诺比斯距离dat 其中每行是一个观察值 每列是一个变量 该距离定义为 我写了一个函数来做到这一点 但我觉得它很慢 在 R 中是否有更好的方法来计算它 生成一些数据来测试该功能 generateDa
  • 这个正则表达式不应该发生灾难性的回溯

    有人可以解释为什么 Java 的正则表达式引擎会在此正则表达式上进入灾难性的回溯模式吗 据我所知 每个交替都与其他每个交替相互排斥 s s Text p o de a car itaucard mastercard platinum SUS
  • 如何在Python 3.6中执行2个协程

    我无法让两个协程在我的 Python 3 6 程序中并行执行 这是一个例子 import asyncio time def main loop asyncio get event loop loop run until complete s
  • 查找C++静态初始化顺序问题

    我们遇到了一些问题静态初始化顺序惨败 http www parashift com c faq lite static init order html 并且我正在寻找方法来梳理大量代码以查找可能发生的情况 关于如何有效地做到这一点有什么建议
  • Cypher 查询 JSON 格式的结果

    在演员 电影演示图上 cypher 在单独的数组中返回列名称 MATCH n Person RETURN n name as Name n born as Born ORDER BY n born LIMIT 5 results colum
  • Mysql查询查找具有相同列值的字段之和

    我有一张这样的桌子 id invent id order 1 95948214 70 2 46018572 30 3 46018572 20 4 46018572 50 5 36025764 60 6 36025764 70 7 95948
  • Java音乐播放器:歌曲信息和播放[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在Android中 我们可以使用媒体播放器在设备上播放歌曲 并使用光标来获取曲目信息 操作系统跟踪的信
  • 简单登录返回空白页

    我正在学习 PHP 并且制作了一个简单的登录脚本 但问题是它仅将我重定向到空白页面 如果用户凭据正确 它的意思是重定向到index php 但情况显然并非如此 还有验证 如果用户输入空白 则会返回错误 这似乎没有被执行 登录 php
  • 使用 rdmsr/rdpmc 提高分支预测精度

    我试图了解分支预测单元在 CPU 中如何工作 我用过papi还有linux的perf events但他们都没有给出准确的结果 对于我的情况 这是我的代码 void func int arr int sequence len for int
  • 在c中获取浮点数的指数

    抱歉 如果已经有人问过这个问题 并且我已经看到了提取浮点数指数的其他方法 但这就是给我的 unsigned f2i float f union unsigned i float f x x i 0 x f f return x i 我无法理
  • css4 中可以使用父选择器吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Here is fiddle http jsfiddle net uday redI V9F7d 7 我有 2 个 div 一个是外盒 另一个是
  • Matplotlib 在 vi​​rtualenv 中不显示图形

    我已经在我的 virtualenv 中安装了 pip matplotlib 并且正在尝试绘制一个简单的图表 我使用 Eclipse 和 PyDev 当我从 Eclipse 运行脚本时 它根本不显示任何图形 我已经尝试过其他问题中提出的建议
  • 是否可以在 Cloudformation 中更新 Elastic Beanstalk 环境而不影响部署到其中的版本?

    我正在使用 Cloudformation 创建 Elastic Beanstalk 环境 我必须创建一个 ApplicationVersion 只是为了启动它并将其输入到环境的定义中 我创建其他应用程序版本并以其他方式将它们部署到集群 Co
  • C 线程编程 - 增加共享变量

    嘿伙计们 所以我正在尝试温习我的 C 线程 我发现的一个问题是 给定一个全局变量 int x 0 实现函数 void 无用 int n 它创建 n 个线程 在循环中将 x 加 1 每个线程在 x 达到 100 时终止 我只是没有掌握线程 需
  • 在结账页面和 WooCommerce 数据字段中添加取货地点自定义字段

    我在另一个类似问题的答案中找到了以下解决方案 根据 WooCommerce 中的自定义字段值将文本添加到订单摘要 https stackoverflow com questions 45906636 add text to order su