Я хочу создать запрос, в котором должны отображаться все сообщения, где настраиваемое поле «expiration_date» больше даты с сегодняшнего дня.
Краткая форма: если срок действия сообщения достигнут, он больше не должен отображаться в запросе
Я попробовал с этим фрагментом:
<?php
$today = date("Y-m-d");
$args= array(
'tag' => 'Pinnwand',
'meta_query' => array(
'key' => 'expiration_date',
'type' => 'DATE',
'value' => $today,
'compare' => '>'
)
);
$my_query = new WP_Query($args); ?>
срок годности в формате (2014-10-04), например.
Но я попробовал также формат «Ymd» с обеих сторон, изменил тип сравнения или установил тип как «NUMERIC», и ничего не помогло. В результате сообщение будет отображаться всегда.
Было бы здорово, если бы кто-нибудь мог мне помочь!
Хорошо, я нашел ошибку!
Правильный запрос требует еще одного array (). Я не знаю точно, почему, но в других случаях запрос не мог работать с ним. Так вот код
$args= array(
'tag' => 'Pinnwand',
'meta_query' => array(
array(
'key' => 'expiration',
'type' => 'DATE',
'value' => $today,
'compare' => '>'
),
),
);
$my_query = new WP_Query($args); ?>
Вы можете сделать исключение из двух запросов. Первый запрос находит все сообщения, которые вы хотите исключить, затем просматриваете их и сохраняете идентификаторы сообщений в массиве, затем вызываете второй запрос, исключая их, используя ‘post__not_in’ с массивом идентификаторов в качестве аргумента.
Я бы использовал для этого объект $ wpdb, потому что он очень эффективен.
Для справочного материала:
http://codex.wordpress.org/Class_Reference/WP_Query а также
http://codex.wordpress.org/Class_Reference/wpdb
Этот кусок кода ДОЛЖЕН делайте то, что вы пытаетесь сделать, или приближайте к нему, и я сохранил ваш тег в части запроса.
// first query to find exclusions
$today = date("Y-m-d");
$exclusions = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE expiration_date < ".$today);
if ( $exclusions ) {
foreach ( $exclusions as $exclusion ) {
$excludeIDs[] = $exclusion->ID;
}
}
// second query using exclusion array
$args= array(
'tag' => 'Pinnwand',
'post__not_in' => $excludeIDs,
);
$my_query = new WP_Query($args);
Вы можете сделать это проще, как указано на http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters:
$args= array(
'tag' => 'Pinnwand',
'meta_key' => 'expiration',
'meta_type' => 'DATE',
'meta_value' => $today,
'meta_compare' => '>'
);