
本文详细阐述了在 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号