
本文详细阐述了在 woocommerce 中获取订单客户备注的挑战与解决方案。针对 `wc_order::get_customer_note()` 方法无法获取特定类型客户备注的问题,文章提供了一个基于数据库直接查询的自定义 php 函数。该方案通过识别存储为订单评论并带有特定元数据标记的客户备注,确保在 woocommerce bookings 等插件场景中能够准确显示所需的客户信息。
在 WooCommerce 中,"客户备注"可以有多种形式。最常见的一种是客户在结账过程中填写的订单备注,这些备注通常存储为订单的元数据(_customer_note)。另一种情况是,系统或管理员可能会将一些重要信息作为“订单评论”添加到订单中,并将其标记为“客户可见”(is_customer_note 元键值为 1)。这些评论在数据库中以 WordPress 评论的形式存在。
当开发者尝试使用 WC_Order 对象上的 get_customer_note() 方法时,它主要返回的是存储在订单元数据中的结账备注。如果期望获取的是那些以评论形式存在的、标记为客户可见的备注,那么此方法将无法满足需求。这在某些特定插件(如 WooCommerce Bookings)的自定义显示场景中尤其明显,可能导致无法正确展示客户提供的所有相关信息。
原始尝试的代码片段展示了对 WC_Order::get_customer_note() 方法的调用,并试图访问其 post_excerpt 属性:
$customer_note = $order->get_customer_note(); echo wp_kses_post( $customer_note->post_excerpt );
这里的关键问题在于:
为了获取以评论形式存储的客户备注,我们需要直接查询 WordPress 数据库。
要精确获取那些被标记为客户可见的订单评论,我们可以编写一个自定义函数,通过 SQL 查询直接访问 wp_comments 和 wp_commentmeta 表。
以下是实现此功能的 PHP 函数:
<?php
/**
 * 获取指定订单的所有客户备注(以评论形式存储并标记为客户可见)
 *
 * @param int $order_id 订单ID
 * @return array 包含客户备注(评论)数据的数组,如果不存在则返回空数组
 */
function cc_get_customer_notes($order_id) {
    global $wpdb; // 引入 WordPress 数据库对象
    $_customer_note_data = array(); // 初始化结果数组
    // 构建 SQL 查询,查找与订单关联且标记为客户可见的评论
    $q = $wpdb->prepare(
        "SELECT * FROM {$wpdb->prefix}comments 
         WHERE comment_post_ID = %d 
         AND comment_ID IN (
             SELECT comment_id FROM {$wpdb->prefix}commentmeta 
             WHERE meta_key = 'is_customer_note' 
             AND meta_value = 1
         )",
        $order_id // 使用 %d 占位符安全地插入订单ID
    );
    // 执行查询并获取结果
    $_customer_note = $wpdb->get_results($q);
    // 如果查询到结果,则将其赋值给结果数组
    if (count($_customer_note) > 0) {
        $_customer_note_data = $_customer_note;
    }
    return $_customer_note_data;
}
?>函数解析:
一旦定义了 cc_get_customer_notes 函数,你就可以在任何需要的地方调用它,传入订单 ID 即可获取相关的客户备注。
示例调用:
<?php
// 假设你已经获取到了订单ID,例如:
$order_id = 703; // 替换为实际的订单ID
// 调用自定义函数获取客户备注
$customer_notes = cc_get_customer_notes($order_id);
// 检查是否有备注并输出
if (!empty($customer_notes)) {
    echo "<h3>客户提供的备注:</h3>";
    echo "<ul>";
    foreach ($customer_notes as $note) {
        // $note 是一个 WP_Comment 对象,其 comment_content 字段包含备注内容
        echo "<li>" . wp_kses_post($note->comment_content) . "</li>";
    }
    echo "</ul>";
} else {
    echo "<p>没有找到客户提供的备注。</p>";
}
?>集成到 WooCommerce Bookings 插件场景:
如果你需要在 WooCommerce Bookings 的模板或自定义文件中显示这些备注,通常可以从当前的预订或订单上下文中获取 $order_id。然后,你可以将获取到的备注内容填充到 textarea 标签中:
<p class="form-field form-field-wide">
    <label for="customer_notes_display"><?php _e( 'Customer provided note', 'woocommerce-bookings' ); ?>:</label>
    <textarea rows="5" cols="40" name="customer_notes_display" tabindex="6" id="customer_notes_display" placeholder="<?php esc_attr_e( 'Customer notes about the order', 'woocommerce' ); ?>" readonly>
        <?php
        // 假设 $order 变量在当前上下文中可用,并且是 WC_Order 对象
        if (isset($order) && $order instanceof WC_Order) {
            $order_id = $order->get_id();
            $customer_notes = cc_get_customer_notes($order_id);
            if (!empty($customer_notes)) {
                $all_notes_content = array_map(function($note) {
                    return $note->comment_content;
                }, $customer_notes);
                echo esc_textarea( implode("\n---\n", $all_notes_content) ); // 使用换行符分隔多个备注
            }
        }
        ?>
    </textarea>
</p>注意事项:
当 WC_Order::get_customer_note() 无法满足获取所有类型客户备注的需求时,特别是那些以评论形式存储并标记为客户可见的备注,通过自定义 SQL 查询直接访问 WordPress 数据库是一个强大而有效的解决方案。本文提供的 cc_get_customer_notes 函数能够精确地检索这些信息,帮助开发者在 WooCommerce Bookings 或其他自定义场景中完整展示客户提供的所有相关备注。在实施此类自定义查询时,务必注意代码的安全性、性能和可维护性。
以上就是在 WooCommerce 中获取订单客户备注的自定义方法与实践的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号