Показать количество всех комментариев по meta_value из сообщений пользователя.

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

Я пытаюсь отобразить общее количество комментариев к постам пользователей, ограниченное мета данных комментариев. Я пробовал использовать как 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
);
  1. Вы передаете многомерный массив, когда в документации явно указано, что ожидается одномерный массив.
  2. Вы также передаете массив “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
);

Применение

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

  1. Проверьте конфигурацию постов: Убедитесь, что посты действительно имеют тип ‘fod_articles’. Ошибочный тип может привести к отсутствию комментариев в выборке. Если ваш сайт использует ‘food_articles’ или иной тип, измените это в вашем запросе.

  2. Используйте ‘post__in’ вместо ‘include’: Как предложено в решении, используйте ‘post__in’ для фильтрации комментариев к постам, принадлежащим конкретному пользователю.

  3. Используйте count() в качестве альтернативы: Если исправления не помогут, используйте функцию PHP count(), чтобы просто подсчитать количество элементов, полученных в массиве комментариев:

$comments = get_comments($args);

echo '<span class="comment-count">';
echo count($comments);
echo '</span>';

Этот способ не использует механизм WordPress для подсчета, но эффективно решает вашу задачу на уровне PHP.

  1. Проверка на стороне сервера и клиента: Убедитесь, что кеширование на сервере или клиенте не влияет на отображение данных. Это частая проблема, особенно в высоконагруженных средах.

  2. Расширенная отладка: Если проблема сохраняется, вы можете использовать расширенные инструменты логирования и отладки, предлагаемыми WordPress, такие как WP_DEBUG и инструменты для работы с базой данных, чтобы осмотреть формируемые SQL-запросы в поиске потенциальных ошибок.

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

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

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