
本教程详细介绍了如何在 woocommerce 环境下,特别是在标准 `wc_order` 方法无法满足需求时,通过直接查询 wordpress 数据库来获取与特定订单关联的客户备注。我们将提供一个自定义 php 函数,通过查询 `wp_comments` 和 `wp_commentmeta` 表,准确检索那些被标记为客户备注的评论,确保您能够有效地访问和展示这些关键信息。
在 WooCommerce 中,客户订单备注是商家理解客户特定需求或指示的重要信息。通常,WC_Order 对象提供了 get_customer_note() 方法来获取订单的客户备注。然而,在某些特定场景下,例如备注以评论形式存储并带有特定元数据(如 is_customer_note),或者当集成其他插件(如 WooCommerce Bookings)时,直接使用 get_customer_note() 可能无法检索到所有预期的客户备注。
一个常见的误区是尝试从 get_customer_note() 的返回值中获取 post_excerpt 属性,如下面的示例代码所示:
<p class="form-field form-field-wide">
    <label for="excerpt"><?php _e( 'Customer provided note', 'woocommerce-bookings' ); ?>:</label>
    <textarea rows="1" cols="40" name="excerpt" tabindex="6" id="excerpt" placeholder="<?php esc_attr_e( 'Customer notes about the order', 'woocommerce' ); ?>">
    <?php 
    // 这里的 $order->get_customer_note() 通常返回一个字符串,而非 WP_Post 对象
    $customer_note = $order->get_customer_note();
    // 尝试访问 $customer_note->post_excerpt 会导致错误或空值
    echo wp_kses_post( $customer_note->post_excerpt ); 
    ?></textarea>
</p>这段代码的问题在于,$order->get_customer_note() 方法通常返回的是一个字符串(即客户备注的内容),而不是一个 WP_Post 对象。因此,尝试访问 $customer_note->post_excerpt 将会失败,导致无法获取到预期的备注内容。为了解决这类问题,当标准方法不适用时,直接查询数据库成为一个更可靠的方案。
为了确保能够准确获取到所有以评论形式存储并标记为客户备注的订单信息,我们可以直接查询 WordPress 数据库中的 wp_comments 和 wp_commentmeta 表。以下是一个自定义 PHP 函数,它通过订单 ID 来检索所有相关的客户备注:
/**
 * 根据订单ID获取所有客户备注
 *
 * @param int $order_id 订单的ID。
 * @return array 包含客户备注数据的数组,如果不存在则为空数组。
 */
function cc_get_customer_notes($order_id) {
    global $wpdb; // 引入 WordPress 数据库对象
    $_customer_note_data = array(); // 初始化存储备注数据的数组
    // 构建 SQL 查询语句
    // 1. 从 wp_comments 表中选择所有字段
    // 2. 筛选 comment_post_ID 等于给定订单ID的评论
    // 3. 进一步筛选 comment_ID 在 wp_commentmeta 表中被标记为 'is_customer_note' = 1 的评论
    $query = "
        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
        )
    ";
    // 使用 $wpdb->prepare() 进行查询准备,提高安全性,防止SQL注入
    $_customer_notes = $wpdb->get_results( $wpdb->prepare( $query, $order_id ) );
    // 如果查询到结果,则将其赋值给返回数组
    if ( count( $_customer_notes ) > 0 ) {
        $_customer_note_data = $_customer_notes;
    }
    return $_customer_note_data; // 返回客户备注数据
}要使用 cc_get_customer_notes 函数,您只需提供订单的 ID。以下是一个简单的示例:
// 假设您已经获取到订单ID,例如从 URL 参数或订单对象中
$order_id = 703; // 替换为您的实际订单ID
// 调用自定义函数获取客户备注
$_customer_notes = cc_get_customer_notes($order_id);
echo "<h2>客户订单备注 (订单ID: {$order_id})</h2>";
if ( ! empty( $_customer_notes ) ) {
    echo "<ul>";
    foreach ( $_customer_notes as $note ) {
        // 每个 $note 对象包含评论的所有字段,如 comment_content, comment_date 等
        echo "<li><strong>日期:</strong> " . esc_html( $note->comment_date ) . "<br>";
        echo "<strong>备注内容:</strong> " . wp_kses_post( $note->comment_content ) . "</li>";
    }
    echo "</ul>";
} else {
    echo "<p>未找到该订单的客户备注。</p>";
}在上述示例中,我们首先定义了一个 $order_id,然后调用 cc_get_customer_notes 函数。如果函数返回了备注,我们将遍历这些备注并显示其日期和内容。wp_kses_post() 用于安全地输出评论内容,防止恶意脚本注入。
当标准的 WooCommerce 方法无法满足获取特定客户订单备注的需求时,直接通过数据库查询 wp_comments 和 wp_commentmeta 表提供了一个强大而灵活的解决方案。通过本文提供的 cc_get_customer_notes 函数,您可以准确地检索并展示这些关键的客户信息,从而增强您的 WooCommerce 商店的功能性和用户体验。遵循安全和性能最佳实践,确保您的实现既高效又可靠。
以上就是在 WooCommerce 中通过数据库查询获取客户订单备注的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号