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