WordPress как на ладони
wordpress jino

comments_template() WP 1.5.0

Подгружает файл шаблона комментариев на старице записи. По умолчанию загружает файл: /comments.php из папки темы.

Ничего не выведет, если функция вызвана со страницы отличной от is_singular() или если у записи нет комментариев, или комментарии закрыты.

Если стандартный файл comments.php изменен, то функция может выводить что-либо, даже если комментирование закрыто, вывод во многом зависит от файла.

ВАЖНО. Функция делает важную операцию: получает комментарии из базы данных и записывает в глобальную переменную, для того, чтобы функция wp_list_comments() могла работать и выводила комментарии.

Если в теме нет файла /comments.php, то будет подключен дефолтный файл из ядра WordPress: /wp-includes/theme-compat/comments.php.

Использует глобальные переменные:

(bool)       $withcomments
(WP_Query)   $wp_query
(WP_Post)    $post
(wpdb)       $wpdb
(int)        $id
(WP_Comment) $comment
(string)     $user_login
(int)        $user_ID
(string)     $user_identity
(bool)       $overridden_cpage
Хуки из функции:

Использование

<?php comments_template( $file, $separate_comments ); ?>
$file(строка)
Подключаемый файл.
По умолчанию: '/comments.php'
$separate_comments(логический)
Нужно ли разделять комментарии по типу (комменты, пинги, трэкбэки).
По умолчанию: false

Примеры

#1. Базовое подключение комментариев в теме

<?php comments_template(); ?> 

#2. Подключение стороннего файла шаблона

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

В данном случае будет подключен файл: short-comments.php из каталога темы, вместо comments.php:

<?php comments_template( '/short-comments.php' ); ?>

Если нужно подключить файл из папки темы, то указываем путь до файла относительно папки темы:

<?php comments_template( '/templates/my-comments.php' ); ?>

#3. Изменение пути к файлу через фильтр

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;
	}

	// если это нужный нам тип записи book
	if( $post->post_type == 'book' ){
		return __DIR__ . '/reviews.php'; // полный путь до файла
	}
}

Код comments template: wp-includes/comment-template.php VER 4.9.2

<?php
function comments_template( $file = '/comments.php', $separate_comments = false ) {
	global $wp_query, $withcomments, $post, $wpdb, $id, $comment, $user_login, $user_ID, $user_identity, $overridden_cpage;

	if ( !(is_single() || is_page() || $withcomments) || empty($post) )
		return;

	if ( empty($file) )
		$file = '/comments.php';

	$req = get_option('require_name_email');

	/*
	 * Comment author information fetched from the comment cookies.
	 */
	$commenter = wp_get_current_commenter();

	/*
	 * The name of the current comment author escaped for use in attributes.
	 * Escaped by sanitize_comment_cookies().
	 */
	$comment_author = $commenter['comment_author'];

	/*
	 * The email address of the current comment author escaped for use in attributes.
	 * Escaped by sanitize_comment_cookies().
	 */
	$comment_author_email = $commenter['comment_author_email'];

	/*
	 * The url of the current comment author escaped for use in attributes.
	 */
	$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,
		'update_comment_meta_cache' => false, // We lazy-load comment meta for performance.
	);

	if ( get_option('thread_comments') ) {
		$comment_args['hierarchical'] = 'threaded';
	} else {
		$comment_args['hierarchical'] = false;
	}

	if ( $user_ID ) {
		$comment_args['include_unapproved'] = array( $user_ID );
	} elseif ( ! empty( $comment_author_email ) ) {
		$comment_args['include_unapproved'] = array( $comment_author_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 {
			// If fetching the first page of 'newest', we need a top-level comment count.
			$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_count = $top_level_query->query( $top_level_args );

			$comment_args['offset'] = ( ceil( $top_level_count / $per_page ) - 1 ) * $per_page;
		}
	}

	/**
	 * Filters the arguments used to query comments in comments_template().
	 *
	 * @since 4.5.0
	 *
	 * @see WP_Comment_Query::__construct()
	 *
	 * @param array $comment_args {
	 *     Array of WP_Comment_Query arguments.
	 *
	 *     @type string|array $orderby                   Field(s) to order by.
	 *     @type string       $order                     Order of results. Accepts 'ASC' or 'DESC'.
	 *     @type string       $status                    Comment status.
	 *     @type array        $include_unapproved        Array of IDs or email addresses whose unapproved comments
	 *                                                   will be included in results.
	 *     @type int          $post_id                   ID of the post.
	 *     @type bool         $no_found_rows             Whether to refrain from querying for found rows.
	 *     @type bool         $update_comment_meta_cache Whether to prime cache for comment meta.
	 *     @type bool|string  $hierarchical              Whether to query for comments hierarchically.
	 *     @type int          $offset                    Comment offset.
	 *     @type int          $number                    Number of comments to fetch.
	 * }
	 */
	$comment_args = apply_filters( 'comments_template_query_args', $comment_args );
	$comment_query = new WP_Comment_Query( $comment_args );
	$_comments = $comment_query->comments;

	// Trees must be flattened before they're passed to the walker.
	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;
	}

	/**
	 * Filters the comments array.
	 *
	 * @since 2.1.0
	 *
	 * @param array $comments Array of comments supplied to the comments template.
	 * @param int   $post_ID  Post ID.
	 */
	$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);
		$comments_by_type = &$wp_query->comments_by_type;
	} 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 = STYLESHEETPATH . $file;
	/**
	 * Filters the path to the theme template file used for the comments template.
	 *
	 * @since 1.5.1
	 *
	 * @param string $theme_template The path to the theme template file.
	 */
	$include = apply_filters( 'comments_template', $theme_template );
	if ( file_exists( $include ) )
		require( $include );
	elseif ( file_exists( TEMPLATEPATH . $file ) )
		require( TEMPLATEPATH . $file );
	else // Backward compat code will be removed in a future release
		require( ABSPATH . WPINC . '/theme-compat/comments.php');
}

Cвязанные функции

Из метки: comment (комментарии)

Еще из раздела: Подключение файлов темы

comments_template 8 комментариев
  • Влад

    Подскажите пожалуйста, а если я хочу создать свой вариант отображения формы комментариев, допустим в 2 колонки (1ая - поля имя, мэйл, кнопка комментировать, 2ая форма ввода комментария)ни где не могу найти на эту тему инфу! если это возможно сделать (а я думаю что это возможно) то напишите куда именно код вставлять в comments.php или function.php.Очекнь жду ответа! за ранее спасибо!

    3
    Ответить3.7 года назад #
  • Евгений cайт: blogozapis.ru @

    Здравствуйте. Хочу у Вас спросить. У меня не работает кнопка Ответить в комментариях. Не подскажете как можно сделать, чтобы он был рабочим. Спасибо большое.

    Ответить3 года назад #
    • Kama4711

      Подключите скрипт comment-reply. Для этого добавьте следующий код в functions.php:

      function my_scripts_method() {
      	wp_enqueue_script( 'comment-reply' );            
      }
      add_action( 'wp_enqueue_scripts', 'my_scripts_method' );
      2
      Ответить3 года назад #
  • Алексей cайт: ws-life.ru

    Здравствуйте! У меня небольшая проблемка. Когда человек на моем блоге нажимает на кнопку "Ответить" в комментариях, то страница перезагружается, а только потом можно написать какой либо комментарий. При нажатии "Отменить ответ" страница так же перезагружается. Не знаете как исправить? Дайте хоть какую-нибудь зацепку, я постараюсь найти и исправить.

    Ответить2.8 года назад #
    • Максим cайт: icopydoc.ru

      Вообще без перезагрузки страницы - это нужно смотреть в сторону аякса. Почитайте про эту технологию.

      Сейчас по ходу у вас кнопки ответа просто через get-запрос без аякса. Т.е. на разные кнопки ответа "повешены" разные ссылки с id юзера, которому даете ответ.

      -1
      Ответить2.8 года назад #
  • Дима

    Спасибо большое. 3 часа трахался и не мог понять, почему wp_list_comments ничерта не выдает. в кодексе об этом ни слова.

    Ответить2.5 года назад #
  • Максим12 cайт: literator.info

    Добрый день!
    Может кто подскажет, как сделать комментарии для рубрик Вордпресса. Может плагин и какой-то прием есть малоизвестный. Никакой информации в инете не нашел.

    Ответить1.5 года назад #
    • campusboy2375 cайт: www.youtube.com/c/wpplus

      Привет!

      Никакой информации в инете не нашел.

      Ну потому что никому не нужен этот секс. Рубрика ведь для других целей создаётся. Если кому-то надо комменты и похожая структура по рубрикам, то делают Страницу и подстраницы, тогда это всё легко делается.

      Проблема в том, что в базе в таблице wp_comments каждый комментарий в ячейке comment_post_ID помечается к какому посту/странице относится. У рубрик свои ID, у материалов другие. В итоге, если туда вписать ID рубрики под номер 5, то комменты выведуться для записи под ID 5. Но не рубрики! Это всё образно я говорю.

      Отсюда из первых решений, что приходит на ум, это сделать страницы/записи, сделать их скрытыми или оставить в черновиках, главное чтоб в базе они появились, и указать функции добавлении комментариев, что если рубрика с ID 5 (Например, книги), то добавлять комментарий к записи с ID 235 (которая на сайте нигде и не отображается). И считывать комменты по тому же принципу.

      Ну и второй способ просто накатать функцию, которая будет в кастомную таблицу базы записывать ID рубрики и другую инфу, что вводит пользователь.

      1
      Ответить1.5 года назад #

Здравствуйте, !

Ваш комментарий
Предпросмотр