Функция get_page_of_comment(): Определение номера страницы комментария.

## Функция get_page_of_comment() │ WP 2.7.0

### Описание

Функция get_page_of_comment() позволяет определить, на какой странице находится определённый комментарий при использовании пагинации (разбиения на страницы комментариев).

### Как используется

Эта функция используется, например, в функции get_comment_link(). Она может работать медленно, особенно при большом количестве комментариев.

### Возвращаемое значение

Функция возвращает:
- **int|null**: Номер страницы с комментарием или null, если произошла ошибка.

### Синтаксис

```php
get_page_of_comment( $comment_id, $args );

Параметры

  • $comment_id (int) (обязательный): ID комментария.
  • $args (array): Массив дополнительных параметров (по умолчанию — пустой массив).

Дополнительные параметры в $args:

  • type (string): Позволяет ограничить выборку комментариев заданным типом. Принимает значения:

    • 'comment' (коммент)
    • 'trackback' (треки)
    • 'pingback' (пинги)
    • 'pings' (треки и пинги)
    • 'all' (все, по умолчанию).
  • per_page (int): Количество комментариев на странице. По умолчанию — значение опции 'comments_per_page'.

  • max_depth (int|string): Определяет, для какого уровня комментариев будет вычисляться страница. Если больше 1, то будет определена страница для родительского комментария $comment_id. По умолчанию — значение опции 'thread_comments_depth'.

Примеры использования

Пример 1: Получение номера страницы с комментарием

echo get_page_of_comment( 11175 );
// Выводит: 5

Пример 2: Получение ссылки на комментарий

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

В данном случае номер страницы (int) 5 получен с помощью функции get_page_of_comment().

Заметки

  • Глобальная переменная: $wpdb — об��ект абстракции базы данных WordPress.

Изменения

  • Добавлена в версии 2.7.0.

Исходный код функции get_page_of_comment

Функция реализована в файле wp-includes/comment.php и выглядит следующим образом:

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;

    // Порядок приоритета: 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;
            }
        }

        // Находим родительский комментарий, если включены вложенные комментарии.
        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',
            'orderby'    => 'none',
            '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 );
            }
        }

        $comment_args = apply_filters( 'get_page_of_comment_query_args', $comment_args );

        $comment_query       = new WP_Comment_Query();
        $older_comment_count = $comment_query->query( $comment_args );

        // Нет старых комментариев? Значит, это страница #1.
        if ( 0 == $older_comment_count ) {
            $page = 1;
        } else {
            $page = (int) ceil( ( $older_comment_count + 1 ) / $args['per_page'] );
        }
    }

    return apply_filters( 'get_page_of_comment', (int) $page, $args, $original_args, $comment_id );
}

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

Пагинация комментариев

  • get_comment_pages_count()
  • get_comments_pagenum_link()
  • get_next_comments_link()
  • get_previous_comments_link()
  • get_the_comments_navigation()
  • paginate_comments_links()
  • the_comments_navigation()
  • the_comments_pagination()

Управление комментариями

  • cancel_comment_reply_link()
  • comment_author_email_link()
  • comment_form()
  • get_comment()
  • wp_delete_comment()
  • wp_insert_comment()

Эти функции помогут вам в управлении комментариями и их отображении на вашем сайте WordPress.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *