Вопрос или проблема
Я пытаюсь получить один пост с сегодняшней даты год назад, и код ниже оказывается медленным запросом в Query Monitor. Как более эффективно выполнить запрос на получение поста с даты год назад?
<?php $args = array(
'date_query' => array(
'post_parent' => '',
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
'post_type' => 'post',
'column' => 'post_date',
'before' => '1 year ago',
),
'posts_per_page' => 1,
);
$query = new WP_Query( $args ); ?>
<?php while($query->have_posts()) : $query->the_post(); ?>
<a href="<?php the_permalink() ?>">
<?php the_title(); ?></a>
<?php endwhile; wp_reset_postdata();?>
Ответ или решение
Чтобы ускорить выполнение WP_Query
при извлечении поста за аналогичный день прошлого года, важно оптимизировать запрос. Давайте рассмотрим возможные пути решения этой задачи с точки зрения производительности и эффективности:
Анализ текущего подхода:
-
Использование
date_query
: Ваш текущий код применяетdate_query
с параметромbefore
, что может приводить к неэффективной работе, поскольку он проверяет множество записей. -
Сортировка и огранчиение: Сортировка и ограничение числом записей (
orderby
,order
,posts_per_page
). Однако, они накладываются уже после выполнения основного поиска, и это может замедлять процесс.
Оптимизация запроса:
-
Явная дата вместо "1 year ago": Вместо использования человеческой интерпретации времени, такой как
'before' => '1 year ago'
, лучше задать точную дату, чтобы избежать лишних вычислений. Например:$one_year_ago_date = date('Y-m-d', strtotime('-1 year'));
-
Использование поля
date_query
более целенаправленно: Указываем точные границы запроса для ускорения выборки:$args = array( 'date_query' => array( array( 'year' => date('Y', strtotime($one_year_ago_date)), 'month' => date('m', strtotime($one_year_ago_date)), 'day' => date('d', strtotime($one_year_ago_date)), ), ), 'posts_per_page' => 1, 'post_type' => 'post', 'post_status' => 'publish', );
-
Кэширование результатов: Используйте плагины или WP Transients API для временного хранения результата запроса, чтобы избежать повторных вычислений при аналогичных запросах.
-
Проверка индексов БД: Убедитесь, что столбцы базы данных, такие как
post_date
, индексированы для более быстрого выполнения запросов. -
Использование объектов
wpdb
для более сложных сценариев: Если нужно более сложное условие выборки или возникли проблемы с производительностью, можно рассмотреть переход к нативным SQL-запросам с использованием объектаwpdb
.
Общий вывод:
Применив данные методы, вы сможете значительно снизить время выполнения WP_Query
для поиска поста с аналогичной датой прошлого года. Важно исходить из предпосылки, что чем точнее и определеннее запрос на уровне SQL, тем быстрее и эффективнее будет обработка данных.
Избегайте использования общих выражений и старайтесь адаптировать ваш код под конкретные нужды и возможные особенности работы вашего сайта.