Skip to:
Content

bbPress.org

Ticket #459: 459.4.diff

File 459.4.diff, 15.3 KB (added by netweb, 7 years ago)
  • src/bbpress.php

     
    215215                /** Identifiers *******************************************************/
    216216
    217217                // Post type identifiers
    218                 $this->forum_post_type   = apply_filters( 'bbp_forum_post_type',  'forum'     );
    219                 $this->topic_post_type   = apply_filters( 'bbp_topic_post_type',  'topic'     );
    220                 $this->reply_post_type   = apply_filters( 'bbp_reply_post_type',  'reply'     );
    221                 $this->topic_tag_tax_id  = apply_filters( 'bbp_topic_tag_tax_id', 'topic-tag' );
     218                $this->forum_post_type         = apply_filters( 'bbp_forum_post_type',        'forum'        );
     219                $this->topic_post_type         = apply_filters( 'bbp_topic_post_type',        'topic'        );
     220                $this->reply_post_type         = apply_filters( 'bbp_reply_post_type',        'reply'        );
     221                $this->forum_moderator_tax_id  = apply_filters( 'bbp_forum_moderator_tax_id', 'bbp-moderate' );
     222                $this->topic_tag_tax_id        = apply_filters( 'bbp_topic_tag_tax_id',       'topic-tag'    );
    222223
    223224                // Status identifiers
    224225                $this->spam_status_id    = apply_filters( 'bbp_spam_post_status',    'spam'    );
     
    639640        }
    640641
    641642        /**
    642          * Register the topic tag taxonomy
     643         * Register the topic tag and forum moderator taxonomies
    643644         *
    644645         * @since bbPress (r2464)
    645646         * @uses register_taxonomy() To register the taxonomy
     
    663664                                'show_ui'               => bbp_allow_topic_tags() && current_user_can( 'bbp_topic_tags_admin' )
    664665                        )
    665666                ) );
     667
     668                // Define local variable(s)
     669                $forum_moderator = array();
     670
     671                // Forum moderator labels
     672                $forum_moderator['labels'] = array(
     673                        'name'                       => __( 'Forum Moderators',     'bbpress' ),
     674                        'singular_name'              => __( 'Forum Moderator',      'bbpress' ),
     675                        'search_items'               => __( 'Search Moderators',    'bbpress' ),
     676                        'popular_items'              => __( 'Popular Moderators',   'bbpress' ),
     677                        'all_items'                  => __( 'All Moderators',       'bbpress' ),
     678                        'edit_item'                  => __( 'Edit Moderator',       'bbpress' ),
     679                        'update_item'                => __( 'Update Moderator',     'bbpress' ),
     680                        'add_new_item'               => __( 'Add New Moderator',    'bbpress' ),
     681                        'new_item_name'              => __( 'New Moderator Name',   'bbpress' ),
     682                        'view_item'                  => __( 'View Forum Moderator', 'bbpress' ),
     683                        'separate_items_with_commas' => __( 'Separate moderator names with commas', 'bbpress' )
     684                );
     685
     686                // Register the forum moderator taxonomy
     687                register_taxonomy(
     688                        bbp_get_forum_moderator_tax_id(),
     689                        bbp_get_forum_post_type(),
     690                        apply_filters( 'bbp_register_forum_moderator_taxonomy', array(
     691                                'labels'                => $forum_moderator['labels'],
     692                                'capabilities'          => bbp_get_forum_moderator_caps(),
     693                                'update_count_callback' => '_update_post_term_count',
     694                                'query_var'             => true,
     695                                'show_tagcloud'         => true,
     696                                'hierarchical'          => false,
     697                                'public'                => false,
     698                                'show_ui'               => current_user_can( 'bbp_forum_moderators_admin' )
     699                        )
     700                ) );
    666701        }
    667702
    668703        /**
  • src/includes/admin/forums.php

     
    5858        private function setup_actions() {
    5959
    6060                // Add some general styling to the admin area
    61                 add_action( 'bbp_admin_head',        array( $this, 'admin_head'       ) );
     61                add_action( 'bbp_admin_head',          array( $this, 'admin_head'              ) );
    6262
    6363                // Messages
    64                 add_filter( 'post_updated_messages', array( $this, 'updated_messages' ) );
     64                add_filter( 'post_updated_messages',   array( $this, 'updated_messages'        ) );
    6565
    6666                // Metabox actions
    67                 add_action( 'add_meta_boxes',        array( $this, 'attributes_metabox'      ) );
    68                 add_action( 'save_post',             array( $this, 'attributes_metabox_save' ) );
     67                add_action( 'add_meta_boxes',          array( $this, 'attributes_metabox'      ) );
     68                add_action( 'save_post',               array( $this, 'attributes_metabox_save' ) );
    6969
     70                // Forum moderators AJAX; run at -1 to preempt built-in tag search
     71                add_action( 'wp_ajax_ajax-tag-search', array( $this, 'ajax_tag_search'         ), -1 );
     72
    7073                // Forum Column headers.
    7174                add_filter( 'manage_' . $this->post_type . '_posts_columns',        array( $this, 'column_headers' )        );
    7275
     
    255258        }
    256259
    257260        /**
     261         * Return user nicename suggestions instead of tag suggestions
     262         *
     263         * @return Return early if not a request for forum moderators tax
     264         */
     265        public function ajax_tag_search() {
     266
     267                // Only do AJAX if this is a forum moderators tax search
     268                if ( ! isset( $_GET['tax'] ) || ( bbp_get_forum_moderator_tax_id() != $_GET['tax'] ) )
     269                        return;
     270
     271                $taxonomy = sanitize_key( $_GET['tax'] );
     272                $tax      = get_taxonomy( $taxonomy );
     273                if ( empty( $tax ) )
     274                        wp_die( 0 );
     275
     276                // Check permissions
     277                if ( ! current_user_can( $tax->cap->assign_terms ) )
     278                        wp_die( -1 );
     279
     280                $s = stripslashes( $_GET['q'] );
     281
     282                // Replace tag delimiter with a comma if needed
     283                $comma = _x( ',', 'tag delimiter', 'bbpress' );
     284                if ( ',' !== $comma ) {
     285                        $s = str_replace( $comma, ',', $s );
     286                }
     287
     288                if ( false !== strpos( $s, ',' ) ) {
     289                        $s = explode( ',', $s );
     290                        $s = $s[count( $s ) - 1];
     291                }
     292
     293                // Search on at least 2 characters
     294                $s = trim( $s );
     295                if ( strlen( $s ) < 2 )
     296                        wp_die(); // require 2 chars for matching
     297
     298                // Get users
     299                $results = array();
     300                $users   = get_users( array(
     301                        'blog_id'        => 0, // All users
     302                        'fields'         => array( 'user_nicename' ),
     303                        'search'         => '*' . $s . '*',
     304                        'search_columns' => array( 'user_nicename' ),
     305                        'orderby'        => 'user_nicename'
     306                ) );
     307
     308                // Format the users into a nice array
     309                if ( ! empty( $users ) ) {
     310                        foreach( array_values( $users ) as $details ) {
     311                                $results[] = $details->user_nicename;
     312                        }
     313                }
     314
     315                // Echo results for AJAX
     316                echo join( $results, "\n" );
     317                wp_die();
     318        }
     319
     320        /**
    258321         * Pass the forum attributes for processing
    259322         *
    260323         * @since bbPress (r2746)
  • src/includes/common/functions.php

     
    19521952
    19531953        $wp_query->set_404();
    19541954}
     1955
     1956/** User Nicename Taxonomies **************************************************/
     1957
     1958/**
     1959 * Return the term id for a given user id and taxonomy
     1960 *
     1961 * @param int $user_id User id
     1962 * @param string $taxonomy Taxonomy
     1963 * @uses get_userdata() To get the user data
     1964 * @uses taxonomy_exists() To make sure the taxonomy exists
     1965 * @uses get_term_by() To get the term by name
     1966 * @return boolean Return false early, or if not found, or
     1967 * @return int Term id
     1968 */
     1969function bbp_get_user_taxonomy_term_id( $user_id = 0, $taxonomy = '' ) {
     1970        // Verify user id
     1971        if ( empty( $user_id ) )
     1972                return false;
     1973
     1974        // Get user data
     1975        $user = get_userdata( $user_id );
     1976        if ( empty( $user ) )
     1977                return false;
     1978
     1979        // Verify taxonomy
     1980        if ( empty( $taxonomy ) || !taxonomy_exists( $taxonomy ) )
     1981                return false;
     1982
     1983        // Get the term id
     1984        $term = get_term_by( 'name', $user->user_nicename, $taxonomy );
     1985        if ( $term )
     1986                return $term->term_id;
     1987
     1988        return false;
     1989}       
     1990
     1991/**
     1992 * Return the user id for a given term id and taxonomy
     1993 *
     1994 * @param int $term_id Term id
     1995 * @param string $taxonomy
     1996 * @uses taxonomy_exists() To make sure the taxonomy exists
     1997 * @uses get_term() To get the term by term id
     1998 * @uses get_user_by() To get the user by nicename
     1999 * @return boolean Return false early, or if not found, or
     2000 * @return int User id
     2001 */
     2002function bbp_get_term_taxonomy_user_id( $term_id = 0, $taxonomy = '' ) {
     2003        // Verify term id
     2004        if ( empty( $term_id ) )
     2005                return false;
     2006
     2007        // Verify taxonomy
     2008        if ( empty( $taxonomy ) || !taxonomy_exists( $taxonomy ) )
     2009                return false;
     2010
     2011        // Get term
     2012        $term = get_term( $term_id, $taxonomy );
     2013        if ( !$term )
     2014                return false;
     2015
     2016        // Get the user by nicename
     2017        $nicename = $term->name;
     2018        $user = get_user_by( 'slug', $nicename );
     2019        if ( $user )
     2020                return $user->ID;
     2021
     2022        return false;
     2023}
  • src/includes/core/filters.php

     
    234234add_filter( 'posts_request', '_bbp_has_replies_where', 10, 2 );
    235235
    236236// Capabilities
    237 add_filter( 'bbp_map_meta_caps', 'bbp_map_primary_meta_caps',   10, 4 ); // Primary caps
    238 add_filter( 'bbp_map_meta_caps', 'bbp_map_forum_meta_caps',     10, 4 ); // Forums
    239 add_filter( 'bbp_map_meta_caps', 'bbp_map_topic_meta_caps',     10, 4 ); // Topics
    240 add_filter( 'bbp_map_meta_caps', 'bbp_map_reply_meta_caps',     10, 4 ); // Replies
    241 add_filter( 'bbp_map_meta_caps', 'bbp_map_topic_tag_meta_caps', 10, 4 ); // Topic tags
     237add_filter( 'bbp_map_meta_caps', 'bbp_map_primary_meta_caps',         10, 4 ); // Primary caps
     238add_filter( 'bbp_map_meta_caps', 'bbp_map_forum_meta_caps',           10, 4 ); // Forums
     239add_filter( 'bbp_map_meta_caps', 'bbp_map_topic_meta_caps',           10, 4 ); // Topics
     240add_filter( 'bbp_map_meta_caps', 'bbp_map_reply_meta_caps',           10, 4 ); // Replies
     241add_filter( 'bbp_map_meta_caps', 'bbp_map_topic_tag_meta_caps',       10, 4 ); // Topic tags
     242add_filter( 'bbp_map_meta_caps', 'bbp_map_forum_moderator_meta_caps', 10, 4 ); // Forum moderator
    242243
    243244/** Deprecated ****************************************************************/
    244245
  • src/includes/forums/capabilities.php

     
    182182                case 'bbp_forums_admin' :
    183183                        $caps = array( 'keep_gate' );
    184184                        break;
     185                case 'bbp_forum_moderators_admin' :
     186                        $caps = array( 'manage_options' );
     187                        break;
    185188        }
    186189
    187190        return apply_filters( 'bbp_map_forum_meta_caps', $caps, $cap, $user_id, $args );
    188191}
     192
     193/**
     194 * Return forum moderator capabilities
     195 *
     196 * @since bbPress (rXXXX)
     197 *
     198 * @uses apply_filters() Calls 'bbp_get_forum_moderator_caps' with the capabilities
     199 * @return array Forum mod capabilities
     200 */
     201function bbp_get_forum_moderator_caps() {
     202        return apply_filters( 'bbp_get_forum_moderator_caps', array(
     203                'manage_terms' => 'keep_gate',
     204                'edit_terms'   => 'keep_gate',
     205                'delete_terms' => 'keep_gate',
     206                'assign_terms' => 'keep_gate'
     207        ) );
     208}
     209
     210/**
     211 * Maps forum moderator capabilities
     212 *
     213 * @since bbPress (rXXXX)
     214 *
     215 * @param array $caps Capabilities for meta capability
     216 * @param string $cap Capability name
     217 * @param int $user_id User id
     218 * @param mixed $args Arguments
     219 * @uses apply_filters() Filter capabilities map results
     220 * @return array Actual capabilities for meta capability
     221 */
     222function bbp_map_forum_moderator_meta_caps( $caps, $cap, $user_id, $args ) {
     223
     224        // What capability is being checked?
     225        switch( $cap ) {
     226                case 'manage_forum_moderators'    :
     227                case 'edit_forum_moderators'      :
     228                case 'delete_forum_moderators'    :
     229                case 'assign_forum_moderators'    :
     230                case 'bbp_forum_moderators_admin' :
     231
     232                        // Key Masters can always edit
     233                        if ( user_can( $user_id, 'keep_gate' ) ) {
     234                                $caps = array( 'keep_gate' );
     235                        }
     236        }
     237
     238        return apply_filters( 'bbp_map_forum_moderator_meta_caps', $caps, $cap, $user_id, $args );
     239}
     240
     241/**
     242 * Get moderators of a forum
     243 *
     244 * @since bbPress (rXXXX)
     245 *
     246 * @param $forum_id Forum id
     247 * @uses bbp_is_forum() To make sure it is a forum
     248 * @uses bbp_get_forum_moderator_tax_id() To get the forum moderator taxonomy
     249 * @uses wp_get_object_terms() To get the forum's moderator terms
     250 * @uses is_wp_error() To check for errors
     251 * @uses bbp_get_term_taxonomy_user_id() To convert terms to user ids
     252 * @return boolean Return false early, or if no moderator terms set, or
     253 * @return array User ids
     254 */
     255function bbp_get_forum_moderators( $forum_id = 0 ) {
     256
     257        // Check input forum
     258        if ( !empty( $forum_id ) && bbp_is_forum( (int) $forum_id ) ) {
     259
     260                // Get forum taxonomy terms
     261                $taxonomy = bbp_get_forum_moderator_tax_id();
     262                $args     = array( 'fields' => 'ids' );
     263                $terms    = wp_get_object_terms( $forum_id, $taxonomy, $args );
     264
     265                // Terms found
     266                if ( !empty( $terms ) && !is_wp_error( $terms ) ) {
     267                        $moderators = array();
     268
     269                        // Convert term ids to user ids
     270                        foreach ( $terms as $term ) {
     271                                $user_id = bbp_get_term_taxonomy_user_id( $term, $taxonomy );
     272                                if ( $user_id )
     273                                        $moderators[] = $user_id;
     274                        }
     275
     276                        // Moderators found
     277                        if ( !empty( $moderators ) )
     278                                return $moderators;
     279                }
     280        }
     281
     282        return false;
     283}
     284
     285/**
     286 * Get forums of a moderator
     287 *
     288 * @since bbPress (rXXXX)
     289 *
     290 * @param $user_id User id
     291 * @uses get_userdata() To get the user object
     292 * @uses bbp_get_forum_moderator_tax_id() To get the forum moderator taxonomy
     293 * @uses get_term_by() To get the term id
     294 * @uses get_objects_in_term() Get the forums the user moderates
     295 * @uses is_wp_error() To check for errors
     296 * @uses bbp_is_forum() To make sure the objects are forums
     297 * @return boolean Return false early, or if user has no forums, or
     298 * @return array Forum ids
     299 */
     300function bbp_get_moderator_forums( $user_id = 0 ) {
     301
     302        // Require a user id
     303        if ( empty( $user_id ) )
     304                return false;
     305
     306        // Get user
     307        $user = get_userdata( $user_id );
     308        if ( !$user )
     309                return false;
     310
     311        // Convert user id to term id
     312        $taxonomy = bbp_get_forum_moderator_tax_id();
     313        $term_id = bbp_get_user_taxonomy_term_id( $user_id, $taxonomy );
     314
     315        // Get moderator forums
     316        $forums = get_objects_in_term( $term_id, $taxonomy );
     317
     318        // Forums found
     319        if ( !empty( $forums ) && !is_wp_error( $forums ) ) {
     320
     321                // Make sure the ids returned are forums
     322                $forum_ids = array();
     323                foreach ( $forums as $forum_id ) {
     324                        if ( bbp_is_forum( $forum_id ) )
     325                                $forum_ids[] = $forum_id;
     326                }
     327                if ( !empty( $forum_ids ) )
     328                        return $forum_ids;
     329        }
     330
     331        return false;
     332}
     333 No newline at end of file
  • src/includes/forums/template.php

     
    20372037                return apply_filters( 'bbp_get_single_forum_description', $retstr, $r );
    20382038        }
    20392039
     2040/** Moderators ****************************************************************/
     2041
     2042/**
     2043 * Output the unique id of the forum moderators taxonomy
     2044 *
     2045 * @since bbPress (rXXXX)
     2046 *
     2047 * @uses bbp_get_forum_post_type() To get the forum post type
     2048 */
     2049function bbp_forum_moderator_tax_id() {
     2050        echo bbp_get_forum_moderator_tax_id();
     2051}
     2052        /**
     2053         * Return the unique id of the forum moderators taxonomy
     2054         *
     2055         * @since bbPress (rXXXX)
     2056         *
     2057         * @uses apply_filters() Calls 'bbp_get_forum_moderator_tax_ia' with the forum moderator tax id
     2058         * @return string The unique forum moderators taxonomy
     2059         */
     2060        function bbp_get_forum_moderator_tax_id() {
     2061                return apply_filters( 'bbp_get_forum_moderator_tax_id', bbpress()->forum_moderator_tax_id );
     2062        }
     2063
    20402064/** Forms *********************************************************************/
    20412065
    20422066/**
     
    22262250
    22272251                return apply_filters( 'bbp_get_form_forum_visibility', esc_attr( $forum_visibility ) );
    22282252        }
    2229        
     2253
    22302254/**
    22312255 * Output checked value of forum subscription
    22322256 *