bbp_has_replies( array $args = array() )
The main reply loop. WordPress makes this easy for us
Description Description
Parameters Parameters
- $args
-
(Optional) All the arguments supported by WP_Query
Default value: array()
Return Return
(object) Multidimensional array of reply information
Source Source
File: includes/replies/template.php
function bbp_has_replies( $args = array() ) {
/** Defaults **************************************************************/
// Other defaults
$default_reply_search = bbp_sanitize_search_request( 'rs' );
$default_post_parent = ( bbp_is_single_topic() ) ? bbp_get_topic_id() : 'any';
$default_post_type = ( bbp_is_single_topic() && bbp_show_lead_topic() ) ? bbp_get_reply_post_type() : array( bbp_get_topic_post_type(), bbp_get_reply_post_type() );
$default_thread_replies = (bool) ( bbp_is_single_topic() && bbp_thread_replies() );
// Default query args
$default = array(
'post_type' => $default_post_type, // Only replies
'post_parent' => $default_post_parent, // Of this topic
'posts_per_page' => bbp_get_replies_per_page(), // This many
'paged' => bbp_get_paged(), // On this page
'orderby' => 'date', // Sorted by date
'order' => 'ASC', // Oldest to newest
'hierarchical' => $default_thread_replies, // Hierarchical replies
'ignore_sticky_posts' => true, // Stickies not supported
'update_post_term_cache' => false, // No terms to cache
// Conditionally prime the cache for all related posts
'update_post_family_cache' => true
);
// Only add 's' arg if searching for replies
// See https://bbpress.trac.wordpress.org/ticket/2607
if ( ! empty( $default_reply_search ) ) {
$default['s'] = $default_reply_search;
}
// What are the default allowed statuses (based on user caps)
if ( bbp_get_view_all( 'edit_others_replies' ) ) {
// Default view=all statuses
$post_statuses = array_keys( bbp_get_topic_statuses() );
// Add support for private status
if ( current_user_can( 'read_private_replies' ) ) {
$post_statuses[] = bbp_get_private_status_id();
}
// Join post statuses together
$default['post_status'] = $post_statuses;
// Lean on the 'perm' query var value of 'readable' to provide statuses
} else {
$default['perm'] = 'readable';
}
/** Setup *****************************************************************/
// Parse arguments against default values
$r = bbp_parse_args( $args, $default, 'has_replies' );
// Set posts_per_page value if replies are threaded
$replies_per_page = (int) $r['posts_per_page'];
if ( true === $r['hierarchical'] ) {
$r['posts_per_page'] = -1;
}
// Get bbPress
$bbp = bbpress();
// Call the query
$bbp->reply_query = new WP_Query( $r );
// Maybe prime the post author caches
if ( ! empty( $r['update_post_family_cache'] ) ) {
bbp_update_post_family_caches( $bbp->reply_query->posts );
}
// Add pagination values to query object
$bbp->reply_query->posts_per_page = (int) $replies_per_page;
$bbp->reply_query->paged = (int) $r['paged'];
// Never home, regardless of what parse_query says
$bbp->reply_query->is_home = false;
// Reset is_single if single topic
if ( bbp_is_single_topic() ) {
$bbp->reply_query->is_single = true;
}
// Only add reply to if query returned results
if ( ! empty( $bbp->reply_query->found_posts ) ) {
// Get reply to for each reply
foreach ( $bbp->reply_query->posts as &$post ) {
// Check for reply post type
if ( bbp_get_reply_post_type() === $post->post_type ) {
$reply_to = bbp_get_reply_to( $post->ID );
// Make sure it's a reply to a reply
if ( empty( $reply_to ) || ( bbp_get_reply_topic_id( $post->ID ) === $reply_to ) ) {
$reply_to = 0;
}
// Add reply_to to the post object so we can walk it later
$post->reply_to = $reply_to;
}
}
}
// Only add pagination if query returned results
if ( ! empty( $bbp->reply_query->found_posts ) && ! empty( $bbp->reply_query->posts_per_page ) ) {
// Figure out total pages
if ( true === $r['hierarchical'] ) {
$walker = new BBP_Walker_Reply();
$total_pages = ceil( $walker->get_number_of_root_elements( $bbp->reply_query->posts ) / $bbp->reply_query->posts_per_page );
} else {
// Total for pagination boundaries
$total_pages = ( $bbp->reply_query->posts_per_page === $bbp->reply_query->found_posts )
? 1
: ceil( $bbp->reply_query->found_posts / $bbp->reply_query->posts_per_page );
// Pagination settings with filter
$bbp_replies_pagination = apply_filters( 'bbp_replies_pagination', array(
'base' => bbp_get_replies_pagination_base( bbp_get_topic_id() ),
'total' => $total_pages,
'current' => $bbp->reply_query->paged
) );
// Add pagination to query object
$bbp->reply_query->pagination_links = bbp_paginate_links( $bbp_replies_pagination );
}
}
// Filter & return
return apply_filters( 'bbp_has_replies', $bbp->reply_query->have_posts(), $bbp->reply_query );
}
Changelog Changelog
| Version | Description |
|---|---|
| 2.0.0 | Introduced. |