get_page_of_comment() │ WP 2.7.0 Отримує сторінку пагінації коментарів у фронт-енді, на якій має відображатися зазначений коментар.
Функція використовується під час створення посилання на поточний коментар: get_comment_link() , якщо в налаштуваннях обговорення стоїть налаштування “Розбивати коментарі верхнього рівня на сторінки по 10” (пагінація).
Функція робить запит у БД, де рахує всі батьківські коментарі поточного посту і поділяє результат на кількість коментарів на сторінці. Так виходить сторінка пагінації.
Якщо поточний коментар є дочірнім коментарем, то функцію буде викликати сама себе, доки не дійде до батьківського коментаря, потім буде здійснено операцію підрахунку номера сторінки.
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()
Приклади #1 Отримаємо номер сторінка пагінації коментаря echo get_page_of_comment(11175);
// Виведе: 5 #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. список змін Код get_page_of_comment() 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 );
} Зв’язані функції