Skip to:
Content

bbPress.org

Changeset 4769


Ignore:
Timestamp:
02/19/2013 12:04:53 AM (9 years ago)
Author:
johnjamesjacoby
Message:

BuddyPress Groups:

  • Simplify group forum display logic.
  • Use bbp_has_ functions to preload posts. Reduces overhead of calling get_posts() and then creating new WP_Query() object later.
  • Use bbPress's front-end nonce verification logic to avoid wp_die'ing theme-side.
  • When editing a BuddyPress group's forum settings, allow network administrators to modify the group connection.
  • Fixes #2201, #2202.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/includes/extend/buddypress/group.php

    r4746 r4769  
    4545    private function setup_variables() {
    4646
    47         // Name and slug
     47        // Component Name
    4848        $this->name          = __( 'Forum', 'bbpress' );
    4949        $this->nav_item_name = __( 'Forum', 'bbpress' );
     50
     51        // Component slugs (hardcoded to match bbPress 1.x functionality)
    5052        $this->slug          = 'forum';
    5153        $this->topic_slug    = 'topic';
     
    238240    public function edit_screen() {
    239241
     242        $forum_ids    = bbp_get_group_forum_ids( bp_get_new_group_id() );
     243
     244        if ( !empty( $forum_ids ) )
     245            $forum_id = (int) is_array( $forum_ids ) ? $forum_ids[0] : $forum_ids;
     246
    240247        $checked = bp_get_new_group_enable_forum() || bp_group_is_forum_enabled( bp_get_group_id() ); ?>
    241248
    242         <h4><?php _e( 'Enable Group Forum', 'bbpress' ); ?></h4>
    243 
    244         <p><?php _e( 'Create a discussion forum to allow members of this group to communicate in a structured, bulletin-board style fashion.', 'bbpress' ); ?></p>
    245 
    246         <div class="checkbox">
    247             <label><input type="checkbox" name="bbp-edit-group-forum" id="bbp-edit-group-forum" value="1"<?php checked( $checked ); ?> /> <?php _e( 'Yes. I want this group to have a forum.', 'bbpress' ); ?></label>
    248         </div>
    249 
    250         <p class="description"><?php _e( 'Saying no will not delete existing forum content.', 'bbpress' ); ?></p>
    251 
    252         <input type="submit" value="<?php esc_attr_e( 'Save Settings', 'bbpress' ); ?>" />
     249        <h4><?php _e( 'Group Forum Settings', 'bbpress' ); ?></h4>
     250
     251        <fieldset>
     252            <legend class="screen-reader-text"><?php _e( 'Group Forum Settings', 'bbpress' ); ?></legend>
     253            <p><?php _e( 'Create a discussion forum to allow members of this group to communicate in a structured, bulletin-board style fashion.', 'bbpress' ); ?></p>
     254
     255            <div class="field-group">
     256                <div class="checkbox">
     257                    <label><input type="checkbox" name="bbp-edit-group-forum" id="bbp-edit-group-forum" value="1"<?php checked( $checked ); ?> /> <?php _e( 'Yes. I want this group to have a forum.', 'bbpress' ); ?></label>
     258                </div>
     259
     260                <p class="description"><?php _e( 'Saying no will not delete existing forum content.', 'bbpress' ); ?></p>
     261            </div>
     262
     263            <?php if ( is_super_admin() ) : ?>
     264                <div class="field-group">
     265                    <label for="bbp_group_forum_id"><?php _e( 'Group Forum:', 'bbpress' ); ?></label>
     266                    <?php
     267                        bbp_dropdown( array(
     268                            'select_id' => 'bbp_group_forum_id',
     269                            'show_none' => __( '(No Forum)', 'bbpress' ),
     270                            'selected'  => $forum_id
     271                        ) );
     272                    ?>
     273                    <p class="description"><?php _e( 'Network administrators can reconfigure which forum belongs to this group.', 'bbpress' ); ?></p>
     274                </div>
     275            <?php endif; ?>
     276
     277            <input type="submit" value="<?php esc_attr_e( 'Save Settings', 'bbpress' ); ?>" />
     278        </fieldset>
    253279
    254280        <?php
     
    271297            return;
    272298
    273         check_admin_referer( 'groups_edit_save_' . $this->slug );
     299        // Nonce check
     300        if ( ! bbp_verify_nonce_request( 'groups_edit_save_' . $this->slug ) ) {
     301            bbp_add_error( 'bbp_edit_group_forum_screen_save', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
     302            return;
     303        }
    274304
    275305        $edit_forum   = !empty( $_POST['bbp-edit-group-forum'] ) ? true : false;
    276306        $forum_id     = 0;
    277307        $group_id     = bp_get_current_group_id();
    278         $forum_ids    = array_values( bbp_get_group_forum_ids( $group_id ) );
     308
     309        // Super admins have the ability to reconfigure forums
     310        if ( is_super_admin() ) {
     311            $forum_ids = ! empty( $_POST['bbp_group_forum_id'] ) ? (array) (int) $_POST['bbp_group_forum_id'] : array();
     312
     313        // Use the existing forum IDs
     314        } else {
     315            $forum_ids = array_values( bbp_get_group_forum_ids( $group_id ) );
     316        }
    279317
    280318        // Normalize group forum relationships now
     
    297335            $forum_id = (int) ( is_array( $forum_ids ) ? $forum_ids[0] : $forum_ids );
    298336        }
     337
     338        // Update the group ID and forum ID relationships
     339        bbp_update_group_forum_ids( $group_id, (array) $forum_ids );
     340        bbp_update_forum_group_ids( $forum_id, (array) $group_id  );
    299341
    300342        // Update the group forum setting
     
    370412    public function create_screen_save() {
    371413
    372         check_admin_referer( 'groups_create_save_' . $this->slug );
     414        // Nonce check
     415        if ( ! bbp_verify_nonce_request( 'groups_create_save_' . $this->slug ) ) {
     416            bbp_add_error( 'bbp_create_group_forum_screen_save', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
     417            return;
     418        }
    373419
    374420        $create_forum = !empty( $_POST['bbp-create-group-forum'] ) ? true : false;
     
    537583     * Output the forums for a group in the edit screens
    538584     *
     585     * As of right now, bbPress only supports 1-to-1 group forum relationships.
     586     * In the future, many-to-many should be allowed.
     587     *
    539588     * @since bbPress (r3653)
    540589     * @uses bp_get_current_group_id()
     
    544593     */
    545594    public function display_forums( $offset = 0 ) {
     595        global $wp_query;
    546596
    547597        // Allow actions immediately before group forum output
     
    551601        $bbp = bbpress();
    552602
     603        /** Query Resets ******************************************************/
     604
    553605        // Forum data
    554         $forum_slug = bp_action_variable( $offset );
    555         $forum_ids  = bbp_get_group_forum_ids( bp_get_current_group_id() );
    556         $forum_args = array( 'post__in' => $forum_ids, 'post_parent' => null );
    557 
    558         // Unset global queries
    559         $bbp->forum_query = new stdClass;
    560         $bbp->topic_query = new stdClass;
    561         $bbp->reply_query = new stdClass;
    562 
    563         // Unset global ID's
    564         $bbp->current_forum_id     = 0;
    565         $bbp->current_topic_id     = 0;
    566         $bbp->current_reply_id     = 0;
    567         $bbp->current_topic_tag_id = 0;
    568 
    569         // Reset the post data
    570         wp_reset_postdata();
    571 
    572         // Allow admins special views
    573         $post_status = array( bbp_get_closed_status_id(), bbp_get_public_status_id() );
    574         if ( is_super_admin() || current_user_can( 'moderate' ) || bp_is_item_admin() || bp_is_item_mod() )
    575             $post_status = array_merge( $post_status, array( bbp_get_spam_status_id(), bbp_get_trash_status_id() ) ); ?>
     606        $forum_action = bp_action_variable( $offset );
     607        $forum_id     = array_shift( bbp_get_group_forum_ids( bp_get_current_group_id() ) );
     608
     609        // Always load up the group forum
     610        bbp_has_forums( array(
     611            'ID'          => $forum_id,
     612            'post_parent' => null
     613        ) );
     614
     615        // Set the global forum ID
     616        $bbp->current_forum_id = $forum_id;
     617
     618        // Assume forum query
     619        bbp_set_query_name( 'bbp_single_forum' ); ?>
    576620
    577621        <div id="bbpress-forums">
    578622
    579             <?php
    580 
    581             // Looking at the group forum root
    582             if ( empty( $forum_slug ) || ( 'page' == $forum_slug ) ) :
    583 
    584                 // Query forums and show them if they exist
    585                 if ( !empty( $forum_ids ) && bbp_has_forums( $forum_args ) ) :
    586 
    587                     // Only one forum found
    588                     if ( 1 == $bbp->forum_query->post_count ) :
    589 
    590                         // Remove 'name' check for paginated requests
    591                         if ( 'page' == $forum_slug ) {
    592                             $forum_args = array( 'post_type' => bbp_get_forum_post_type() );
    593                         } else {
    594                             $forum_args = array( 'name' => $forum_slug, 'post_type' => bbp_get_forum_post_type() );
    595                         }
    596 
    597                         // Get the forums
    598                         $forums = get_posts( $forum_args );
    599 
    600                         bbp_the_forum();
    601 
    602                         // Forum exists
    603                         if ( !empty( $forums ) ) :
    604                             $forum = $forums[0];
    605 
    606                             // Set up forum data
    607                             bbpress()->current_forum_id = $forum->ID;
    608                             bbp_set_query_name( 'bbp_single_forum' ); ?>
    609 
    610                             <h3><?php bbp_forum_title(); ?></h3>
    611 
    612                             <?php bbp_get_template_part( 'content', 'single-forum' ); ?>
    613 
    614                         <?php else : ?>
    615 
    616                             <?php bbp_get_template_part( 'feedback',   'no-topics' ); ?>
    617 
    618                             <?php bbp_get_template_part( 'form',       'topic'     ); ?>
    619 
    620                         <?php endif;
    621 
    622                     // More than 1 forum found or group forum admin screen
    623                     elseif ( 1 < $bbp->forum_query->post_count ) : ?>
    624 
    625                         <h3><?php _e( 'Forums', 'bbpress' ); ?></h3>
    626 
    627                         <?php bbp_get_template_part( 'loop', 'forums' ); ?>
    628 
    629                         <h3><?php _e( 'Topics', 'bbpress' ); ?></h3>
    630 
    631                         <?php if ( bbp_has_topics( array( 'post_parent__in' => $forum_ids ) ) ) : ?>
    632 
    633                             <?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
    634 
    635                             <?php bbp_get_template_part( 'loop',       'topics'    ); ?>
    636 
    637                             <?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
    638 
    639                             <?php bbp_get_template_part( 'form',       'topic'     ); ?>
    640 
    641                         <?php else : ?>
    642 
    643                             <?php bbp_get_template_part( 'feedback',   'no-topics' ); ?>
    644 
    645                             <?php bbp_get_template_part( 'form',       'topic'     ); ?>
    646 
    647                         <?php endif;
     623            <?php switch ( $forum_action ) :
     624
     625                /** Single Forum **********************************************/
     626
     627                case false  :
     628                case 'page' :
     629
     630                    // Query forums and show them if they exist
     631                    if ( bbp_forums() ) :
     632
     633                        // Setup the forum
     634                        bbp_the_forum(); ?>
     635
     636                        <h3><?php bbp_forum_title(); ?></h3>
     637
     638                        <?php bbp_get_template_part( 'content', 'single-forum' );
    648639
    649640                    // No forums found
     
    651642
    652643                        <div id="message" class="info">
    653                             <p><?php _e( 'This group does not currently have any forums.', 'bbpress' ); ?></p>
     644                            <p><?php _e( 'This group does not currently have a forum.', 'bbpress' ); ?></p>
    654645                        </div>
    655646
    656647                    <?php endif;
    657648
    658                 // No forums found
    659                 else : ?>
    660 
    661                     <div id="message" class="info">
    662                         <p><?php _e( 'This group does not currently have any forums.', 'bbpress' ); ?></p>
    663                     </div>
    664 
    665                 <?php endif;
    666 
    667             // Single forum
    668             elseif ( ( bp_action_variable( $offset ) != $this->slug ) && ( bp_action_variable( $offset ) != $this->topic_slug ) && ( bp_action_variable( $offset ) != $this->reply_slug ) ) :
    669 
    670                 // Get forum data
    671                 $forum_slug = bp_action_variable( $offset );
    672                 $forum_args = array( 'name' => $forum_slug, 'post_type' => bbp_get_forum_post_type() );
    673                 $forums     = get_posts( $forum_args );
    674 
    675                 // Forum exists
    676                 if ( !empty( $forums ) ) :
    677                     $forum = $forums[0];
    678 
    679                     // Set up forum data
    680                     $forum_id = bbpress()->current_forum_id = $forum->ID;
    681 
    682                     // Reset necessary forum_query attributes for forums loop to function
    683                     $bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
    684                     $bbp->forum_query->in_the_loop             = true;
    685                     $bbp->forum_query->post                    = get_post( $forum_id );
    686 
    687                     // Forum edit
    688                     if ( bp_action_variable( $offset + 1 ) == $bbp->edit_id ) :
    689                         global $wp_query, $post;
    690 
    691                         $wp_query->bbp_is_edit       = true;
    692                         $wp_query->bbp_is_forum_edit = true;
    693                         $post                        = $forum;
    694 
    695                         bbp_set_query_name( 'bbp_forum_form' );
    696                         bbp_get_template_part( 'form', 'forum' );
    697 
    698                     else :
    699                         bbp_set_query_name( 'bbp_single_forum' ); ?>
    700 
     649                    break;
     650
     651                /** Single Topic **********************************************/
     652
     653                case $this->topic_slug :
     654
     655                    // Get the topic
     656                    bbp_has_topics( array(
     657                        'name'           => bp_action_variable( $offset + 1 ),
     658                        'posts_per_page' => 1
     659                    ) );
     660
     661                    // If no topic, 404
     662                    if ( ! bbp_topics() ) {
     663                        bp_do_404( bbp_get_forum_permalink( $forum_id ) ); ?>
    701664                        <h3><?php bbp_forum_title(); ?></h3>
    702 
    703                         <?php bbp_get_template_part( 'content', 'single-forum' );
    704 
    705                     endif;
    706 
    707                 else :
    708                     bbp_get_template_part( 'feedback', 'no-topics' );
    709                     bbp_get_template_part( 'form',     'topic'     );
    710 
    711                 endif;
    712 
    713             // Single topic
    714             elseif ( bp_action_variable( $offset ) == $this->topic_slug ) :
    715 
    716                 // Get topic data
    717                 $topic_slug = bp_action_variable( $offset + 1 );
    718                 $topic_args = array( 'name' => $topic_slug, 'post_type' => bbp_get_topic_post_type(), 'post_status' => $post_status );
    719                 $topics     = get_posts( $topic_args );
    720 
    721                 // Topic exists
    722                 if ( !empty( $topics ) ) :
    723                     $topic = $topics[0];
    724 
    725                     // Set up topic data
    726                     $topic_id = bbpress()->current_topic_id = $topic->ID;
    727                     $forum_id = bbp_get_topic_forum_id( $topic_id );
    728 
    729                     // Reset necessary forum_query attributes for topics loop to function
    730                     $bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
    731                     $bbp->forum_query->in_the_loop             = true;
    732                     $bbp->forum_query->post                    = get_post( $forum_id );
    733 
    734                     // Reset necessary topic_query attributes for topics loop to function
    735                     $bbp->topic_query->query_vars['post_type'] = bbp_get_topic_post_type();
    736                     $bbp->topic_query->in_the_loop             = true;
    737                     $bbp->topic_query->post                    = $topic;
     665                        <?php bbp_get_template_part( 'feedback', 'no-topics' );
     666                        return;
     667                    }
     668
     669                    // Setup the topic
     670                    bbp_the_topic(); ?>
     671
     672                    <h3><?php bbp_topic_title(); ?></h3>
     673
     674                    <?php
    738675
    739676                    // Topic edit
    740                     if ( bp_action_variable( $offset + 2 ) == $bbp->edit_id ) :
    741                         global $wp_query, $post;
     677                    if ( bp_action_variable( $offset + 2 ) == bbp_get_edit_rewrite_id() ) :
     678
     679                        // Set the edit switches
    742680                        $wp_query->bbp_is_edit       = true;
    743681                        $wp_query->bbp_is_topic_edit = true;
    744                         $post                        = $topic;
     682
     683                        // Setup the global forum ID
     684                        $bbp->current_topic_id       = get_the_ID();
    745685
    746686                        // Merge
     
    763703                    // Single Topic
    764704                    else:
    765                         bbp_set_query_name( 'bbp_single_topic' ); ?>
    766 
    767                         <h3><?php bbp_topic_title(); ?></h3>
    768 
    769                         <?php bbp_get_template_part( 'content', 'single-topic' );
    770 
     705                        bbp_set_query_name( 'bbp_single_topic' );
     706                        bbp_get_template_part( 'content', 'single-topic' );
    771707                    endif;
    772 
    773                 // No Topics
    774                 else :
    775                     bbp_get_template_part( 'feedback', 'no-topics'   );
    776                     bbp_get_template_part( 'form',     'topic'       );
    777 
    778                 endif;
    779 
    780             // Single reply
    781             elseif ( bp_action_variable( $offset ) == $this->reply_slug ) :
    782 
    783                 // Get reply data
    784                 $reply_slug = bp_action_variable( $offset + 1 );
    785                 $reply_args = array( 'name' => $reply_slug, 'post_type' => bbp_get_reply_post_type() );
    786                 $replies    = get_posts( $reply_args );
    787 
    788                 if ( empty( $replies ) )
    789                     return;
    790 
    791                 // Get the first reply
    792                 $reply = $replies[0];
    793 
    794                 // Set up reply data
    795                 $reply_id = bbpress()->current_reply_id = $reply->ID;
    796                 $topic_id = bbp_get_reply_topic_id( $reply_id );
    797                 $forum_id = bbp_get_reply_forum_id( $reply_id );
    798 
    799                 // Reset necessary forum_query attributes for reply to function
    800                 $bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
    801                 $bbp->forum_query->in_the_loop             = true;
    802                 $bbp->forum_query->post                    = get_post( $forum_id );
    803 
    804                 // Reset necessary topic_query attributes for reply to function
    805                 $bbp->topic_query->query_vars['post_type'] = bbp_get_topic_post_type();
    806                 $bbp->topic_query->in_the_loop             = true;
    807                 $bbp->topic_query->post                    = get_post( $topic_id );
    808 
    809                 // Reset necessary reply_query attributes for reply to function
    810                 $bbp->reply_query->query_vars['post_type'] = bbp_get_reply_post_type();
    811                 $bbp->reply_query->in_the_loop             = true;
    812                 $bbp->reply_query->post                    = $reply;
    813 
    814                 if ( bp_action_variable( $offset + 2 ) == $bbp->edit_id ) :
    815                     global $wp_query, $post;
    816 
    817                     $wp_query->bbp_is_edit       = true;
    818                     $wp_query->bbp_is_reply_edit = true;
    819                     $post                        = $reply;
    820 
    821                     // Move
    822                     if ( !empty( $_GET['action'] ) && ( 'move' == $_GET['action'] ) ) :
    823                         bbp_set_query_name( 'bbp_reply_move' );
    824                         bbp_get_template_part( 'form', 'reply-move' );
    825 
    826                     // Edit
    827                     else :
    828                         bbp_set_query_name( 'bbp_reply_form' );
    829                         bbp_get_template_part( 'form', 'reply' );
    830 
     708                    break;
     709
     710                /** Single Reply **********************************************/
     711
     712                case $this->reply_slug :
     713
     714                    // Get the reply
     715                    bbp_has_replies( array(
     716                        'name'           => bp_action_variable( $offset + 1 ),
     717                        'posts_per_page' => 1
     718                    ) );
     719
     720                    // If no topic, 404
     721                    if ( ! bbp_replies() ) {
     722                        bp_do_404( bbp_get_forum_permalink( $forum_id ) ); ?>
     723                        <h3><?php bbp_forum_title(); ?></h3>
     724                        <?php bbp_get_template_part( 'feedback', 'no-replies' );
     725                        return;
     726                    }
     727
     728                    // Setup the reply
     729                    bbp_the_reply(); ?>
     730
     731                    <h3><?php bbp_reply_title(); ?></h3>
     732
     733                    <?php if ( bp_action_variable( $offset + 2 ) == bbp_get_edit_rewrite_id() ) :
     734
     735                        // Set the edit switches
     736                        $wp_query->bbp_is_edit       = true;
     737                        $wp_query->bbp_is_reply_edit = true;
     738
     739                        // Setup the global reply ID
     740                        $bbp->current_reply_id       = get_the_ID();
     741
     742                        // Move
     743                        if ( !empty( $_GET['action'] ) && ( 'move' == $_GET['action'] ) ) :
     744                            bbp_set_query_name( 'bbp_reply_move' );
     745                            bbp_get_template_part( 'form', 'reply-move' );
     746
     747                        // Edit
     748                        else :
     749                            bbp_set_query_name( 'bbp_reply_form' );
     750                            bbp_get_template_part( 'form', 'reply' );
     751                        endif;
    831752                    endif;
    832 
    833                 endif;
    834 
    835             endif; ?>
    836 
     753                    break;
     754            endswitch;
     755
     756            // Reset the query
     757            wp_reset_query(); ?>
     758           
    837759        </div>
    838760
     
    12301152    }
    12311153
    1232     /** Activity ***************************************************************/
     1154    /** Activity **************************************************************/
    12331155
    12341156    /**
Note: See TracChangeset for help on using the changeset viewer.