Skip to:
Content
Pages
Categories
Search
Top
Bottom

bbpress Loop Argument

  • @babblebey

    Participant

    Hello there,

    Thank you for viewing this thread.

    I have a sidebar on the Homepage of my website that should list latest forum topics. But the number of topics listed is being determined by the “number of topics” set per-page in the “Forum Settings”.

    Is there a way to setup an argument($args) similarly to that of the new WP_Query($args) to set a custom of topics per-page.?

    Here’s my query:

    
    <!--Sidebar Start-->
                <div class="col-md-4">
                          <div class="sidebar-topics row sticky-top">
                              <div class="col-md-12 col-sm-12 col-12 ml-2 mb-2 p-1">
                                    <h3 class="">Latest Forum Topic</h3>
                              </div>
                              <div class="col-md-12 col-sm-12 col-12">
                            <?php
                                if ( bbp_has_topics() ):
                                    while ( bbp_topics() ) : bbp_the_topic();
                                        get_template_part( 'template-parts/topic', 'card' );
                                    endwhile;
                                endif;
                              ?>
                            </div>
                      </div>
                </div>
    <!--Sidebar Ends-->
    
Viewing 6 replies - 1 through 6 (of 6 total)
  • @robin-w

    Moderator

    given that

    get_template_part( ‘template-parts/topic’, ‘card’ );

    is from your theme (or other plugin) not bbpress, not sure what is taking the pagination.

    the usual solution would be to parse args eg

    add_filter ('bbp_before_has_topics_parse_args', rew_has_topics') ;
    
    function rew_has_topics( $args = '' ) {
    	$args['posts_per_page'] = '-1' ;
    return $args;
    }

    @babblebey

    Participant

    The Post Per Page as its been set up from the “Forum Setting”:

    screenshot-localhost-2019-11-01-17-53-12

    Works as it should, i.e dictate the number of topics to display per Single Forum Page:

    screenshot-localhost-2019-11-01-17-50-24

    But the same setting is inturn affecting my custom loop I have placed on my HomePage Sticky Sidebar to display latest topics:

    screenshot-localhost-2019-11-01-17-56-53

    I want something similar to the ` $args = array(‘posts_per_page’ => 10 //my custom number) as its being used in the normal WP Post Loop like this below:


    <?php $args = array(
    ‘posts_per_page’ => 10 // Like this one here
    );
    $posts = new WP_Query($args);
    if ($posts->have_posts()):
    while($posts->have_posts()): $posts->the_post();
    get_template_part( ‘template-parts/content’, get_post_format() );
    endwhile;
    endif;
    wp_reset_postdata(); ?>
    `

    @robin-w

    Moderator

    I’d be tempted to just clone the bbp_has_topics function

    eg

    add this to your functions file

    function babblebey_has_topics( $args = '' ) {
    	global $wp_rewrite;
    
    	/** Defaults **************************************************************/
    
    	// Other defaults
    	$default_topic_search  = !empty( $_REQUEST['ts'] ) ? $_REQUEST['ts'] : false;
    	$default_show_stickies = (bool) ( bbp_is_single_forum() || bbp_is_topic_archive() ) && ( false === $default_topic_search );
    	$default_post_parent   = bbp_is_single_forum() ? bbp_get_forum_id() : 'any';
    
    	// Default argument array
    	$default = array(
    		'post_type'      => bbp_get_topic_post_type(), // Narrow query down to bbPress topics
    		'post_parent'    => $default_post_parent,      // Forum ID
    		'meta_key'       => '_bbp_last_active_time',   // Make sure topic has some last activity time
    		'orderby'        => 'meta_value',              // 'meta_value', 'author', 'date', 'title', 'modified', 'parent', rand',
    		'order'          => 'DESC',                    // 'ASC', 'DESC'
    		'posts_per_page' => -1, 						// Topics per page
    		'paged'          => bbp_get_paged(),           // Page Number
    		's'              => $default_topic_search,     // Topic Search
    		'show_stickies'  => $default_show_stickies,    // Ignore sticky topics?
    		'max_num_pages'  => false,                     // Maximum number of pages to show
    	);
    
    	// What are the default allowed statuses (based on user caps)
    	if ( bbp_get_view_all() ) {
    
    		// Default view=all statuses
    		$post_statuses = array(
    			bbp_get_public_status_id(),
    			bbp_get_closed_status_id(),
    			bbp_get_spam_status_id(),
    			bbp_get_trash_status_id()
    		);
    
    		// Add support for private status
    		if ( current_user_can( 'read_private_topics' ) ) {
    			$post_statuses[] = bbp_get_private_status_id();
    		}
    
    		// Join post statuses together
    		$default['post_status'] = implode( ',', $post_statuses );
    
    	// Lean on the 'perm' query var value of 'readable' to provide statuses
    	} else {
    		$default['perm'] = 'readable';
    	}
    
    	// Maybe query for topic tags
    	if ( bbp_is_topic_tag() ) {
    		$default['term']     = bbp_get_topic_tag_slug();
    		$default['taxonomy'] = bbp_get_topic_tag_tax_id();
    	}
    
    	/** Setup *****************************************************************/
    
    	// Parse arguments against default values
    	$r = bbp_parse_args( $args, $default, 'babblebey_topics' );
    
    	// Get bbPress
    	$bbp = bbpress();
    
    	// Call the query
    	$bbp->topic_query = new WP_Query( $r );
    
    	// Set post_parent back to 0 if originally set to 'any'
    	if ( 'any' === $r['post_parent'] )
    		$r['post_parent'] = 0;
    
    	// Limited the number of pages shown
    	if ( !empty( $r['max_num_pages'] ) )
    		$bbp->topic_query->max_num_pages = $r['max_num_pages'];
    
    	/** Stickies **************************************************************/
    
    	// Put sticky posts at the top of the posts array
    	if ( !empty( $r['show_stickies'] ) && $r['paged'] <= 1 ) {
    
    		// Get super stickies and stickies in this forum
    		$stickies = bbp_get_super_stickies();
    
    		// Get stickies for current forum
    		if ( !empty( $r['post_parent'] ) ) {
    			$stickies = array_merge( $stickies, bbp_get_stickies( $r['post_parent'] ) );
    		}
    
    		// Remove any duplicate stickies
    		$stickies = array_unique( $stickies );
    
    		// We have stickies
    		if ( is_array( $stickies ) && !empty( $stickies ) ) {
    
    			// Start the offset at -1 so first sticky is at correct 0 offset
    			$sticky_offset = -1;
    
    			// Loop over topics and relocate stickies to the front.
    			foreach ( $stickies as $sticky_index => $sticky_ID ) {
    
    				// Get the post offset from the posts array
    				$post_offsets = wp_filter_object_list( $bbp->topic_query->posts, array( 'ID' => $sticky_ID ), 'OR', 'ID' );
    
    				// Continue if no post offsets
    				if ( empty( $post_offsets ) ) {
    					continue;
    				}
    
    				// Loop over posts in current query and splice them into position
    				foreach ( array_keys( $post_offsets ) as $post_offset ) {
    					$sticky_offset++;
    
    					$sticky = $bbp->topic_query->posts[$post_offset];
    
    					// Remove sticky from current position
    					array_splice( $bbp->topic_query->posts, $post_offset, 1 );
    
    					// Move to front, after other stickies
    					array_splice( $bbp->topic_query->posts, $sticky_offset, 0, array( $sticky ) );
    
    					// Cleanup
    					unset( $stickies[$sticky_index] );
    					unset( $sticky );
    				}
    
    				// Cleanup
    				unset( $post_offsets );
    			}
    
    			// Cleanup
    			unset( $sticky_offset );
    
    			// If any posts have been excluded specifically, Ignore those that are sticky.
    			if ( !empty( $stickies ) && !empty( $r['post__not_in'] ) ) {
    				$stickies = array_diff( $stickies, $r['post__not_in'] );
    			}
    
    			// Fetch sticky posts that weren't in the query results
    			if ( !empty( $stickies ) ) {
    
    				// Query to use in get_posts to get sticky posts
    				$sticky_query = array(
    					'post_type'   => bbp_get_topic_post_type(),
    					'post_parent' => 'any',
    					'meta_key'    => '_bbp_last_active_time',
    					'orderby'     => 'meta_value',
    					'order'       => 'DESC',
    					'include'     => $stickies
    				);
    
    				// Cleanup
    				unset( $stickies );
    
    				// Conditionally exclude private/hidden forum ID's
    				$exclude_forum_ids = bbp_exclude_forum_ids( 'array' );
    				if ( ! empty( $exclude_forum_ids ) ) {
    					$sticky_query['post_parent__not_in'] = $exclude_forum_ids;
    				}
    
    				// What are the default allowed statuses (based on user caps)
    				if ( bbp_get_view_all() ) {
    					$sticky_query['post_status'] = $r['post_status'];
    
    				// Lean on the 'perm' query var value of 'readable' to provide statuses
    				} else {
    					$sticky_query['post_status'] = $r['perm'];
    				}
    
    				// Get all stickies
    				$sticky_posts = get_posts( $sticky_query );
    				if ( !empty( $sticky_posts ) ) {
    
    					// Get a count of the visible stickies
    					$sticky_count = count( $sticky_posts );
    
    					// Merge the stickies topics with the query topics .
    					$bbp->topic_query->posts       = array_merge( $sticky_posts, $bbp->topic_query->posts );
    
    					// Adjust loop and counts for new sticky positions
    					$bbp->topic_query->found_posts = (int) $bbp->topic_query->found_posts + (int) $sticky_count;
    					$bbp->topic_query->post_count  = (int) $bbp->topic_query->post_count  + (int) $sticky_count;
    
    					// Cleanup
    					unset( $sticky_posts );
    				}
    			}
    		}
    	}
    
    	// If no limit to posts per page, set it to the current post_count
    	if ( -1 === $r['posts_per_page'] )
    		$r['posts_per_page'] = $bbp->topic_query->post_count;
    
    	// Add pagination values to query object
    	$bbp->topic_query->posts_per_page = $r['posts_per_page'];
    	$bbp->topic_query->paged          = $r['paged'];
    
    	// Only add pagination if query returned results
    	if ( ( (int) $bbp->topic_query->post_count || (int) $bbp->topic_query->found_posts ) && (int) $bbp->topic_query->posts_per_page ) {
    
    		// Limit the number of topics shown based on maximum allowed pages
    		if ( ( !empty( $r['max_num_pages'] ) ) && $bbp->topic_query->found_posts > $bbp->topic_query->max_num_pages * $bbp->topic_query->post_count )
    			$bbp->topic_query->found_posts = $bbp->topic_query->max_num_pages * $bbp->topic_query->post_count;
    
    		// If pretty permalinks are enabled, make our pagination pretty
    		if ( $wp_rewrite->using_permalinks() ) {
    
    			// User's topics
    			if ( bbp_is_single_user_topics() ) {
    				$base = bbp_get_user_topics_created_url( bbp_get_displayed_user_id() );
    
    			// User's favorites
    			} elseif ( bbp_is_favorites() ) {
    				$base = bbp_get_favorites_permalink( bbp_get_displayed_user_id() );
    
    			// User's subscriptions
    			} elseif ( bbp_is_subscriptions() ) {
    				$base = bbp_get_subscriptions_permalink( bbp_get_displayed_user_id() );
    
    			// Root profile page
    			} elseif ( bbp_is_single_user() ) {
    				$base = bbp_get_user_profile_url( bbp_get_displayed_user_id() );
    
    			// View
    			} elseif ( bbp_is_single_view() ) {
    				$base = bbp_get_view_url();
    
    			// Topic tag
    			} elseif ( bbp_is_topic_tag() ) {
    				$base = bbp_get_topic_tag_link();
    
    			// Page or single post
    			} elseif ( is_page() || is_single() ) {
    				$base = get_permalink();
    
    			// Forum archive
    			} elseif ( bbp_is_forum_archive() ) {
    				$base = bbp_get_forums_url();
    
    			// Topic archive
    			} elseif ( bbp_is_topic_archive() ) {
    				$base = bbp_get_topics_url();
    
    			// Default
    			} else {
    				$base = get_permalink( (int) $r['post_parent'] );
    			}
    
    			// Use pagination base
    			$base = trailingslashit( $base ) . user_trailingslashit( $wp_rewrite->pagination_base . '/%#%/' );
    
    		// Unpretty pagination
    		} else {
    			$base = add_query_arg( 'paged', '%#%' );
    		}
    
    		// Pagination settings with filter
    		$bbp_topic_pagination = apply_filters( 'bbp_topic_pagination', array (
    			'base'      => $base,
    			'format'    => '',
    			'total'     => $r['posts_per_page'] === $bbp->topic_query->found_posts ? 1 : ceil( (int) $bbp->topic_query->found_posts / (int) $r['posts_per_page'] ),
    			'current'   => (int) $bbp->topic_query->paged,
    			'prev_text' => is_rtl() ? '&rarr;' : '&larr;',
    			'next_text' => is_rtl() ? '&larr;' : '&rarr;',
    			'mid_size'  => 1
    		) );
    
    		// Add pagination to query object
    		$bbp->topic_query->pagination_links = paginate_links( $bbp_topic_pagination );
    
    		// Remove first page from pagination
    		$bbp->topic_query->pagination_links = str_replace( $wp_rewrite->pagination_base . "/1/'", "'", $bbp->topic_query->pagination_links );
    	}
    
    	// Return object
    	return apply_filters( 'babblebey_has_topics', $bbp->topic_query->have_posts(), $bbp->topic_query );
    }

    which is just bbp_has_topics’ renamed with pagination changed to -1

    and then call that

    @babblebey

    Participant

    So I will be calling babblebey_has_topics() ?????? Please see as stated below too

    
    <!--Sidebar Start-->
                <div class="col-md-4">
                          <div class="sidebar-topics row sticky-top">
                              <div class="col-md-12 col-sm-12 col-12 ml-2 mb-2 p-1">
                                    <h3 class="">Latest Forum Topic</h3>
                              </div>
                              <div class="col-md-12 col-sm-12 col-12">
                            <?php
                                if ( babblebey_has_topics() ):
                                    while ( babblebey_topics() ) : babblebey_the_topic();
                                        get_template_part( 'template-parts/topic', 'card' );
                                    endwhile;
                                endif;
                              ?>
                            </div>
                      </div>
                </div>
    <!--Sidebar Ends-->
    

    @babblebey

    Participant

    Thank you once again, Robin

    <?php
    if ( babblebey_has_topics() ):
        while ( bbp_topics() ) : bbp_the_topic();
            get_template_part( 'template-parts/topic', 'card' );
        endwhile;
    endif;
    ?>

    I used it like that

    @robin-w

    Moderator

    great – glad it worked !!

Viewing 6 replies - 1 through 6 (of 6 total)
  • You must be logged in to reply to this topic.
Skip to toolbar