首页 > 解决方案 > 仅检查 Woocommerce 中订单发布元数据中的特定信息

问题描述

我目前正在开发一个 WordPress 项目,该项目上有用于商店的 WooCommerce 插件。然而,来自订单的所有账单信息都进入 wp_postmeta 表,所有信息都保存在同一列“meta_value”中。

我有一个表格,客户可以使用他们的订单号、名字和邮政编号填写,填写此字段后,他们的订单将显示在网站上。

因此,在我的查询中,我只想检查用户输入的订单号、名字和邮政编号是否为真,并且我不需要列中的任何其他内容。

我已经使用我的凭据创建了一个测试订单,目前我的查询看起来像这样,但它找到了两个结果,因为 wp_postmeta 表中有两个字段与订单具有相同的订单号和相同的名字:

$ordernumber = $_POST['ordernmbr'];
$orderfirstname = $_POST['firstname'];
$orderpostnumber = $_POST['postnmbr'];

$sql = $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}postmeta
WHERE post_id = %d AND meta_value = %s",
$ordernumber, $orderfirstname);
$res = $wpdb->get_results($sql, ARRAY_A);

问我是否有不清楚的地方,我很不擅长解释事情!

编辑:在获得 Vel 的帮助后更新了查询,但仍然无法按预期工作,因为查询不想找到任何结果。

$sql = $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}postmeta
WHERE post_id = %d AND (meta_value = %s AND meta_key  ='_billing_first_name' AND  meta_value = %s AND meta_key ='_billing_postcode') ",
$ordernumber, $orderfirstname, $orderpostnumber );
$res = $wpdb->get_results($sql, ARRAY_A);

标签: phpsqlwordpresswoocommerceorders

解决方案


以下 SQL 查询将检查给定订单 ID、名字和邮政编码是否存在条目:

$ordernumber = $_POST['ordernmbr'];
$orderfirstname = $_POST['firstname'];
$orderpostnumber = $_POST['postnmbr'];

$result = $wpdb->get_col( $wpdb->prepare( "
    SELECT pm.post_id
    FROM $wpdb->postmeta as pm
    JOIN $wpdb->postmeta as pm1 ON pm.post_id = pm1.post_id
    WHERE pm.post_id = %d
    AND pm.meta_key  ='_billing_first_name'
    AND pm.meta_value = %s
    AND pm1.meta_key ='_billing_postcode'
    AND pm1.meta_value = %s
", $ordernumber, $orderfirstname, $orderpostnumber ) );

if( sizeof($result) ) 
    $result = true;

测试和工作。


也可以通过get_post_meta()这种方式使用 Wordpress 功能完成:

$firstname = get_post_meta( $_POST['ordernmbr'], '_billing_first_name', true );
$postnmbr  = get_post_meta( $_POST['ordernmbr'], '_billing_postcode', true );

if( $firstname == $_POST['firstname'] && $postnmbr == $_POST['postnmbr'] ) {
    // The data match
} elseif( $firstname == $_POST['firstname'] || $postnmbr == $_POST['postnmbr'] ) {
    // The data match partially
else {
    // The data don't match
}

推荐阅读