WordPress.org

Make WordPress Core


Ignore:
Timestamp:
01/03/2016 02:02:59 AM (4 years ago)
Author:
boonebgorges
Message:

Ensure that non-default pagination values work in wp_list_comments().

Prior to 4.4, it was possible to pass 'page' and 'per_page' values to
wp_list_comments() that do not match the corresponding global query vars.
This ability was lost in 4.4 with the refactor of how comments_template()
queries for comments; when the main comment query started fetching only the
comments that ought to appear on a page, instead of all of a post's comments,
it became impossible for the comment walker to select comments corresponding to
custom pagination parameters. See #8071.

We restore the previous behavior by (a) detecting when a 'page' or 'per_page'
parameter has been passed to wp_list_comments() that does not match the
corresponding query vars (so that the desired comments will not be found in
$wp_query), and if so, then (b) querying for all of the post's comments and
passing them to the comment walker for pagination, as was the case before 4.4.

Props boonebgorges, smerriman.
Fixes #35175.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/comment-template.php

    r36074 r36157  
    18761876     */
    18771877    $r = apply_filters( 'wp_list_comments_args', $r );
     1878
     1879    /*
     1880     * If 'page' or 'per_page' has been passed, and does not match what's in $wp_query,
     1881     * perform a separate comment query and allow Walker_Comment to paginate.
     1882     */
     1883    if ( is_singular() && ( $r['page'] || $r['per_page'] ) ) {
     1884        $current_cpage = get_query_var( 'cpage' );
     1885        if ( ! $current_cpage ) {
     1886            $current_cpage = 'newest' === get_option( 'default_comments_page' ) ? 1 : $wp_query->max_num_comment_pages;
     1887        }
     1888
     1889        $current_per_page = get_query_var( 'comments_per_page' );
     1890        if ( $r['page'] != $current_cpage || $r['per_page'] != $current_per_page ) {
     1891            $comments = get_comments( array(
     1892                'post_id' => get_queried_object_id(),
     1893                'orderby' => 'comment_date_gmt',
     1894                'order' => 'ASC',
     1895                'status' => 'all',
     1896            ) );
     1897        }
     1898    }
    18781899
    18791900    // Figure out what comments we'll be looping through ($_comments)
Note: See TracChangeset for help on using the changeset viewer.