Wordpress WP_Query Несколько запросов
Я пытаюсь найти способ запроса CPT от конкретного автора, но также, если у meta_key есть определенное значение.
Например, к моему CPT прикреплен идентификатор автора, а также настраиваемое поле "получатель". Что мне нужно, так это все сообщения этого типа этого автора, а также все сообщения этого типа, где "получатель" = этот автор.
(Надеюсь, я объяснил это достаточно хорошо!)
Я обычно довольно хорошо с SQL, но просто имею случайный мозговой пердеть момент и не могу понять это. Как я уже сказал, любая помощь очень ценится!
== Решено ==
Спасибо @3pepe3 за предложение параметра meta_query в WP_Query. Немного изменила мою логику CPT и теперь у меня прекрасно работает система.
Решением было добавить новое мета-поле для каждого поста, содержащего идентификатор пользователя исходного отправителя, а затем запустить два мета-запроса, чтобы получить посты, в которых текущий идентификатор_пользователя совпадает с полями отправителя или получателя, например:
$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 );
2 ответа
Helo JRM47R1X, вместо использования SQL-запросов вы должны использовать класс WP_Query
<?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 заключается в том, что вы можете смешивать мета-запросы, таксономии и даты с логическими операндами, такими как ИЛИ И МЕЖДУ....
Хорошо, я в конце концов понял это. Оказывается, все, что мне было нужно, - это объединение двух запросов:
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
Надеюсь, что это поможет кому-то еще с этой странной проблемой!