Вопрос или проблема
У меня есть эта функция и ссылка на пост:
<?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: Определение необходимых переменных
Для реализации вашей задачи вам понадобится:
- ID поста – нужен для получения комментариев.
- Дата – необходима для фильтрации комментариев, чтобы получить только те, которые были написаны сегодня.
Шаг 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, что обеспечивает надежность и поддержку кода в будущем.