Получите ссылку на первый комментарий непосредственно в посте

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

У меня есть эта функция и ссылка на пост:

<?php
foreach ($results as $id) {
  $post = &get_post( $id->ID );
  setup_postdata($post);

  <li><a <?php href="https://wordpress.stackexchange.com/questions/108654/<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a>

</li>
  <?php
} ?>

Что я хочу сделать: если есть комментарий, оставленный сегодня, то покажите мне ссылку на первый оставленный комментарий. Например: если сегодня было оставлено 4 комментария, я хочу ссылку на первый комментарий вместо постоянной ссылки, как сейчас.

Я попробовал использовать это:
<a <?php href="https://wordpress.stackexchange.com/questions/108654/<?php the_permalink(get_comments->$post_id) ?>">postname</a> и вариации этого, как comment_post_ID, но не смог заставить это работать. Что я делаю не так и что мне следует сделать? Пожалуйста, помогите мне…

вы можете получить ссылку на комментарий с помощью функции wp

$args = array(
    'number' => '1',
    'post_id' => ваш_post_id, // используйте post_id, а не post_ID
);
$comments = get_comments($args);

    <a href="https://wordpress.stackexchange.com/questions/108654/<?php echo get_comment_link( $comments->comment_ID ); ?>">postname</a>

Я бы использовал WP_Comment_Query.

function comment_where_wpse_108654($clauses) {
  $clauses['where'] .= ' AND DATE(comment_date) = "'.date('Y-m-d').'"';
  remove_filter('comments_clauses','comment_where_wpse_108654');
  return $clauses;
}
add_filter('comments_clauses','comment_where_wpse_108654');

$args = array(
  'post_id' => $post->ID,
  'number' => 1,
  'orderby' => 'comment_date',
  'order' => 'desc'
);
$comment_qry = new WP_Comment_Query;
$comment = $comment_qry->query( $args );

Это предполагает, что $post->ID правильный.

Теперь, если тема правильно создает ID комментариев, то echo get_permalink().'/#comment-'.$comment[0]->comment_ID; должна быть ссылкой на ваш комментарий.

Правка: Вы, похоже, запутались, как сделать это для нескольких постов/комментариев.

function comment_where_wpse_108654($clauses) {
  $clauses['where'] .= ' AND DATE(comment_date) = "'.date('Y-m-d').'"';
  return $clauses;
}
add_filter('comments_clauses','comment_where_wpse_108654');

foreach ($results as $id) {

  $args = array(
    'post_id' => $id->ID, // ваш $id->ID должен работать так же хорошо
    'number' => 1,
    'orderby' => 'comment_date',
    'order' => 'desc'
  );

  $comment_qry = new WP_Comment_Query;
  $comment = $comment_qry->query( $args );

  if (!empty($comment[0])) { ?>
    <li><a href="https://wordpress.stackexchange.com/questions/108654/<?php echo get_permalink()."/#comment-'.$comment[0]->comment_ID; ?>" rel="bookmark"><?php the_title(); ?></a></li><?php
  }
}
remove_filter('comments_clauses','comment_where_wpse_108654'); 

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

Чтобы получить ссылку на первый комментарий, сделанный сегодня к записям в WordPress, необходимо использовать возможности API WordPress и некоторые вспомогательные функции. Рассмотрим этот процесс по шагам.

Шаг 1: Определение необходимых переменных

Для реализации вашей задачи вам понадобится:

  1. ID поста – нужен для получения комментариев.
  2. Дата – необходима для фильтрации комментариев, чтобы получить только те, которые были написаны сегодня.

Шаг 2: Использование WP_Comment_Query

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

Шаг 3: Настройка фильтрации по дате

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

function filter_comments_by_date($clauses) {
    global $wpdb;
    $clauses['where'] .= ' AND DATE(comment_date) = CURDATE()';
    return $clauses;
}

add_filter('comments_clauses', 'filter_comments_by_date');

Этот код добавит условие к запросу комментариев и вернет только комментарии от сегодняшней даты.

Шаг 4: Итерация по записям

В вашем цикле foreach нужно будет создать новый запрос для получения первого комментария по каждому посту:

foreach ($results as $id) {
    $post = get_post($id->ID);
    setup_postdata($post);

    // Параметры для запроса комментариев
    $args = array(
        'post_id' => $post->ID,
        'number' => 1,
        'orderby' => 'comment_date',
        'order' => 'ASC' // сортируем по возрастанию, чтобы получить первый комментарий
    );

    // Создаем новый объект WP_Comment_Query
    $comment_query = new WP_Comment_Query;
    $comments = $comment_query->query($args);

    // Проверяем, есть ли комментарии
    if (!empty($comments)) {
        $first_comment = $comments[0];
        echo '<li><a href="' . get_permalink($post->ID) . '#comment-' . $first_comment->comment_ID . '" rel="bookmark">' . get_the_title($post->ID) . '</a></li>';
    }
}
remove_filter('comments_clauses', 'filter_comments_by_date');

Шаг 5: Завершение

Этот код будет добавлять к вашему списку ссылку на первый комментарий за сегодняшний день, если такие комментарии существуют. Важно обратить внимание на порядок сортировки – он должен быть установлен на ‘ASC’, чтобы получить первый комментарий.

Заключение

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

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

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