Проверять только конкретную информацию из метаданных публикации заказов в Woocommerce - PullRequest
0 голосов
/ 13 сентября 2018

В настоящее время я работаю над проектом 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);

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Следующий запрос SQL проверит, существует ли запись для данного идентификатора заказа, имени и почтового индекса:

$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
}
0 голосов
/ 17 сентября 2018

Спасибо вам, ребята, за помощь, но мне действительно удалось решить ее самостоятельно:

$sql = $wpdb->prepare("SELECT post_id FROM wp_postmeta
WHERE post_id = %d AND meta_key in ('_billing_first_name', '_billing_postcode')
and meta_value in ('%s', '%d')

group by post_id", $ordernumber, $orderfirstname, $orderpostnumber);
0 голосов
/ 13 сентября 2018

Вам нужно использовать meta_key.

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

$sql = $wpdb->prepare( "select * from (SELECT * FROM wp_postmeta WHERE ( meta_key = '_billing_first_name' AND meta_value =%s ) 
OR ( meta_key = '_shipping_postcode' AND meta_value =%s ) ) as p 
where post_id=%s", $orderfirstname, $orderpostnumber, $ordernumber );
$res = $wpdb->get_results($sql, ARRAY_A);

обновленный запрос

select * from (SELECT * FROM wp_postmeta WHERE ( meta_key = '_billing_first_name' AND meta_value ='Gnanavel' ) OR ( meta_key = '_shipping_postcode' AND meta_value ='622222' ) ) as p where post_id=2899

enter image description here

...