2015-03-09 2 views
0

Я пытаюсь найти способ запросить CPT конкретным автором, но также, если meta_key имеет определенное значение.Wordpress WP_Query Несколько запросов

Например, мой CPT имеет прикрепленный к нему идентификатор автора, а также настраиваемое поле «получатель». Мне нужны все сообщения этого типа от этого автора, а также все сообщения этого типа, где «получатель» = этот автор.

(Надежда Я объяснил, что достаточно хорошо!)

Я обычно довольно хорошо с SQL, но только имея случайный мозг пердеть момент и не могу понять это. Как я уже сказал, любая помощь очень ценится!

== решаемые ==

Благодаря @ 3pepe3 предложившего параметр meta_query из WP_Query. Немного изменила мою CPT-логику и теперь имеет красивую рабочую систему.

Решение было добавить новый мета-поле для каждого поста, содержащего идентификатор пользователя исходного отправителя, а затем запустить два meta_queries для извлечения сообщения, где ток user_id соответствует либо отправителя или получателя поля, любит так:

$args = array(
    'post_type' => 'activity', 
    'post_status' => 'publish', 
    'orderby' => 'date', 
    'order' => 'DESC', 
    'meta_query' => array(
     'relation' => 'OR', 
     array(
      'key' => 'sender', 
      'value' => $user_id, 
      'type' => 'BINARY', 
      'compare' => '=' 
     ), 
     array(
      'key' => 'recipient', 
      'value' => $user_id, 
      'type' => 'BINARY', 
      'compare' => '=' 
     ) 
    ) 
); 

$query = new WP_Query($args); 

ответ

0

Helo JRM47R1X, Вместо использования SQL запросов следует использовать WP_Query Class

<?php 
$args = array(
    'post_type' => 'activity', 
    'author' => $user_id, 
    'post_status' => 'publish', 
    'orderby' => 'date', 
    'order' => 'DESC', 
    'meta_query' => array(
     array(
      'key' => 'recipient', 
      'value' => $user_id, 
      'type' => 'BINARY', 
      'compare' => '=' 
      ), 
     ), 
    ); 
$query = new WP_Query($args); 
?> 

Преимущество использования WP_Query в том, что вы можете смешивать мета-запросы, систематики и даты с логическими операндами, как OR, AND BETWEEN ....

+0

hi @ 3pepe3, спасибо за предложение, к сожалению, набор результатов, возвращенный этим запросом, содержит только те результаты, в которых автор также является получателем. Я думаю, вы на что-то с meta_query, хотя +1 для этого! – JRM47R1X

+0

Исходя из вашего ответа, если бы я добавил новое настраиваемое поле (например, «sender»), я мог бы использовать несколько массивов meta_query и использовать оператор OR для соответствия любому отправителю получателя. Немного неопрятный, поскольку это по существу дублирование уже имеющегося параметра «автор», но я не могу найти другой способ соединения запроса между почтовыми данными и пост-метаданными. – JRM47R1X

+0

В вашем запросе вы получаете сообщения, в которых $ user_id является автором, а затем в вашем union вы получаете сообщения, в которых получатель meta_key - тот же $ user_id. Таким образом, это нормально, что возврат содержит только те результаты, когда автор также является получателем. Итак, если вы хотите получить сообщение от одного автора к другому «получателю», вам нужно только изменить «author» => $ author_id », а в массиве meta_query выберите нужное имя получателя' 'value' => $ recipient_id, '(вы должны объявить $ author_id и $ recipient_id) – 3pepe3

0

Хорошо, я в конце концов понял это. Оказывается, все, что мне нужно было Союз по двум запросам, как так:

SELECT * FROM (
    SELECT $wpdb->posts.* 
     FROM $wpdb->posts 
     WHERE $wpdb->posts.post_author = $user_id 
     AND $wpdb->posts.post_type = 'activity' 
     AND $wpdb->posts.post_status = 'publish' 
    UNION 
    SELECT $wpdb->posts.* 
     FROM $wpdb->posts, $wpdb->postmeta 
     WHERE $wpdb->postmeta.meta_key = 'recipient' 
     AND $wpdb->postmeta.meta_value = $user_id 
     AND $wpdb->posts.ID = $wpdb->postmeta.post_id 
     AND $wpdb->posts.post_type = 'activity' 
     AND $wpdb->posts.post_status = 'publish' 
    ) as x 
ORDER BY x.post_date DESC 

Надеется, что это помогает кто-то еще с этой причудливо неясной проблемой!

 Смежные вопросы

  • Нет связанных вопросов^_^