Вопрос или проблема
Я пытаюсь отобразить общее количество комментариев к постам пользователей, ограниченное мета данных комментариев. Я пробовал использовать как get_comments()
, так и WP_Comment_Query()
, но получаю один и тот же результат “1” для количества комментариев, хотя должно быть “3”. В этом примере я могу удалить 'Count' => true
и просто пройти по комментариям в цикле, и это вернет правильное количество комментариев, но счетчик по-прежнему равен одному.
Они предоставляют пример здесь, как получить количество, но это не работает для меня. Вот моя функция.
function get_unseen_comment_count() {
if ( !is_user_logged_in() )
return false;
$user_id = get_current_user_id();
$postids = array();
$posts = get_posts( array(
'numberposts' => -1,
'post_type' => 'fod_articles',
'author' => $user_id,
'post_status' => 'publish'
));
foreach( $posts as $post ) {
$postids[] = $post->ID;
}
$args = array(
'include' => $postids,
'meta_query' => array(
array(
'key' => 'viewed_status',
'value' => 'unseen'
)
),
'count' => true
);
// $comments_query = new WP_Comment_Query;
// $comments = $comments_query->query( $args );
$comments = get_comments($args);
echo '<span class="comment-count">';
echo $comments;
echo '</span>';
}
Теперь в кодексе не говорится, что get_comment()
поддерживает мета-запрос, но вы можете увидеть на строке 181 здесь, что это так. Однако он не показывает поддержку include
, но это определенно работает, когда я тестирую, используя цикл по фактическим комментариям.
Некоторое дальнейшее тестирование, когда я удаляю мета-запрос, я получаю общее количество комментариев для всех постов пользователя, поэтому моя медиа-запрос, кажется, мешает счету. Я также пытался просто использовать meta_key
и meta_value
без мета-запроса, но получаю тот же результат…”1″.
Посмотрите на аргументы, которые вы передаете в get_comments(), и сравните их с документацией на WordPress Codex.
Ваш пример –
$args = array(
'include' => $postids,
'meta_query' => array(
array(
'key' => 'viewed_status',
'value' => 'unseen'
)
),
'count' => true
);
Пример из кодекса –
$defaults = array(
'author_email' => '',
'ID' => '',
'karma' => '',
'number' => '',
'offset' => '',
'orderby' => '',
'order' => 'DESC',
'parent' => '',
'post_id' => '',
'post_author' => '',
'post_name' => '',
'post_parent' => '',
'post_status' => '',
'post_type' => '',
'status' => '',
'type' => '',
'user_id' => '',
'search' => '',
'count' => false
);
- Вы передаете многомерный массив, когда в документации явно указано, что ожидается одномерный массив.
- Вы также передаете массив “ID постов”, когда в документации явно указано, что ожидается целое число.
Мое решение – просто использовать count()
для определения количества элементов в массиве, возвращаемом $comments
, что срабатывает, но я оставлю это неотмеченным, так как это не объясняет, почему метод функции не работает.
Я только что протестировал ваш код в неизменном виде на своем сайте (я вручную добавил мета-значения комментариев к 3 комментариям), и он сработал отлично.
Единственное, что я сделал, – это закомментировал 'post_type' => 'fod_articles',
, так как у меня нет такого типа постов. Это должно быть fod_articles
или food_articles
?
Редактирование:
Я протестировал снова, на этот раз с пользовательским типом поста, и это сработало после внесения этого изменения:
$args = array(
'post__in' => $postids,
'meta_query' => array(
array(
'key' => 'viewed_status',
'value' => 'unseen'
)
),
'count' => true
);
В основном, измените include
на post__in
Ответ или решение
Чтобы предоставить детализированный и профессиональный ответ на ваш вопрос, начнем с основного понимания задачи: вам необходимо отобразить общее количество комментариев к постам определенного пользователя, ограничиваясь использованием мета-значения для комментариев. Проблема заключается в том, что вы получаете неправильный результат при использовании функций get_comments()
и WP_Comment_Query()
, где счетчик комментариев возвращает число 1, хотя вы ожидаете 3.
Теория
В WordPress система работы с комментариями позволяет выборку по множеству параметров, однако правильная конфигурация аргументов крайне важна. Вы используете мета-запрос (meta_query
) для ограничения выборки только теми комментариями, у которых мета-ключ viewed_status
имеет значение unseen
. Ваша основная ошибка заключается в некорректном использовании аргументов: вы используете ‘include’, когда вам нужно ‘post__in’. Аргумент ‘include’ не поддерживается в get_comments()
, в то время как ‘post__in’ позволяет указать массив ID постов.
Пример
Вот пример необходимых изменений, которые были предложены, чтобы решить вашу проблему:
$args = array(
'post__in' => $postids,
'meta_query' => array(
array(
'key' => 'viewed_status',
'value' => 'unseen'
)
),
'count' => true
);
Применение
Теперь, когда мы знаем, в чем ошибка и как ее исправить, начнем с определения всех шагов, необходимых для достижения вашего результата.
-
Проверьте конфигурацию постов: Убедитесь, что посты действительно имеют тип ‘fod_articles’. Ошибочный тип может привести к отсутствию комментариев в выборке. Если ваш сайт использует ‘food_articles’ или иной тип, измените это в вашем запросе.
-
Используйте ‘post__in’ вместо ‘include’: Как предложено в решении, используйте ‘post__in’ для фильтрации комментариев к постам, принадлежащим конкретному пользователю.
-
Используйте
count()
в качестве альтернативы: Если исправления не помогут, используйте функцию PHPcount()
, чтобы просто подсчитать количество элементов, полученных в массиве комментариев:
$comments = get_comments($args);
echo '<span class="comment-count">';
echo count($comments);
echo '</span>';
Этот способ не использует механизм WordPress для подсчета, но эффективно решает вашу задачу на уровне PHP.
-
Проверка на стороне сервера и клиента: Убедитесь, что кеширование на сервере или клиенте не влияет на отображение данных. Это частая проблема, особенно в высоконагруженных средах.
-
Расширенная отладка: Если проблема сохраняется, вы можете использовать расширенные инструменты логирования и отладки, предлагаемыми WordPress, такие как WP_DEBUG и инструменты для работы с базой данных, чтобы осмотреть формируемые SQL-запросы в поиске потенциальных ошибок.
Подытожив, ваша задача сводится к корректному формированию запроса и улучшенной отладке возможных ошибок в вашем коде. Эти шаги должны помочь вам достичь нужного результата, улучшая как точность выборки комментариев, так и производительность вашего кода.