get_page_of_comment() WP 2.7.0

Отримує сторінку пагінації коментарів у фронт-енді, на якій має відображатися зазначений коментар.

Функція використовується під час створення посилання на поточний коментар: get_comment_link() , якщо в налаштуваннях обговорення стоїть налаштування “Розбивати коментарі верхнього рівня на сторінки по 10” (пагінація).

Функція робить запит у БД, де рахує всі батьківські коментарі поточного посту і поділяє результат на кількість коментарів на сторінці. Так виходить сторінка пагінації.

Якщо поточний коментар є дочірнім коментарем, то функцію буде викликати сама себе, доки не дійде до батьківського коментаря, потім буде здійснено операцію підрахунку номера сторінки.

Основа для:
get_comment_link()
1 раз – 0.005654 сек
(дуже повільно) | 50000 разів – 21.51 сек
(повільно)

Повертає

int|null. Номер сторінки коментаря або null за помилки.

Використання

get_page_of_comment( $comment_ID, $args )
$comment_ID
(число) (обов’язковий)
ID комменатрію.
$args
(масив)

Аргументи. За замовчуванням:

array(
	'type' => 'all',
	'page' => '',
	'per_page' => '',
	'max_depth' => ''
);

За замовчуванням: array()

Приклади

0

#1 Отримаємо номер сторінка пагінації коментаря

echo get_page_of_comment(11175);
// Виведе: 5
0

#2 Отримаємо посилання на коментар

За допомогою echo get_comment_link(11175);

echo get_comment_link(11175);
// виведе: http://example.com/hello-world/comment-page-5#comment-11175

// тут число 5 отримано за допомогою get_page_of_comment()

нотатки

  • Global. wpdb. $wpdb WordPress database abstraction object.

список змін

З версії 2.7.0Введено.

Код get_page_of_comment() WP 6.0.2

function get_page_of_comment( $comment_ID, $args = array() ) {
	Global $wpdb;

	$page = null;

	$comment = get_comment( $comment_ID );
	if ( ! $comment ) {
		return;
	}

	$defaults = array(
		'type' => 'all',
		'page' => '',
		'per_page' => '',
		'max_depth' => '',
	);
	$ args = wp_parse_args ($ args, $ defaults);
	$original_args = $args;

	// Order of precedence: 1. `$args['per_page']`, 2. 'comments_per_page' query_var, 3. 'comments_per_page' option.
	if ( get_option( 'page_comments' ) ) {
		if ( '' === $args['per_page'] ) {
			$args['per_page'] = get_query_var( 'comments_per_page' );
		}

		if ( '' === $args['per_page'] ) {
			$args['per_page'] = get_option( 'comments_per_page' );
		}
	}

	if ( empty( $args['per_page'] ) ) {
		$args['per_page'] = 0;
		$args['page'] = 0;
	}

	if ( $args['per_page'] < 1 ) {
		$page = 1;
	}

	if ( null === $page ) {
		if ( '' === $args['max_depth'] ) {
			if ( get_option( 'thread_comments' ) ) {
				$args['max_depth'] = get_option('thread_comments_depth');
			} else {
				$args['max_depth'] = -1;
			}
		}

		// Find this comment's top-level parent if threading is enabled.
		if ( $args['max_depth'] > 1 && 0 != $comment->comment_parent ) {
			return get_page_of_comment( $comment->comment_parent, $args );
		}

		$comment_args = array(
			'type' => $args['type'],
			'post_id' => $comment->comment_post_ID,
			'fields' => 'ids',
			'count' => true,
			'status' => 'approve',
			'parent' => 0,
			'date_query' => array(
				array(
					'column' => "$wpdb->comments.comment_date_gmt",
					'before' => $comment->comment_date_gmt,
				),
			),
		);

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

		/**
		 * Filters arguments використовується для пошуку коментарів в get_page_of_comment().
		 *
		 * @ Since 5.5.0
		 *
		 * @see WP_Comment_Query::__construct()
		 *
		 * @param array $comment_args {
		 * Array of WP_Comment_Query arguments.
		 *
		 * @type string $type Ліміт paginated comments до цього matching a given type.
		 * Accepts 'comment', 'trackback', 'pingback', 'pings'
		 * (Trackbacks and pingbacks), або 'all'. Default 'all'.
		 * @type int $post_id ID of the post.
		 * @type string $fields Comment fields to return.
		 * @type bool $count Whether to return comment count (true) or array
		 * of comment objects (false).
		 * @type string $status Comment status.
		 * @type int $parent Parent ID повідомлень про відшкодування children of.
		 * @type array $date_query Введіть терміни, які clauses to limit comments by. See WP_Date_Query.
		 * @type array $include_unapproved Array of IDs або email address whose unapproved comments
		 * will be included in paginated comments.
		 * }
		 */
		$comment_args = apply_filters( 'get_page_of_comment_query_args', $comment_args );

		$comment_query = новий WP_Comment_Query();
		$older_comment_count = $comment_query->query( $comment_args );

		// No older comments? Then it's page #1.
		if ( 0 == $older_comment_count ) {
			$page = 1;

			// Divide comments Очевидно, що це одне з повідомлень за page to get this comment's page number.
		} else {
			$page = ceil(( $older_comment_count + 1 ) / $args['per_page'] );
		}
	}

	/**
	 * Filters calculated page on which a comment appears.
	 *
	 * @ Since 4.4.0
	 * @since 4.7.0 Introduced the `$comment_ID` parameter.
	 *
	 * @param int $page Comment page.
	 * @param array $args {
	 * Arguments used to calculate pagination. Ці включають arguments auto-detected by the function,
	 * based on query vars, system settings, etc. Для певних arguments passed to the function,
	 * see `$original_args`.
	 *
	 * @type string $type Type of comments to count.
	 * @type int $page Calculated current page.
	 * @type int $per_page Calculated number of comments per page.
	 * @type int $max_depth Maximum comment threading depth allowed.
	 * }
	 * @param array $original_args {
	 * Array of arguments passed to the function. Один або всі вони не можуть бути налаштовані.
	 *
	 * @type string $type Type of comments to count.
	 * @type int $page Current comment page.
	 * @type int $per_page Кількість коментарів на сторінці.
	 * @type int $max_depth Maximum comment threading depth allowed.
	 * }
	 * @param int $comment_ID ID of the comment.
	 */
	return apply_filters( 'get_page_of_comment', (int) $page, $args, $original_args, $comment_ID );
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *