Как получить записи, опубликованные между определенной датой и сегодняшним днем?
Есть ли способ получить записи, опубликованные между определенной датой и сегодняшним днем с помощью query_posts()
?
Пример: Все записи, опубликованные с 2012-04-01
Спасибо
РЕДАКТИРОВАНИЕ:
Как добавить фильтр по дате в этот Query Posts?
query_posts( array(
array('post'),
'tax_query' => array(
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array('post-format-image')
)
),
'cat' => '-173',
'post_status' => 'publish'
) );

ОБНОВЛЕНИЕ от 23 декабря 2014
Существует более удобный способ с использованием свойства date_query
класса WP_Query
:
$args = array(
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array( 'post-format-image' )
)
),
'cat' => '-173',
'post_status' => 'publish',
'date_query' => array(
'column' => 'post_date',
'after' => '- 30 days'
)
);
$query = new WP_Query( $args );
СТАРЫЙ ОТВЕТ
Используйте Параметры времени в WP_Query()
Цитируем пример из Codex:
Получить записи за последние 30 дней:
// Это ваш текущий запрос, к которому будет добавлена фильтрация.
$query_string = array(
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array( 'post-format-image' )
)
),
'cat' => '-173',
'post_status' => 'publish'
);
// Создаем новую функцию фильтрации, которая добавит условие WHERE к запросу
function filter_where( $where = '' ) {
// записи за последние 30 дней
$where .= " AND post_date > '" . date( 'Y-m-d', strtotime( '-30 days' ) ) . "'";
return $where;
}
add_filter( 'posts_where', 'filter_where' );
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' );
Редактирование (в ответ на обновленный вопрос автора).
Избегайте использования query_posts. Вы можете использовать описанную выше технику для изменения основного запроса (с учетом некоторых дополнительных условий - является ли это главной страницей, является ли страницей с названием 'foobar' и т.д.):
function wpse52070_filter_where( $where = '' , $query ) {
if( $query->is_main_query() && is_page( 'foobar' ) ){
// записи за последние 30 дней
$where .= " AND post_date > '" . date( 'Y-m-d', strtotime( '-30 days' ) ) . "'";
}
return $where;
}
add_filter( 'posts_where', 'wpse52070_filter_where' );

Хорошо! Теперь фильтр находится в $query_string
. Но как это работает с моими аргументами в Query_Posts? (Проверь моё редактирование @Moraleida)

@Steffi - смотри обновлённый ответ. Надеюсь, ты не против добавления, Moraleida.

просто добавил твой текущий запрос, так что ты можешь сразу отказаться от query_posts. :) И спасибо @StephenHarris за быстрое обновление!

Спасибо @moraleida ! Потрясающе! Только один момент. Вы сказали: "Избегайте использования query_posts." Но разве не лучше использовать query_posts()
в файлах шаблонов (таких как home.php), чем new WP_Query()
?

Не совсем. query_posts
следует использовать только для изменения основного цикла - и многие утверждают, что даже в этом случае это не лучший вариант (для этого есть фильтр pre_get_posts
). Я часто использую только WP_Query
или get_posts
для всех своих запросов, так как они автономны и могут использоваться многократно, не мешая работе других элементов. Ознакомьтесь с ответами по ссылкам в комментариях для подробного объяснения. :)

Если вам нужно получить записи между двумя датами, используйте параметры before и after в параметре date_query:
$query_string = array(
'post_type' => 'post',
'date_query' => array(
'column' => 'post_date',
'after' => '2012-04-01',
'before' => '2012-04-30'
),
'tax_query' => array(
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array('post-format-image')
)
),
'cat' => '-173',
'post_status' => 'publish'
);

Начиная с версии 3.7 вы можете использовать date_query http://codex.wordpress.org/Class_Reference/WP_Query#Date_Parameters
Таким образом, передаваемые аргументы будут выглядеть так:
$query_string = array(
'post_type' => 'post',
'date_query' => array(
'after' => '2012-04-01'
),
'tax_query' => array(
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array('post-format-image')
)
),
'cat' => '-173',
'post_status' => 'publish'
);
