Запустите запрос для цикла, сортируя по сумме обратного возраста комментариев с помощью WP_Query.

Вопрос или проблема

Мне нужна помощь в создании конкретного запроса для 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", "агрегация комментариев", чтобы улучшить видимость материалов в поисковых системах. Убедитесь, что заголовки, метаописания и структурированные данные соответствуют ключевым словам.

Оцените материал
Добавить комментарий

Капча загружается...