Функция comments_template() в WordPress
Функция comments_template() загружает шаблон комментариев, указанный в переменной $file. Она не отображает шаблон комментариев, если вы не находитесь на странице одного поста или если у поста нет комментариев.
Как работает функция
Эта функция использует объект базы данных WordPress, чтобы запрашивать комментарии. Комментарии проходят через фильтр comments_array, который принимает массив комментариев и ID поста.
Путь к файлу $file также передается через фильтр comments_template, который объединяет директорию шаблонов с именем файла. Вначале используется отфильтрованный путь, и если он не существует, загружается стандартный шаблон комментариев из темы по умолчанию. Если оба варианта отсутствуют, выполнение WordPress останавливается. Поэтому рекомендуется не удалять тему по умолчанию.
Функция не будет пытаться загружать комментарии, если у поста их нет.
Хуки (Hooks) функции
comments_template_top_level_query_argscomments_template_query_argscomments_arraycomments_template
Возвращает
Возвращает null, ничего (null).
Использование
comments_template( $file, $separate_comments );
$file(стр��ка) — файл, который нужно загрузить. По умолчанию:'/comments.php'$separate_comments(логическое) — разделять ли комментарии по типу. По умолчанию:false
Примеры использования
Пример 1: Изменение пути к файлу через фильтр
add_filter( 'comments_template', 'my_plugin_comment_template' );
function my_plugin_comment_template( $comment_template ){
global $post;
if ( !( is_singular() && ( have_comments() || 'open' == $post->comment_status ) ) ) {
return;
}
// Если это тип поста "книга"
if( $post->post_type == 'book' ){
return __DIR__ . '/reviews.php'; // полный путь к файлу
}
}
Пример 2: Отображение комментариев в теме
Используйте в файлах page.php и single.php:
Пример 3: Подключение стороннего шаблона
В некоторых случаях вам может понадобиться подключить другой файл шаблона для комментариев, поэтому укажите параметр $file. Например, подключаем файл short-comments.php:
Если вы хотите подключить файл из папки темы, укажите путь к файлу относительно папки темы:
Примечания
- Глобальные переменные:
$wp_query— объект запроса WordPress.$post— глобальный объект поста.$wpdb— объект базы данных WordPress.$id— глобальный идентификатор.$comment— глобальный объект комментария.$user_login— логин пользователя.$user_identity— идентичность пользователя.$overridden_cpage,$withcomments— логические значения.$wp_stylesheet_path— путь к директории стилей текущей темы.$wp_template_path— путь к директории шаблонов текущей темы.
Изменения
Функция была введена в версии 1.5.0.
Код функции comments_template()
function comments_template( $file = '/comments.php', $separate_comments = false ) {
global $wp_query, $withcomments, $post, $wpdb, $id, $comment, $user_login, $user_identity, $overridden_cpage, $wp_stylesheet_path, $wp_template_path;
if ( ! ( is_single() || is_page() || $withcomments ) || empty( $post ) ) {
return;
}
if ( empty( $file ) ) {
$file = '/comments.php';
}
$req = get_option( 'require_name_email' );
// Информация об авторе комментария
$commenter = wp_get_current_commenter();
$comment_author = $commenter['comment_author'];
$comment_author_email = $commenter['comment_author_email'];
$comment_author_url = esc_url( $commenter['comment_author_url'] );
// Параметры запроса комментариев
$comment_args = array(
'orderby' => 'comment_date_gmt',
'order' => 'ASC',
'status' => 'approve',
'post_id' => $post->ID,
'no_found_rows' => false,
);
if ( get_option( 'thread_comments' ) ) {
$comment_args['hierarchical'] = 'threaded';
} else {
$comment_args['hierarchical'] = false;
}
if ( is_user_logged_in() ) {
$comment_args['include_unapproved'] = array( get_current_user_id() );
} else {
$unapproved_email = wp_get_unapproved_comment_author_email();
if ( $unapproved_email ) {
$comment_args['include_unapproved'] = array( $unapproved_email );
}
}
$per_page = 0;
if ( get_option( 'page_comments' ) ) {
$per_page = (int) get_query_var( 'comments_per_page' );
if ( 0 === $per_page ) {
$per_page = (int) get_option( 'comments_per_page' );
}
$comment_args['number'] = $per_page;
$page = (int) get_query_var( 'cpage' );
if ( $page ) {
$comment_args['offset'] = ( $page - 1 ) * $per_page;
} elseif ( 'oldest' === get_option( 'default_comments_page' ) ) {
$comment_args['offset'] = 0;
} else {
$top_level_query = new WP_Comment_Query();
$top_level_args = array(
'count' => true,
'orderby' => false,
'post_id' => $post->ID,
'status' => 'approve',
);
if ( $comment_args['hierarchical'] ) {
$top_level_args['parent'] = 0;
}
if ( isset( $comment_args['include_unapproved'] ) ) {
$top_level_args['include_unapproved'] = $comment_args['include_unapproved'];
}
$top_level_args = apply_filters( 'comments_template_top_level_query_args', $top_level_args );
$top_level_count = $top_level_query->query( $top_level_args );
$comment_args['offset'] = ( (int) ceil( $top_level_count / $per_page ) - 1 ) * $per_page;
}
}
$comment_args = apply_filters( 'comments_template_query_args', $comment_args );
$comment_query = new WP_Comment_Query( $comment_args );
$_comments = $comment_query->comments;
if ( $comment_args['hierarchical'] ) {
$comments_flat = array();
foreach ( $_comments as $_comment ) {
$comments_flat[] = $_comment;
$comment_children = $_comment->get_children(
array(
'format' => 'flat',
'status' => $comment_args['status'],
'orderby' => $comment_args['orderby'],
)
);
foreach ( $comment_children as $comment_child ) {
$comments_flat[] = $comment_child;
}
}
} else {
$comments_flat = $_comments;
}
$wp_query->comments = apply_filters( 'comments_array', $comments_flat, $post->ID );
$comments = &$wp_query->comments;
$wp_query->comment_count = count( $wp_query->comments );
$wp_query->max_num_comment_pages = $comment_query->max_num_pages;
if ( $separate_comments ) {
$wp_query->comments_by_type = separate_comments( $comments );
} else {
$wp_query->comments_by_type = array();
}
$overridden_cpage = false;
if ( '' === get_query_var( 'cpage' ) && $wp_query->max_num_comment_pages > 1 ) {
set_query_var( 'cpage', 'newest' === get_option( 'default_comments_page' ) ? get_comment_pages_count() : 1 );
$overridden_cpage = true;
}
if ( ! defined( 'COMMENTS_TEMPLATE' ) ) {
define( 'COMMENTS_TEMPLATE', true );
}
$theme_template = trailingslashit( $wp_stylesheet_path ) . $file;
$include = apply_filters( 'comments_template', $theme_template );
if ( file_exists( $include ) ) {
require $include;
} elseif ( file_exists( trailingslashit( $wp_template_path ) . $file ) ) {
require trailingslashit( $wp_template_path ) . $file;
} else {
require ABSPATH . WPINC . '/theme-compat/comments.php';
}
}
Связанные функции
add_comment_meta()clean_comment_cache()comment_link()- и другие функции, связанные с комментариями.
Теперь, когда вы знаете о функции comments_template(), вы можете использовать её для управления отображением комментариев на ваших страницах и постах в WordPress!