Получите комментарии из текущего поста с помощью SQL.

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

Я пытаюсь использовать приведенный ниже код для автоматического обновления комментариев, но в настоящее время он отображает все комментарии. Я хотел бы показывать только комментарии к текущему посту. Я не очень опытен в SQL и не знаю, как это сделать:

<?php
function dp_recent_comments_ajax() {
        $no_comments = 5;
    $comment_len = 300;
        global $wpdb;

    $request = "SELECT * FROM $wpdb->comments";
    $request .= " JOIN $wpdb->posts ON ID = comment_post_ID";
    $request .= " WHERE comment_approved = '1' AND post_status="publish" AND post_password =''";
    $request .= " ORDER BY comment_date DESC LIMIT $no_comments";

    $comments = $wpdb->get_results($request);
    if ($comments) {
        foreach ($comments as $comment) {
            ob_start();
            ?>
                <li>
                    <a style="font-size:12px "href="https://wordpress.stackexchange.com/questions/73272/<?php echo get_permalink( $comment->comment_post_ID ) ."#comment-' . $comment->comment_ID; ?>"><?php echo dp_get_author($comment); ?> на <?php echo $comment->comment_date; ?> :</a><br />
                    <span class="recent-comment-text" style="font-size:11px;font-style:italic"><?php echo strip_tags(substr(apply_filters('get_comment_text', $comment->comment_content), 0, $comment_len)); ?>..</span>
                </li>
            <?php
            ob_end_flush();
        }
    } else {
        echo '<li>'.__('Нет комментариев', 'my-first-wp-theme').'</li>';
    }
    die(); // это необходимо для правильной работы ajax
}
function dp_get_author($comment) {
    $author = "";

    if ( empty($comment->comment_author) )
        $author = __('Анонимный', 'my-first-wp-theme');
    else
        $author = $comment->comment_author;

    return $author;
}
add_action('wp_ajax_my_recent_comments', 'dp_recent_comments_ajax');
add_action('wp_ajax_nopriv_my_recent_comments', 'dp_recent_comments_ajax'); //для пользователей, которые не авторизованы

Передайте ваш ID поста в функцию, и она будет выглядеть примерно так

<?php
 function dp_recent_comments_ajax($ID) {
    $no_comments = 5;
    $comment_len = 300;
    global $wpdb;

$request = "SELECT * FROM $wpdb->comments";
$request .= " JOIN $wpdb->posts ON ID = comment_post_ID";
$request .= " WHERE comment_approved = '1' AND post_status="publish" AND post_password =''";
$request .= " AND ID='{$ID}' ";
$request .= " ORDER BY comment_date DESC LIMIT $no_comments";

Ответ или решение

Чтобы извлечь комментарии текущего поста с использованием SQL в вашем коде WordPress, необходимо внести некоторые изменения в вашу функцию dp_recent_comments_ajax. Это позволит вам получать только комментарии, относящиеся к определённому посту, по его идентификатору (ID). Давайте рассмотрим, как это можно сделать.

1. Обновление функции

Для того чтобы в вашей функции можно было использовать идентификатор поста, модифицируем её, добавив параметр $ID. Также нам нужно убедиться, что мы правильно используем условие в SQL-запросе, чтобы фильтровать комментарии по идентификатору поста, а не по идентификатору записи.

Вот пример того, как это можно сделать:

function dp_recent_comments_ajax($ID) {
    $no_comments = 5;
    $comment_len = 300;
    global $wpdb;

    // Формирование SQL-запроса
    $request = "SELECT * FROM $wpdb->comments";
    $request .= " WHERE comment_post_ID = %d AND comment_approved = '1'";
    $request .= " ORDER BY comment_date DESC LIMIT %d";

    // Запрос к базе данных с параметрами
    $comments = $wpdb->get_results($wpdb->prepare($request, $ID, $no_comments));

    if ($comments) {
        foreach ($comments as $comment) {
            ob_start();
            ?>
            <li>
                <a style="font-size:12px" href="<?php echo get_permalink($comment->comment_post_ID) . "#comment-" . $comment->comment_ID; ?>">
                    <?php echo dp_get_author($comment); ?> on <?php echo $comment->comment_date; ?>:
                </a><br />
                <span class="recent-comment-text" style="font-size:11px;font-style:italic">
                    <?php echo strip_tags(substr(apply_filters('get_comment_text', $comment->comment_content), 0, $comment_len)); ?>..
                </span>
            </li>
            <?php
            ob_end_flush();
        }
    } else {
        echo '<li>' . __('Нет комментариев', 'my-first-wp-theme') . '</li>';
    }
    die(); // необходимо для корректной работы AJAX
}

2. Вызов функции

Теперь, когда мы изменили функцию для обработки ID поста, убедитесь, что вы вызываете эту функцию с правильным идентификатором. Например, ваш AJAX-запрос должен содержать ID поста, для которого вы хотите получить комментарии.

3. Как это работает?

В данном коде:

  • Используется метод prepare для защиты от SQL-инъекций, что важно для безопасности приложения.
  • Запрос фильтрует комментарии по comment_post_ID, что позволяет получить только те комментарии, которые относятся к конкретному посту.
  • Указанные переменные $no_comments и условия упрощают настройку количества извлекаемых комментариев и их фильтрацию.

Заключение

С помощью вышеуказанных изменений, ваша функция теперь будет извлекать и отображать только комментарии, относящиеся к текущему посту. Это обеспечивает более чистый и целенаправленный вывод, повышает удобство пользователя и защищает систему от получения ненужных данных.

Убедитесь, что вы проверяете правильность и безопасность всех данных, прежде чем использовать их в записях и запросах, чтобы избежать возможных уязвимостей.

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

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