Вопрос или проблема
Мне нужна помощь в создании конкретного запроса для WordPress, и я не знаю, как это сделать.
Я хочу выбрать n постов, упорядоченных по сумме обратного значения возраста комментариев в днях. Я хотел бы использовать класс WP_Query, если смогу, но не уверен, как действовать дальше.
Если бы я использовал сырой SQL, я бы сделал что-то вроде:
SELECT *, SUM(1/(DIF(table1.date,NOW()))) as score
FROM table1 INNER JOIN table2 ON table1.id = table2.fk_id
GROUP BY table1.id
ORDER BY score
LIMIT 10;
Так Facebook раньше вычислял edgerank для постов. Я хочу сделать это для “трендовых постов”. Очевидно, затем я хочу запустить цикл для вывода постов.
Могу ли я сделать это нативно?
Ответ или решение
Чтобы создать запрос в WordPress для выбора постов, отсортированных по сумме обратного возраста комментариев, необходимо усвоить несколько ключевых аспектов, поскольку WP_Query на прямую не поддерживает сложные SQL запросы с агрегацией. Однако можно использовать метод pre_get_posts
для модификации основного запроса или подключить пользовательский SQL-запрос через wpdb
.
Вот пошаговая инструкция, как реализовать вашу задачу:
1. Создание пользовательского SQL-запроса
Поскольку вам требуется агрегация данных, логично будет воспользоваться встроенным классом wpdb
. Ниже приведен пример того, как это может выглядеть:
global $wpdb;
// Получаем текущую дату
$current_time = current_time('mysql');
// Запрос для получения постов, отсортированных по сумме обратного возраста комментариев
$query = "
SELECT p.*, SUM(1 / (DATEDIFF('$current_time', c.comment_date) + 1)) AS score
FROM $wpdb->posts AS p
INNER JOIN $wpdb->comments AS c ON p.ID = c.comment_post_ID
WHERE p.post_status = 'publish'
AND p.post_type = 'post'
GROUP BY p.ID
ORDER BY score DESC
LIMIT 10
";
$trending_posts = $wpdb->get_results($query);
2. Использование WP_Query
Имейте в виду, что, несмотря на то что вы можете работать с WP_Query непосредственно, в данном случае вам необходимо использовать полученные данные из запроса, чтобы сформировать массив постов, подходящих под ваши условия. Вот как вы можете интегрировать их с WP_Query:
$post_ids = wp_list_pluck($trending_posts, 'ID');
if (!empty($post_ids)) {
$args = [
'post__in' => $post_ids,
'orderby' => 'post__in', // Сохраняем порядок, полученный из пользовательского запроса
'posts_per_page' => 10,
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// Тут можете вывести содержимое постов
the_title('<h2>', '</h2>');
the_excerpt();
}
wp_reset_postdata(); // Не забываем сбросить данные поста
}
} else {
echo 'Нет популярных постов для отображения.';
}
3. Итоги
Таким образом, вы можете получить "трендовые" посты, основываясь на комментариях, используя прямой SQL-запрос и результаты подставляя в класс WP_Query. Это обеспечивает гибкость и производительность, а также создает возможность варьировать логику для более точной настройки вывода постов.
Эти практики помогут улучшить производительность и упростить управление контентом на вашем сайте, а также позволят пользователям более эффективно находить интересные им посты. Не забывайте следить за обновлениями WordPress и практиковать безопасное использование SQL-запросов, чтобы минимизировать риски безопасности.
SEO Оптимизация
При написании данного кода важно использовать целевые ключевые слова, такие как "WP_Query", "трендовые посты WordPress", "агрегация комментариев", чтобы улучшить видимость материалов в поисковых системах. Убедитесь, что заголовки, метаописания и структурированные данные соответствуют ключевым словам.