Skip to:
Content

BuddyPress.org

Ticket #4017: 4017.02.patch

File 4017.02.patch, 65.2 KB (added by r-a-y, 5 years ago)

Updated 02.patch to remove reference to a non-existent function

  • src/bp-core/bp-core-actions.php

     
    6666 */
    6767add_action( 'bp_init', 'bp_core_set_uri_globals',    2  );
    6868add_action( 'bp_init', 'bp_setup_globals',           4  );
     69add_action( 'bp_init', 'bp_register_taxonomies',     5  );
    6970add_action( 'bp_init', 'bp_setup_nav',               6  );
    7071add_action( 'bp_init', 'bp_setup_title',             8  );
    7172add_action( 'bp_init', 'bp_core_load_admin_bar_css', 12 );
     
    9596 */
    9697add_action( 'bp_after_setup_theme', 'bp_load_theme_functions', 1 );
    9798
     99/**
     100 * Start the BP Term class
     101 */
     102add_action( 'bp_core_setup_globals', array( 'BP_Terms', 'start' ) );
     103
    98104// Load the admin
    99105if ( is_admin() ) {
    100106        add_action( 'bp_loaded', 'bp_admin' );
  • src/bp-core/bp-core-classes.php

     
    26122612                return apply_filters( 'bp_members_suggestions_get_suggestions', $results, $this );
    26132613        }
    26142614}
     2615
     2616/**
     2617 * Use WordPress term/taxonomy functions, forcing the table prefix to be the one of root blog id.
     2618 *
     2619 * This is needed for Multisite configs in case a component taxonomy is used from a child blog.
     2620 *
     2621 * @since BuddyPress (2.1.0)
     2622 */
     2623class BP_Terms {
     2624
     2625        /**
     2626         * Start the class
     2627         *
     2628         * @access public
     2629         * @since BuddyPress (2.1.0)
     2630         * @static
     2631         */
     2632        public static function start() {
     2633                $bp = buddypress();
     2634
     2635                if ( empty( $bp->terms ) ) {
     2636                        $bp->terms = new self;
     2637                }
     2638
     2639                return $bp->terms;
     2640        }
     2641
     2642        /**
     2643         * Constructor
     2644         *
     2645         * @access public
     2646         * @since BuddyPress (2.1.0)
     2647         */
     2648        public function __construct() {}
     2649
     2650        /**
     2651         * Set needed $wpdb->tables to be the one of root blog id
     2652         *
     2653         * @access public
     2654         * @since BuddyPress (2.1.0)
     2655         * @static
     2656         */
     2657        public static function set_tables() {
     2658                switch_to_blog( bp_get_root_blog_id() );
     2659        }
     2660
     2661        /**
     2662         * Reset $wpdb->tables to the one set by WordPress
     2663         *
     2664         * @access public
     2665         * @since BuddyPress (2.1.0)
     2666         * @static
     2667         */
     2668        public static function reset_tables() {
     2669                restore_current_blog();
     2670        }
     2671
     2672        /**
     2673         * Update term count
     2674         *
     2675         * @access public
     2676         * @since BuddyPress (2.1.0)
     2677         * @static
     2678         */
     2679        public static function update_term_count( $terms, $taxonomy ) {
     2680                self::set_tables();
     2681                _update_generic_term_count( $terms, $taxonomy );
     2682                self::reset_tables();
     2683        }
     2684
     2685        /**
     2686         * Get group tags
     2687         *
     2688         * @access public
     2689         * @since BuddyPress (2.1.0)
     2690         * @static
     2691         *
     2692         * @uses wp_get_object_terms()
     2693         */
     2694        public static function get_object_terms( $object_ids, $taxonomies, $args = array() ) {
     2695                self::set_tables();
     2696                $return = wp_get_object_terms( $object_ids, $taxonomies, $args );
     2697                self::reset_tables();
     2698                return $return;
     2699        }
     2700
     2701        /**
     2702         * Set group tags
     2703         *
     2704         * @access public
     2705         * @since BuddyPress (2.1.0)
     2706         * @static
     2707         *
     2708         * @uses wp_set_object_terms()
     2709         */
     2710        public static function set_object_terms( $object_id, $terms, $taxonomy, $append ) {
     2711                self::set_tables();
     2712                $return = wp_set_object_terms( $object_id, $terms, $taxonomy, $append );
     2713                self::reset_tables();
     2714                return $return;
     2715        }
     2716
     2717        /**
     2718         * Remove group tags
     2719         *
     2720         * @access public
     2721         * @since BuddyPress (2.1.0)
     2722         * @static
     2723         *
     2724         * @uses wp_remove_object_terms()
     2725         */
     2726        public static function remove_object_terms( $object_id, $terms, $taxonomy ) {
     2727                self::set_tables();
     2728                $return = wp_remove_object_terms( $object_id, $terms, $taxonomy );
     2729                self::reset_tables();
     2730                return $return;
     2731        }
     2732
     2733        /**
     2734         * Remove all group relationships
     2735         *
     2736         * @access public
     2737         * @since BuddyPress (2.1.0)
     2738         * @static
     2739         *
     2740         * @uses wp_delete_object_term_relationships()
     2741         */
     2742        public static function delete_object_term_relationships( $object_id, $taxonomies = 'bp_group_tags' ) {
     2743                self::set_tables();
     2744                $return = wp_delete_object_term_relationships( $object_id, $taxonomies );
     2745                self::reset_tables();
     2746                return $return;
     2747        }
     2748
     2749        /**
     2750         * Get group ids for a given tag
     2751         *
     2752         * @access public
     2753         * @since BuddyPress (2.1.0)
     2754         * @static
     2755         *
     2756         * @uses get_objects_in_term()
     2757         */
     2758        public static function get_objects_in_term( $term_ids, $taxonomies, $args = array() ) {
     2759                self::set_tables();
     2760                $return = get_objects_in_term( $term_ids, $taxonomies, $args );
     2761                self::reset_tables();
     2762                return $return;
     2763        }
     2764
     2765        /**
     2766         * Get all Term data from database by Term ID
     2767         *
     2768         * @access public
     2769         * @since BuddyPress (2.1.0)
     2770         * @static
     2771         *
     2772         * @uses get_term()
     2773         */
     2774        public static function get_term( $term, $taxonomy, $output, $filter ) {
     2775                self::set_tables();
     2776                $return = get_term( $term, $taxonomy, $output, $filter );
     2777                self::reset_tables();
     2778                return $return;
     2779        }
     2780
     2781        /**
     2782         * Get all terms for a given taxonomy
     2783         *
     2784         * @access public
     2785         * @since BuddyPress (2.1.0)
     2786         * @static
     2787         *
     2788         * @uses get_terms()
     2789         */
     2790        public static function get_terms( $taxonomies, $args = array() ) {
     2791                self::set_tables();
     2792                $return = get_terms( $taxonomies, $args );
     2793                self::reset_tables();
     2794                return $return;
     2795        }
     2796
     2797        /**
     2798         * Get all terms to edit for a given taxonomy
     2799         *
     2800         * @access public
     2801         * @since BuddyPress (2.1.0)
     2802         * @static
     2803         *
     2804         * @uses get_terms_to_edit()
     2805         */
     2806        public static function get_terms_to_edit( $post_id, $taxonomy ) {
     2807                self::set_tables();
     2808                $return = get_terms_to_edit( $post_id, $taxonomy );
     2809                self::reset_tables();
     2810                return $return;
     2811        }
     2812
     2813        /**
     2814         * Insert a term based on arguments provided.
     2815         *
     2816         * @access public
     2817         * @since BuddyPress (2.1.0)
     2818         * @static
     2819         *
     2820         * @uses wp_insert_term()
     2821         */
     2822        public static function insert_term( $term, $taxonomy, $args = array() ) {
     2823                self::set_tables();
     2824                $return = wp_insert_term( $term, $taxonomy, $args );
     2825                self::reset_tables();
     2826                return $return;
     2827        }
     2828
     2829        /**
     2830         * Update term based on arguments provided.
     2831         *
     2832         * @access public
     2833         * @since BuddyPress (2.1.0)
     2834         * @static
     2835         *
     2836         * @uses wp_update_term()
     2837         */
     2838        public static function update_term( $term_id, $taxonomy, $args = array() ) {
     2839                self::set_tables();
     2840                $return = wp_update_term( $term_id, $taxonomy, $args );
     2841                self::reset_tables();
     2842                return $return;
     2843        }
     2844
     2845        /**
     2846         * Delete term based on arguments provided.
     2847         *
     2848         * @access public
     2849         * @since BuddyPress (2.1.0)
     2850         * @static
     2851         *
     2852         * @uses wp_delete_term()
     2853         */
     2854        public static function delete_term( $term_id, $taxonomy, $args = array() ) {
     2855                self::set_tables();
     2856                $return = wp_delete_term( $term_id, $taxonomy, $args );
     2857                self::reset_tables();
     2858                return $return;
     2859        }
     2860
     2861        /**
     2862         * Get term thanks to a specific field
     2863         *
     2864         * @access public
     2865         * @since BuddyPress (2.1.0)
     2866         * @static
     2867         *
     2868         * @uses get_term_by()
     2869         */
     2870        public static function get_term_by( $field, $value, $taxonomy, $output, $filter ) {
     2871                self::set_tables();
     2872                $return = get_term_by( $field, $value, $taxonomy, $output, $filter );
     2873                self::reset_tables();
     2874                return $return;
     2875        }
     2876
     2877        /**
     2878         * Get the term link
     2879         *
     2880         * @access public
     2881         * @since BuddyPress (2.1.0)
     2882         * @static
     2883         *
     2884         * @uses get_term_link()
     2885         */
     2886        public static function get_term_link( $term, $taxonomy ) {
     2887                $root_blog = bp_is_root_blog();
     2888
     2889                if ( ! $root_blog ) {
     2890                        switch_to_blog( bp_get_root_blog_id() );
     2891                }
     2892
     2893                $return = get_term_link( $term, $taxonomy );
     2894
     2895                if ( ! $root_blog ) {
     2896                        restore_current_blog();
     2897                }
     2898
     2899                return $return;
     2900        }
     2901
     2902        /**
     2903         * Copy WordPress get_the_term_list without using get_the_terms()
     2904         * function as it checks for an existing post.
     2905         *
     2906         * @access public
     2907         * @since BuddyPress (2.1.0)
     2908         * @static
     2909         *
     2910         * @uses self::get_object_terms()
     2911         * @uses self::get_term_link()
     2912         */
     2913        public static function get_the_term_list( $object_id, $taxonomy, $before, $sep, $after ) {
     2914
     2915                $terms = self::get_object_terms( $object_id, $taxonomy );
     2916
     2917                if ( is_wp_error( $terms ) )
     2918                        return $terms;
     2919
     2920                if ( empty( $terms ) )
     2921                        return false;
     2922
     2923                self::set_tables();
     2924                foreach ( $terms as $term ) {
     2925                        $link = get_term_link( $term, $taxonomy );
     2926                        if ( is_wp_error( $link ) )
     2927                                return $link;
     2928                        $term_links[] = '<a href="' . esc_url( $link ) . '" rel="tag">' . $term->name . '</a>';
     2929                }
     2930                self::reset_tables();
     2931
     2932                $term_links = apply_filters( "term_links-$taxonomy", $term_links );
     2933
     2934                return $before . join( $sep, $term_links ) . $after;
     2935        }
     2936
     2937        /**
     2938         * Get the sql for a Tax Query
     2939         *
     2940         * @access public
     2941         * @since BuddyPress (2.1.0)
     2942         * @static
     2943         *
     2944         * @uses get_term_link()
     2945         */
     2946        public static function get_tax_sql( $tax_query, $primary_table, $primary_id_column ) {
     2947                global $wpdb;
     2948                self::set_tables();
     2949                $return = get_tax_sql( $tax_query, $primary_table, $primary_id_column );
     2950                self::reset_tables();
     2951                return $return;
     2952        }
     2953}
     2954 No newline at end of file
  • src/bp-core/bp-core-component.php

     
    543543         *
    544544         * @uses do_action() Calls 'bp_{@link bp_Component::name}_register_taxonomies'.
    545545         */
    546         public function register_taxonomies() {
     546        public function register_taxonomies( $taxonomy = '', $object_type = '', $args = array(), $network = false ) {
     547                if ( ! bp_is_root_blog() && empty( $network ) ) {
     548                        return;
     549                }
     550
     551                if ( ! taxonomy_exists( $taxonomy ) && ! empty( $object_type ) && ! empty( $args ) ) {
     552                        register_taxonomy( $taxonomy, $object_type, $args );
     553                }
     554
    547555                do_action( 'bp_' . $this->id . '_register_taxonomies' );
    548556        }
    549557
  • src/bp-core/bp-core-dependency.php

     
    6161}
    6262
    6363/**
     64 * Fire the 'bp_register_taxonomies' action, where plugins should register bp_terms.
     65 */
     66function bp_register_taxonomies() {
     67        do_action( 'bp_register_taxonomies' );
     68}
     69
     70/**
    6471 * Fire the 'bp_register_widgets' action, where plugins should register widgets.
    6572 */
    6673function bp_setup_widgets() {
  • src/bp-core/bp-core-functions.php

     
    19711971
    19721972        return apply_filters( 'bp_core_get_suggestions', $retval, $args );
    19731973}
     1974
     1975/** BuddyPress Terms **********************************************************/
     1976
     1977/**
     1978 * Get all Term data from database by Term ID.
     1979 *
     1980 * WordPress get_term function for BuddyPress root blog id
     1981 * @see get_term() for the full description.
     1982 *
     1983 * @since BuddyPress (2.1.0)
     1984 *
     1985 * @uses BP_Terms::get_term().
     1986 *
     1987 * @param int|object $term If integer, will get from database. If object will apply filters and return $term.
     1988 * @param string $taxonomy Taxonomy name that $term is part of.
     1989 * @param string $output Constant OBJECT, ARRAY_A, or ARRAY_N
     1990 * @param string $filter Optional, default is raw or no WordPress defined filter will applied.
     1991 * @return mixed|null|WP_Error Term Row from database. Will return null if $term is empty. If taxonomy does not
     1992 * exist then WP_Error will be returned.
     1993 */
     1994function bp_core_get_term( $term, $taxonomy, $output = OBJECT, $filter = 'raw' ) {
     1995        return BP_Terms::get_term( $term, $taxonomy, $output, $filter );
     1996}
     1997
     1998/**
     1999 * Retrieve the terms in a given taxonomy or list of taxonomies.
     2000 *
     2001 * WordPress get_terms function for BuddyPress root blog id
     2002 * @see get_terms() for the list of possible args.
     2003 *
     2004 * @since BuddyPress (2.1.0)
     2005 *
     2006 * @uses BP_Terms::get_terms().
     2007 *
     2008 * @param string|array $taxonomies Taxonomy name or list of Taxonomy names.
     2009 * @param string|array $args The values of what to search for when returning terms
     2010 * @return array|WP_Error List of Term Objects and their children. Will return WP_Error, if any of $taxonomies do not exist.
     2011 */
     2012function bp_core_get_terms( $taxonomies = '', $args = '' ) {
     2013        return BP_Terms::get_terms( $taxonomies, $args );
     2014}
     2015
     2016/**
     2017 * Retrieve the terms in a given taxonomy to edit.
     2018 *
     2019 * WordPress get_terms_to_edit function for BuddyPress root blog id
     2020 * @see get_terms_to_edit() for the list of possible args.
     2021 *
     2022 * @since BuddyPress (2.1.0)
     2023 *
     2024 * @uses BP_Terms::get_terms().
     2025 *
     2026 * @param int $object_id Object ID.
     2027 * @param string $taxonomy The taxonomy to which to edit the term
     2028 * @return array|WP_Error List of Term Objects and their children. Will return WP_Error, if any of $taxonomies do not exist.
     2029 */
     2030function bp_core_get_terms_to_edit( $object_id, $taxonomy = '' ) {
     2031        return BP_Terms::get_terms_to_edit( $object_id, $taxonomy );
     2032}
     2033
     2034/**
     2035 * Add a new term to the database.
     2036 *
     2037 * WordPress wp_insert_term function for BuddyPress root blog id
     2038 * @see wp_insert_term() for the list of possible args.
     2039 *
     2040 * @since BuddyPress (2.1.0)
     2041 *
     2042 * @uses BP_Terms::insert_term().
     2043 *
     2044 * @param string       $term     The term to add or update.
     2045 * @param string       $taxonomy The taxonomy to which to add the term
     2046 * @param array|string $args
     2047 * @return array|WP_Error An array containing the term_id and term_taxonomy_id, WP_Error otherwise.
     2048 */
     2049function bp_core_insert_term( $term, $taxonomy, $args = array() ) {
     2050        return BP_Terms::insert_term( $term, $taxonomy, $args );
     2051}
     2052
     2053/**
     2054 * Update term based on arguments provided.
     2055 *
     2056 * WordPress wp_update_term function for BuddyPress root blog id
     2057 * @see wp_update_term() for the list of possible args.
     2058 *
     2059 * @since BuddyPress (2.1.0)
     2060 *
     2061 * @uses BP_Terms::update_term().
     2062 *
     2063 * @param int $term_id The ID of the term
     2064 * @param string $taxonomy The context in which to relate the term to the object.
     2065 * @param array|string $args Overwrite term field values
     2066 * @return array|WP_Error Returns Term ID and Taxonomy Term ID
     2067 */
     2068function bp_core_update_term( $term_id, $taxonomy, $args = array() ) {
     2069        return BP_Terms::update_term( $term_id, $taxonomy, $args );
     2070}
     2071
     2072/**
     2073 * Removes a term from the database.
     2074 *
     2075 * WordPress wp_update_term function for BuddyPress root blog id
     2076 * @see wp_delete_term() for the list of possible args.
     2077 *
     2078 * @since BuddyPress (2.1.0)
     2079 *
     2080 * @uses BP_Terms::delete_term().
     2081 *
     2082 * @param int $term_id Term ID
     2083 * @param string $taxonomy Taxonomy Name
     2084 * @param array|string $args Optional. Change 'default' term id and override found term ids.
     2085 * @return bool|WP_Error Returns false if not term; true if completes delete action.
     2086 */
     2087function bp_core_delete_term( $term_id, $taxonomy, $args = array() ) {
     2088        return BP_Terms::delete_term( $term_id, $taxonomy, $args );
     2089}
     2090
     2091/**
     2092 * Get all Term data from database by Term field and data.
     2093 *
     2094 * WordPress get_term_by function for BuddyPress root blog id
     2095 * @see get_term_by() for the list of possible args.
     2096 *
     2097 * @since BuddyPress (2.1.0)
     2098 *
     2099 * @uses BP_Terms::get_term_by().
     2100 *
     2101 * @param string $field Either 'slug', 'name', 'id' (term_id), or 'term_taxonomy_id'
     2102 * @param string|int $value Search for this term value
     2103 * @param string $taxonomy Taxonomy Name
     2104 * @param string $output Constant OBJECT, ARRAY_A, or ARRAY_N
     2105 * @param string $filter Optional, default is raw or no WordPress defined filter will applied.
     2106 * @return mixed Term Row from database. Will return false if $taxonomy does not exist or $term was not found.
     2107 */
     2108function bp_core_get_term_by( $field, $value, $taxonomy = '', $output = OBJECT, $filter = 'raw' ) {
     2109        return BP_Terms::get_term_by( $field, $value, $taxonomy, $output, $filter );
     2110}
     2111
     2112/**
     2113 * Generates a permalink for a taxonomy term archive.
     2114 *
     2115 * WordPress get_term_link function for BuddyPress root blog id
     2116 * @see get_term_link()
     2117 *
     2118 * @since BuddyPress (2.1.0)
     2119 *
     2120 * @uses BP_Terms::get_term_link().
     2121 *
     2122 * @param object|int|string $term
     2123 * @param string $taxonomy (optional if $term is object)
     2124 * @return string|WP_Error HTML link to taxonomy term archive on success, WP_Error if term does not exist.
     2125 */
     2126function bp_core_get_term_link( $term, $taxonomy = '' ) {
     2127        return BP_Terms::get_term_link( $term, $taxonomy );
     2128}
     2129
     2130/**
     2131 * Retrieve a BuddyPress item terms as a list with specified format.
     2132 *
     2133 * WordPress get_the_term_list function adapted for BuddyPress
     2134 *
     2135 * @since BuddyPress (2.1.0)
     2136 *
     2137 * @uses BP_Terms::get_the_term_list().
     2138 *
     2139 * @param int $id BuddyPress item id (for instance a group id).
     2140 * @param string $taxonomy Taxonomy name.
     2141 * @param string $before Optional. Before list.
     2142 * @param string $sep Optional. Separate items using this.
     2143 * @param string $after Optional. After list.
     2144 * @return string|bool|WP_Error A list of terms on success, false or WP_Error on failure.
     2145 */
     2146function bp_core_get_the_term_list( $object_id, $taxonomy = '', $before = '', $sep = '', $after = '' ) {
     2147        return BP_Terms::get_the_term_list( $object_id, $taxonomy, $before, $sep, $after );
     2148}
     2149
     2150/**
     2151 * Retrieve object_ids of valid taxonomy and term.
     2152 *
     2153 * WordPress get_objects_in_term function for BuddyPress root blog id
     2154 * @see get_objects_in_term() for the list of possible args.
     2155 *
     2156 * @since BuddyPress (2.1.0)
     2157 *
     2158 * @uses BP_Terms::get_objects_in_term().
     2159 *
     2160 * @param int|array $term_ids Term id or array of term ids of terms that will be used
     2161 * @param string|array $taxonomies String of taxonomy name or Array of string values of taxonomy names
     2162 * @param array|string $args Change the order of the object_ids, either ASC or DESC
     2163 * @return WP_Error|array If the taxonomy does not exist, then WP_Error will be returned. On success
     2164 *      the array can be empty meaning that there are no $object_ids found or it will return the $object_ids found.
     2165 */
     2166function bp_core_get_objects_in_term( $term_ids, $taxonomies = '', $args = array() ) {
     2167        return BP_Terms::get_objects_in_term( $term_ids, $taxonomies, $args );
     2168}
     2169
     2170/**
     2171 * Retrieves the terms associated with the given object(s), in the supplied taxonomies.
     2172 *
     2173 * WordPress wp_get_object_terms function for BuddyPress root blog id
     2174 * @see wp_get_object_terms() for the list of possible args.
     2175 *
     2176 * @since BuddyPress (2.1.0)
     2177 *
     2178 * @uses BP_Terms::get_object_terms().
     2179 *
     2180 * @param int|array $object_ids The ID(s) of the object(s) to retrieve.
     2181 * @param string|array $taxonomies The taxonomies to retrieve terms from.
     2182 * @param array|string $args Change what is returned
     2183 * @return array|WP_Error The requested term data or empty array if no terms found. WP_Error if any of the $taxonomies don't exist.
     2184 */
     2185function bp_core_get_object_terms( $object_ids, $taxonomies = '', $args = array() ) {
     2186        return BP_Terms::get_object_terms( $object_ids, $taxonomies, $args );
     2187}
     2188
     2189/**
     2190 * Create Term and Taxonomy Relationships.
     2191 *
     2192 * WordPress wp_set_object_terms function for BuddyPress root blog id
     2193 * @see wp_set_object_terms()
     2194 *
     2195 * @since BuddyPress (2.1.0)
     2196 *
     2197 * @uses BP_Terms::set_object_terms().
     2198 *
     2199 * @param int $object_id The object to relate to.
     2200 * @param array|int|string $terms The slug or id of the term, will replace all existing
     2201 * related terms in this taxonomy.
     2202 * @param array|string $taxonomy The context in which to relate the term to the object.
     2203 * @param bool $append If false will delete difference of terms.
     2204 * @return array|WP_Error Affected Term IDs
     2205 */
     2206function bp_core_set_object_terms( $object_id, $terms, $taxonomy = '', $append = false ) {
     2207        return BP_Terms::set_object_terms( $object_id, $terms, $taxonomy, $append );
     2208}
     2209
     2210/**
     2211 * Remove term(s) associated with a given object.
     2212 *
     2213 * WordPress wp_remove_object_terms function for BuddyPress root blog id
     2214 * @see wp_remove_object_terms()
     2215 *
     2216 * @since BuddyPress (2.1.0)
     2217 *
     2218 * @uses BP_Terms::remove_object_terms().
     2219 *
     2220 * @param int $object_id The ID of the object from which the terms will be removed.
     2221 * @param array|int|string $terms The slug(s) or ID(s) of the term(s) to remove.
     2222 * @param array|string $taxonomy Taxonomy name.
     2223 * @return bool|WP_Error True on success, false or WP_Error on failure.
     2224 */
     2225function bp_core_remove_object_terms( $object_id, $terms, $taxonomy = '' ) {
     2226        return BP_Terms::remove_object_terms( $object_id, $terms, $taxonomy );
     2227}
     2228
     2229/**
     2230 * Will unlink the object from the taxonomy or taxonomies.
     2231 *
     2232 * WordPress wp_delete_object_term_relationships function for BuddyPress root blog id
     2233 * @see wp_delete_object_term_relationships()
     2234 *
     2235 * @since BuddyPress (2.1.0)
     2236 *
     2237 * @uses BP_Terms::delete_object_term_relationships().
     2238 *
     2239 * @param int $object_id The term Object Id that refers to the term
     2240 * @param string|array $taxonomies List of Taxonomy Names or single Taxonomy name.
     2241 */
     2242function bp_core_delete_object_term_relationships( $object_id, $taxonomies = '' ) {
     2243        return BP_Terms::delete_object_term_relationships( $object_id, $taxonomies );
     2244}
     2245
     2246/**
     2247 * Will update term count based on number of objects.
     2248 *
     2249 * WordPress _update_generic_term_count function for BuddyPress root blog id
     2250 * @see _update_generic_term_count()
     2251 *
     2252 * @since BuddyPress (2.1.0)
     2253 *
     2254 * @uses BP_Terms::update_term_count().
     2255 *
     2256 * @param array $terms List of Term taxonomy IDs
     2257 * @param object $taxonomy Current taxonomy object of terms
     2258 */
     2259function bp_core_update_term_count( $terms, $taxonomy = '' ) {
     2260        return BP_Terms::update_term_count( $terms, $taxonomy );
     2261}
     2262
     2263/**
     2264 * Given a taxonomy query, generates SQL to be appended to a main query.
     2265 *
     2266 * WordPress get_tax_sql function for BuddyPress root blog id
     2267 * @see get_tax_sql()
     2268 *
     2269 * @since BuddyPress (2.1.0)
     2270 *
     2271 * @param array $tax_query A compact tax query
     2272 * @param string $primary_table
     2273 * @param string $primary_id_column
     2274 * @return array
     2275 */
     2276function bp_core_get_tax_sql( $tax_query = array(), $primary_table = '', $primary_id_column ='' ) {
     2277        return BP_Terms::get_tax_sql( $tax_query, $primary_table, $primary_id_column );
     2278}
     2279 No newline at end of file
  • src/bp-core/bp-core-template.php

     
    19221922 * @return True if the current page is the groups directory.
    19231923 */
    19241924function bp_is_groups_directory() {
    1925         if ( bp_is_groups_component() && ! bp_current_action() && ! bp_current_item() )
     1925        if ( bp_is_groups_component() && ! bp_current_action() && ! bp_current_item() ) {
    19261926                return true;
     1927        }
     1928
     1929        if ( bp_is_groups_component() && bp_is_groups_tag() ) {
     1930                return true;
     1931        }
     1932
     1933        return false;
     1934}
     1935
     1936/**
     1937 * Is the current page a groups tag page?
     1938 *
     1939 * @since BuddyPress (2.1.0)
     1940 *
     1941 * @return True if the current page is a groups tag page.
     1942 */
     1943function bp_is_groups_tag() {
     1944        if ( ! empty( buddypress()->groups->tag ) ) {
     1945                return true;
     1946        }
    19271947
    19281948        return false;
    19291949}
     
    26852705        else
    26862706                return $nav_menu;
    26872707}
     2708
     2709/**
     2710 * Display BuddyPress item tags form fields.
     2711 *
     2712 * An adapted copy of WordPress post_tags_meta_box()
     2713 * to avoid including the meta-boxes.php file and to
     2714 * be able to use in group edit/create/admin screens
     2715 *
     2716 * @since BuddyPress (2.1.0)
     2717 *
     2718 * @param Object BuddyPress item (such as BP_Groups_Group)
     2719 * @param array   $box {
     2720 *     Tags meta box arguments.
     2721 *
     2722 *     @type string   $id       Meta box ID.
     2723 *     @type string   $title    Meta box title.
     2724 *     @type callback $callback Meta box display callback.
     2725 *     @type array    $args {
     2726 *         Extra meta box arguments.
     2727 *
     2728 *         @type string $taxonomy Taxonomy. Default 'bp_group_tags'.
     2729 *     }
     2730 * }
     2731 */
     2732function bp_tags_meta_box( $item, $box ) {
     2733        $defaults = array( 'taxonomy' => 'bp_group_tags' );
     2734
     2735        if ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) {
     2736                $args = array();
     2737        } else {
     2738                $args = $box['args'];
     2739        }
     2740
     2741        $r = wp_parse_args( $args, $defaults );
     2742        $tax = $r['taxonomy'];
     2743        $tax_name = esc_attr( $tax );
     2744        $taxonomy = get_taxonomy( $tax );
     2745        $user_can_assign_terms = bp_current_user_can( $taxonomy->cap->assign_terms );
     2746        $comma = _x( ',', 'tag delimiter', 'buddypress' );
     2747        ?>
     2748        <div class="tagsdiv" id="<?php echo $tax_name; ?>">
     2749                <div class="jaxtag">
     2750                <div class="nojs-tags hide-if-js">
     2751                <p><?php echo $taxonomy->labels->add_or_remove_items; ?></p>
     2752                <textarea name="<?php echo "tax_input[$tax_name]"; ?>" rows="3" cols="20" class="the-tags" id="tax-input-<?php echo $tax_name; ?>" <?php disabled( ! $user_can_assign_terms ); ?>><?php echo str_replace( ',', $comma . ' ', bp_core_get_terms_to_edit( $item->id, $tax_name ) ); // textarea_escaped by esc_attr() ?></textarea></div>
     2753                <?php if ( $user_can_assign_terms ) : ?>
     2754                <div class="ajaxtag hide-if-no-js">
     2755                        <label class="screen-reader-text" for="new-tag-<?php echo $tax_name; ?>"><?php echo $box['title']; ?></label>
     2756                        <div class="taghint"><?php echo $taxonomy->labels->add_new_item; ?></div>
     2757                        <p><input type="text" id="new-tag-<?php echo $tax_name; ?>" name="newtag[<?php echo $tax_name; ?>]" class="newtag form-input-tip" size="16" autocomplete="off" value="" />
     2758                        <input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" /></p>
     2759                </div>
     2760                <p class="howto"><?php echo $taxonomy->labels->separate_items_with_commas; ?></p>
     2761                <?php endif; ?>
     2762                </div>
     2763                <div class="tagchecklist"></div>
     2764        </div>
     2765        <?php if ( $user_can_assign_terms ) : ?>
     2766        <p class="hide-if-no-js"><a href="#titlediv" class="tagcloud-link" id="link-<?php echo $tax_name; ?>"><?php echo $taxonomy->labels->choose_from_most_used; ?></a></p>
     2767        <?php endif;
     2768}
     2769 No newline at end of file
  • new file src/bp-core/css/tagbox.css

    new file mode 100644
    - +  
     1.bp-tag-editor {
     2        overflow: hidden;
     3}
     4
     5.bp-tag-editor .hide-if-js {
     6        display:none;
     7}
     8
     9.tagchecklist {
     10        margin-left: 14px;
     11        font-size: 12px;
     12        overflow: auto;
     13        margin-bottom:15px;
     14}
     15
     16.tagchecklist br {
     17        display: none;
     18}
     19
     20.tagchecklist strong {
     21        margin-left: -8px;
     22        position: absolute;
     23}
     24
     25.tagchecklist span {
     26        margin-right: 25px;
     27        display: block;
     28        float: left;
     29        font-size: 13px;
     30        line-height: 1.8em;
     31        white-space: nowrap;
     32        cursor: default;
     33}
     34
     35.tagchecklist span a {
     36        margin: 1px 0 0 -10px;
     37        cursor: pointer;
     38        width: 20px;
     39        height: 20px;
     40        display: block;
     41        float: left;
     42        text-indent: 0;
     43        overflow: hidden;
     44        position: absolute;
     45        color: #555;
     46        font-weight:bold;
     47        font-size: 90%;
     48}
     49
     50.tagsdiv {
     51        margin-top: -8px;
     52}
     53
     54.taghint {
     55        color: #aaa;
     56        margin: 15px 0 -24px 12px;
     57}
     58
     59.tagsdiv .howto {
     60        margin: 0 0 6px 0;
     61}
     62
     63.ajaxtag .newtag {
     64        position: relative;
     65}
     66
     67.tagsdiv .newtag {
     68        width: 180px;
     69}
     70
     71.tagsdiv .the-tags {
     72        display: block;
     73        height: 60px;
     74        margin: 0 auto;
     75        overflow: auto;
     76        width: 260px;
     77}
     78
     79body.buddypress .tagsdiv .the-tags {
     80        margin: 0 5px;
     81}
     82
     83/* tag hints */
     84.taghint {
     85        color: #aaa;
     86        margin: -17px 0 0 7px;
     87        visibility: hidden;
     88}
     89
     90input.newtag ~ div.taghint {
     91        visibility: visible;
     92}
     93
     94input.newtag:focus ~ div.taghint {
     95        visibility: hidden;
     96}
     97
     98p.popular-tags {
     99        border: none;
     100        line-height: 2em;
     101        max-width: 1000px;
     102        padding: 8px 12px 12px;
     103        text-align: justify;
     104}
     105
     106p.popular-tags a {
     107        padding: 0 3px;
     108}
     109
     110.tagcloud {
     111        width: 97%;
     112        margin: 0 0 40px;
     113        text-align: justify;
     114}
     115
     116.tagcloud h3 {
     117        margin: 2px 0 12px;
     118}
     119
     120.ac_results {
     121        padding: 0;
     122        margin: 0;
     123        list-style: none;
     124        position: absolute;
     125        z-index: 10000;
     126        display: none;
     127        border: 1px solid #808080;
     128        background-color: #fff;
     129}
     130
     131body.buddypress .ac_results {
     132        z-index: 500000;
     133}
     134
     135.ac_results li {
     136        padding: 2px 5px;
     137        white-space: nowrap;
     138        color: #101010;
     139        text-align: left;
     140}
     141
     142.ac_over {
     143        background-color: #f0f0b8;
     144        cursor: pointer;
     145}
  • new file src/bp-core/js/tagbox.js

    new file mode 100644
    - +  
     1// return an array with any duplicate, whitespace or values removed
     2function array_unique_noempty(a) {
     3        var out = [];
     4        jQuery.each( a, function(key, val) {
     5                val = jQuery.trim(val);
     6                if ( val && jQuery.inArray(val, out) == -1 )
     7                        out.push(val);
     8                } );
     9        return out;
     10}
     11
     12( function($) {
     13        var titleHasFocus = false;
     14
     15        tagBox = {
     16                clean : function(tags) {
     17                        var comma = tagvars.comma;
     18                        if ( ',' !== comma )
     19                                tags = tags.replace(new RegExp(comma, 'g'), ',');
     20                        tags = tags.replace(/\s*,\s*/g, ',').replace(/,+/g, ',').replace(/[,\s]+$/, '').replace(/^[,\s]+/, '');
     21                        if ( ',' !== comma )
     22                                tags = tags.replace(/,/g, comma);
     23                        return tags;
     24                },
     25
     26                parseTags : function(el) {
     27                        var id = el.id, num = id.split('-check-num-')[1], taxbox = $(el).closest('.tagsdiv'),
     28                                thetags = taxbox.find('.the-tags'), comma = tagvars.comma,
     29                                current_tags = thetags.val().split(comma), new_tags = [];
     30                        delete current_tags[num];
     31
     32                        $.each( current_tags, function(key, val) {
     33                                val = $.trim(val);
     34                                if ( val ) {
     35                                        new_tags.push(val);
     36                                }
     37                        });
     38
     39                        thetags.val( this.clean( new_tags.join(comma) ) );
     40
     41                        this.quickClicks(taxbox);
     42                        return false;
     43                },
     44
     45                quickClicks : function(el) {
     46                        var thetags = $('.the-tags', el),
     47                                tagchecklist = $('.tagchecklist', el),
     48                                id = $(el).attr('id'),
     49                                current_tags, disabled;
     50
     51                        if ( !thetags.length )
     52                                return;
     53
     54                        disabled = thetags.prop('disabled');
     55
     56                        current_tags = thetags.val().split(tagvars.comma);
     57                        tagchecklist.empty();
     58
     59                        $.each( current_tags, function( key, val ) {
     60                                var span, xbutton;
     61
     62                                val = $.trim( val );
     63
     64                                if ( ! val )
     65                                        return;
     66
     67                                // Create a new span, and ensure the text is properly escaped.
     68                                span = $('<span />').text( val );
     69
     70                                // If tags editing isn't disabled, create the X button.
     71                                if ( ! disabled ) {
     72                                        xbutton = $( '<a id="' + id + '-check-num-' + key + '" class="ntdelbutton">X</a>' );
     73                                        xbutton.click( function(){ tagBox.parseTags(this); });
     74                                        span.prepend('&nbsp;').prepend( xbutton );
     75                                }
     76
     77                                // Append the span to the tag list.
     78                                tagchecklist.append( span );
     79                        });
     80                },
     81
     82                flushTags : function(el, a, f) {
     83                        var tagsval, newtags, text,
     84                                tags = $('.the-tags', el),
     85                                newtag = $('input.newtag', el),
     86                                comma = tagvars.comma;
     87                        a = a || false;
     88
     89                        text = a ? $(a).text() : newtag.val();
     90                        tagsval = tags.val();
     91                        newtags = tagsval ? tagsval + comma + text : text;
     92
     93                        newtags = this.clean( newtags );
     94                        newtags = array_unique_noempty( newtags.split(comma) ).join(comma);
     95                        tags.val(newtags);
     96                        this.quickClicks(el);
     97
     98                        if ( !a )
     99                                newtag.val('');
     100                        if ( 'undefined' == typeof(f) )
     101                                newtag.focus();
     102
     103                        return false;
     104                },
     105
     106                get : function(id) {
     107                        var tax = id.substr(id.indexOf('-')+1);
     108
     109                        $.post(ajaxurl, {'action':'get-tagcloud', 'tax':tax}, function(r, stat) {
     110                                if ( 0 === r || 'success' != stat )
     111                                        r = wpAjax.broken;
     112
     113                                r = $('<p id="tagcloud-'+tax+'" class="the-tagcloud">'+r+'</p>');
     114                                $('a', r).click(function(){
     115                                        tagBox.flushTags( $(this).closest('.inside').children('.tagsdiv'), this);
     116                                        return false;
     117                                });
     118
     119                                $('#'+id).after(r);
     120                        });
     121                },
     122
     123                init : function() {
     124                        var t = this, ajaxtag = $('div.ajaxtag');
     125
     126                        $('.tagsdiv').each( function() {
     127                                tagBox.quickClicks(this);
     128                        });
     129
     130                        $('input.tagadd', ajaxtag).click(function(){
     131                                t.flushTags( $(this).closest('.tagsdiv') );
     132                        });
     133
     134                        $('div.taghint', ajaxtag).click(function(){
     135                                $(this).css('visibility', 'hidden').parent().siblings('.newtag').focus();
     136                        });
     137
     138                        $('input.newtag', ajaxtag).blur(function() {
     139                                if ( '' === this.value )
     140                                        $(this).parent().siblings('.taghint').css('visibility', '');
     141                        }).focus(function(){
     142                                $(this).parent().siblings('.taghint').css('visibility', 'hidden');
     143                        }).keyup(function(e){
     144                                if ( 13 == e.which ) {
     145                                        tagBox.flushTags( $(this).closest('.tagsdiv') );
     146                                        return false;
     147                                }
     148                        }).keypress(function(e){
     149                                if ( 13 == e.which ) {
     150                                        e.preventDefault();
     151                                        return false;
     152                                }
     153                        }).each(function(){
     154                                var tax = $(this).closest('div.tagsdiv').attr('id');
     155                                $(this).suggest( ajaxurl + '?action=ajax-tag-search&tax=' + tax, { delay: 500, minchars: 2, multiple: true, multipleSep: tagvars.comma + ' ' } );
     156                        });
     157
     158                        // save tags on group save
     159                        $('#post, #group-settings-form, #create-group-form').submit(function(){
     160                                $('div.tagsdiv').each( function() {
     161                                        tagBox.flushTags(this, false, 1);
     162                                });
     163                        });
     164
     165                        // tag cloud
     166                        $('a.tagcloud-link').click(function(){
     167                                tagBox.get( $(this).attr('id') );
     168                                $(this).unbind().click(function(){
     169                                        $(this).siblings('.the-tagcloud').toggle();
     170                                        return false;
     171                                });
     172                                return false;
     173                        });
     174                }
     175        };
     176
     177        if ( $( '#tagsdiv-bp_group_tags' ).length ) {
     178                tagBox.init();
     179        } else {
     180                $('#side-sortables, #normal-sortables, #advanced-sortables').children('div.postbox').each(function(){
     181                        if ( this.id.indexOf('tagsdiv-') === 0 ) {
     182                                tagBox.init();
     183                                return false;
     184                        }
     185                });
     186        }
     187
     188}(jQuery));
  • src/bp-groups/admin/css/admin.css

     
    1 body.toplevel_page_bp-groups table.groups th#status,
    2 body.toplevel_page_bp-groups table.groups th#members {
     1#bp-groups-form #status,
     2#bp-groups-form #members {
    33        width: 10%;
    44}
    5 
    6 body.toplevel_page_bp-groups table.groups th#last_active {
     5#bp-groups-form #last_active,
     6#bp-groups-form #tag {
    77        width: 15%;
    88}
    99
  • src/bp-groups/admin/js/admin.js

     
    11/* global BP_Group_Admin, group_id, isRtl */
    22
    33(function($) {
     4
     5        if ( $( 'body.groups_page_bp-group-tags #edittag' ).length ) {
     6                $( '#edittag' ).prop( 'action', BP_Group_Admin.edit_action );
     7                return;
     8        }
     9
    410        function add_member_to_list( e, ui ) {
    511                $('#bp-groups-new-members-list').append('<li data-login="' + ui.item.value + '"><a href="#" class="bp-groups-remove-new-member">x</a> ' + ui.item.label + '</li>');
    612        }
  • src/bp-groups/bp-groups-actions.php

     
    8585
    8686                        $new_group_id = isset( $bp->groups->new_group_id ) ? $bp->groups->new_group_id : 0;
    8787
    88                         if ( !$bp->groups->new_group_id = groups_create_group( array( 'group_id' => $new_group_id, 'name' => $_POST['group-name'], 'description' => $_POST['group-desc'], 'slug' => groups_check_slug( sanitize_title( esc_attr( $_POST['group-name'] ) ) ), 'date_created' => bp_core_current_time(), 'status' => 'public' ) ) ) {
     88                        if ( ! $bp->groups->new_group_id = groups_create_group( array( 'group_id' => $new_group_id, 'name' => $_POST['group-name'], 'description' => $_POST['group-desc'], 'slug' => groups_check_slug( sanitize_title( esc_attr( $_POST['group-name'] ) ) ), 'date_created' => bp_core_current_time(), 'status' => 'public' ) ) ) {
    8989                                bp_core_add_message( __( 'There was an error saving group details, please try again.', 'buddypress' ), 'error' );
    9090                                bp_core_redirect( bp_get_root_domain() . '/' . bp_get_groups_root_slug() . '/create/step/' . bp_get_groups_current_create_step() . '/' );
     91                        } else {
     92                                if ( ! empty( $_POST['tax_input'] ) ) {
     93                                        bp_groups_set_taxonomy( $_POST['tax_input'], $bp->groups->new_group_id );
     94                                }
    9195                        }
    9296                }
    9397
     
    398402        ) );
    399403}
    400404add_action( 'bp_actions', 'groups_action_group_feed' );
     405
     406/**
     407 * Load the JS for the tagbox.
     408 *
     409 * @since BuddyPress (2.1.0)
     410 */
     411function bp_groups_tagbox_js() {
     412        if ( is_multisite() && ! bp_is_root_blog() ) {
     413                return false;
     414        }
     415
     416        if ( ! ( bp_is_group_create() && 'group-details' == bp_get_groups_current_create_step() ) && ! ( bp_is_group_admin_page() && 'edit-details' == bp_get_group_current_admin_tab() && bp_is_item_admin() ) ) {
     417                return false;
     418        }
     419
     420        $bp = buddypress();
     421
     422        // Decide whether to load the dev version of the CSS and JavaScript
     423        $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : 'min.';
     424
     425        wp_enqueue_style( 'bp-tagbox-css', $bp->plugin_url . "bp-core/css/tagbox.{$min}css", array(), bp_get_version() );
     426        wp_enqueue_script( 'bp-tagbox-js', $bp->plugin_url . "bp-core/js/tagbox.{$min}js", array( 'suggest', 'wp-ajax-response' ), bp_get_version(), true  );
     427
     428        wp_localize_script( 'bp-tagbox-js', 'tagvars', array(
     429                'comma' => _x( ',', 'tag delimiter', 'buddypress' ),
     430        ) );
     431}
     432add_action( 'bp_enqueue_scripts', 'bp_groups_tagbox_js' );
     433
     434/**
     435 * Set the groups current tag.
     436 *
     437 * @since BuddyPress (2.1.0)
     438 */
     439function bp_groups_directory_set_current_tag() {
     440        $bp = buddypress();
     441
     442        if ( bp_is_groups_component() && empty( $bp->groups->current_group ) && bp_is_current_action( bp_get_groups_tag_slug() ) ) {
     443                $bp->groups->tag = bp_core_get_term_by( 'slug', bp_action_variable( 0 ), 'bp_group_tags' );
     444        }
     445}
     446add_action( 'bp_init', 'bp_groups_directory_set_current_tag', 10 );
  • src/bp-groups/bp-groups-admin.php

     
    2626 * @since BuddyPress (1.7.0)
    2727 */
    2828function bp_groups_add_admin_menu() {
     29        $menu = false;
    2930
    3031        // Add our screen
    31         $hook = add_menu_page(
    32                 __( 'Groups', 'buddypress' ),
    33                 __( 'Groups', 'buddypress' ),
    34                 'bp_moderate',
     32        if ( is_network_admin() || bp_is_root_blog() ) {
     33                $menu = add_menu_page(
     34                        __( 'Groups', 'buddypress' ),
     35                        __( 'Groups', 'buddypress' ),
     36                        'bp_moderate',
     37                        'bp-groups',
     38                        'bp_groups_admin',
     39                        'div'
     40                );
     41        }
     42
     43        // Do not proceed if we did not register the "Groups" menu
     44        if ( false === $menu ) {
     45                return;
     46        }
     47
     48        // @see bp_groups_network_admin_tags_redirect()
     49        if ( is_network_admin() ) {
     50                $tags_url = 'admin.php?page=bp-groups&amp;bp-grouptags-redirect=1';
     51        } else {
     52                $tags_url = bp_groups_admin_get_group_tags_path();
     53        }
     54
     55        // register our "Groups > Group Tags" submenu item
     56        add_submenu_page(
    3557                'bp-groups',
    36                 'bp_groups_admin',
    37                 'div'
     58                __( 'Group Tags', 'buddypress' ),
     59                __( 'Group Tags', 'buddypress' ),
     60                'bp_moderate',
     61                $tags_url
    3862        );
    3963
    4064        // Hook into early actions to load custom CSS and our init handler.
    41         add_action( "load-$hook", 'bp_groups_admin_load' );
     65        add_action( "load-$menu", 'bp_groups_admin_load' );
     66
     67        // Add our redirect hook for the network admin area
     68        add_action( "load-$menu", 'bp_groups_network_admin_tags_redirect' );
     69
     70}
     71add_action( 'admin_menu',         'bp_groups_add_admin_menu' );
     72add_action( 'network_admin_menu', 'bp_groups_add_admin_menu' );
     73
     74/**
     75 * Redirect to root blog version of "Groups > Group Tags" from network admin.
     76 *
     77 * The network admin area does not have a taxonomy page, so when a super admin
     78 * clicks on the "Groups > Group Tags" item in the network admin area, this
     79 * function redirects this request to the root blog's version of the "Groups
     80 * > Group Tags" page.
     81 *
     82 * @since BuddyPress (2.1.0)
     83 *
     84 * @see bp_groups_add_admin_menu()
     85 */
     86function bp_groups_network_admin_tags_redirect() {
     87        if ( ! is_network_admin() ) {
     88                return;
     89        }
     90
     91        if ( empty( $_GET['bp-grouptags-redirect'] ) ) {
     92                return;
     93        }
     94
     95        wp_redirect( get_admin_url( bp_get_root_blog_id(), bp_groups_admin_get_group_tags_path() ) );
     96        exit();
     97}
     98
     99/**
     100 * Relative path to the "Groups > Group Tags" page.
     101 *
     102 * @since BuddyPress (2.1.0)
     103 *
     104 * @return string
     105 */
     106function bp_groups_admin_get_group_tags_path() {
     107        return 'edit-tags.php?taxonomy=bp_group_tags&post_type=bp_group';
     108}
     109
     110/**
     111 * Highlight the proper top level menu when on the "Groups > Group Tags" page.
     112 *
     113 * Since we want to add our group tags page under the "Groups" menu page, to
     114 * highlight the "Groups" page, we need to manually filter the "parent_file"
     115 * so WP knows about this.
     116 *
     117 * @since BuddyPress (2.1.0)
     118 *
     119 * @param string $parent_file The current parent file
     120 * @return string
     121 */
     122function bp_groups_admin_tags_highlight_menu( $parent_file ) {
     123        global $current_screen, $submenu_file;
     124
     125        // if taxonomy is 'bp_group_tags', set parent file to the "Groups" page
     126        if ( 'bp_group_tags' === $current_screen->taxonomy ) {
     127                $parent_file = 'bp-groups';
     128
     129                // highlight the 'Group Tags' menu item
     130                $submenu_file = bp_groups_admin_get_group_tags_path();
     131        }
     132
     133        return $parent_file;
     134}
     135add_action( 'parent_file', 'bp_groups_admin_tags_highlight_menu' );
     136
     137/**
     138 * Inject some code into the <head> when on the "Groups > Group Tags" page.
     139 *
     140 * We need to modify the labels for the taxonomy table.
     141 *
     142 * @see http://wordpress.stackexchange.com/questions/71865/nuance-in-adding-cpt-and-tax-to-a-submenu
     143 */
     144function bp_groups_tags_admin_head() {
     145        global $current_screen, $wp_post_types;
     146
     147        // Not our taxonomy? stop now!
     148        if( 'bp_group_tags' != $current_screen->taxonomy ) {
     149                return;
     150        }
     151
     152        // Check if we're on the edit tags page
     153        if ( 'edit-tags' != $current_screen->base ) {
     154                return;
     155        }
     156
     157        // Since our post type doesn't really exist, we need to fool WP into thinking
     158        // it really exists to avoid notices. So the following is a little tomfoolery!
     159        $faux_post_type = 'bp_group';
     160        $current_screen->post_type = $faux_post_type;
     161
     162        $wp_post_types[$faux_post_type] = new stdClass;
     163        $wp_post_types[$faux_post_type]->show_ui = true;
     164        $wp_post_types[$faux_post_type]->labels  = new stdClass;
     165        $wp_post_types[$faux_post_type]->labels->name = __( 'Tags', 'buddypress' );
    42166}
    43 add_action( bp_core_admin_hook(), 'bp_groups_add_admin_menu' );
     167add_action( 'admin_head-edit-tags.php', 'bp_groups_tags_admin_head' );
    44168
    45169/**
    46170 * Add groups component to custom menus array.
     
    126250                add_meta_box( 'bp_group_add_members', _x( 'Add New Members', 'group admin edit screen', 'buddypress' ), 'bp_groups_admin_edit_metabox_add_new_members', get_current_screen()->id, 'normal', 'core' );
    127251                add_meta_box( 'bp_group_members', _x( 'Manage Members', 'group admin edit screen', 'buddypress' ), 'bp_groups_admin_edit_metabox_members', get_current_screen()->id, 'normal', 'core' );
    128252
     253                // Group tags metabox
     254                $taxonomy = get_taxonomy( 'bp_group_tags' );
     255                // meta_box_cb argument of register_taxonomy was introduced in WordPress 3.8
     256                if ( 'bp_group_tags' == $taxonomy->name && ( empty( $taxonomy->meta_box_cb ) || 'bp_tags_meta_box' != $taxonomy->meta_box_cb ) ) {
     257                        $taxonomy->meta_box_cb = 'bp_tags_meta_box';
     258                }
     259
     260                $tax_meta_box_id = 'tagsdiv-' . $taxonomy->name;
     261                add_meta_box( $tax_meta_box_id, $taxonomy->labels->name, $taxonomy->meta_box_cb, get_current_screen()->id, 'side', 'core', array( 'taxonomy' => $taxonomy->name ) );
     262                wp_enqueue_script( 'bp-tagbox-js', buddypress()->plugin_url . "bp-core/js/tagbox.{$min}js", array( 'suggest', 'wp-ajax-response' ), bp_get_version(), true  );
     263                wp_localize_script( 'bp-tagbox-js', 'tagvars', array(
     264                        'comma' => _x( ',', 'tag delimiter', 'buddypress' ),
     265                ) );
     266
    129267                do_action( 'bp_groups_admin_meta_boxes' );
    130268
    131269                // Enqueue javascripts
     
    333471                        }
    334472                }
    335473
     474                // Set group tags
     475                if ( ! empty( $_POST['tax_input'] ) ) {
     476                        bp_groups_set_taxonomy( $_POST['tax_input'], $group_id );
     477                }
     478
    336479                // Call actions for plugins to do something before we redirect
    337480                do_action( 'bp_group_admin_edit_after', $group_id );
    338481
     
    13021445                        'comment'     => _x( 'Name', 'Groups admin Group Name column header',               'buddypress' ),
    13031446                        'description' => _x( 'Description', 'Groups admin Group Description column header', 'buddypress' ),
    13041447                        'status'      => _x( 'Status', 'Groups admin Privacy Status column header',         'buddypress' ),
     1448                        'tag'         => _x( 'Tags', 'Groups admin Tags column header',                     'buddypress' ),
    13051449                        'members'     => _x( '# Members', 'Groups admin Members column header',             'buddypress' ),
    13061450                        'last_active' => _x( 'Last Active', 'Groups admin Last Active column header',       'buddypress' )
    13071451                ) );
     
    14591603        }
    14601604
    14611605        /**
     1606         * Markup for the Tags column.
     1607         *
     1608         * @since BuddyPress (2.1.0)
     1609         *
     1610         * @param array Information about the current row.
     1611         */
     1612        public function column_tag( $item = array() ) {
     1613                $tags = bp_core_get_the_term_list( $item['id'], 'bp_group_tags', '', ', ', '' );
     1614
     1615                if ( $tags ) {
     1616                        echo $tags;
     1617                } else {
     1618                        echo '&#8212';
     1619                }
     1620        }
     1621
     1622        /**
    14621623         * Markup for the Number of Members column.
    14631624         *
    14641625         * @since BuddyPress (1.7.0)
  • src/bp-groups/bp-groups-classes.php

     
    670670                        'user_id'           => 0,
    671671                        'search_terms'      => false,
    672672                        'meta_query'        => false,
     673                        'tax_query'         => false,
    673674                        'include'           => false,
    674675                        'populate_extras'   => true,
    675676                        'update_meta_cache' => true,
     
    716717                        $sql['meta'] = $meta_query_sql['where'];
    717718                }
    718719
     720                /** Tax Query ************************************************/
     721                $tax_query_sql = self::get_tax_query_sql( $r['tax_query'] );
     722
     723                if ( ! empty( $tax_query_sql['join'] ) ) {
     724                        $sql['from'] .= $tax_query_sql['join'];
     725                }
     726
     727                if ( ! empty( $tax_query_sql['where'] ) ) {
     728                        $sql['tax'] = $tax_query_sql['where'];
     729                }
     730
    719731                if ( ! empty( $r['user_id'] ) ) {
    720732                        $sql['user'] = $wpdb->prepare( " AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0", $r['user_id'] );
    721733                }
     
    802814                        $total_sql['where'][] = $meta_query_clause;
    803815                }
    804816
     817                if ( ! empty( $tax_query_sql['where'] ) ) {
     818                        // Join the taxonomy table
     819                        $total_sql['select'] .= ", ". substr( $tax_query_sql['join'], 0, -2 );
     820
     821                        // Modify the tax_query clause from paged_sql for our syntax
     822                        $tax_query_clause = preg_replace( '/^\s*AND/', '', $tax_query_sql['where'] );
     823                        $total_sql['where'][] = $tax_query_clause;
     824                }
     825
    805826                // Already escaped in the paginated results block
    806827                if ( ! empty( $include ) ) {
    807828                        $total_sql['where'][] = "g.id IN ({$include})";
     
    911932        }
    912933
    913934        /**
     935         * Get the SQL for the 'tax_query' param in BP_Groups_Group::get()
     936         *
     937         * We use WP_Tax_Query to do the heavy lifting of parsing the
     938         * meta_query array and creating the necessary SQL clauses. However,
     939         * since BP_Groups_Group::get() builds its SQL differently than
     940         * WP_Query, we have to alter the return value
     941         *
     942         * @since BuddyPress (2.1.0)
     943         * @access protected
     944         *
     945         * @param array $tax_query An array of tax_query filters. See the
     946         *        documentation for {@link WP_Tax_Query} for details.
     947         * @return array $sql_array 'join' and 'where' clauses.
     948         */
     949        protected static function get_tax_query_sql( $tax_query = array() ) {
     950                $sql_array = array(
     951                        'join'  => '',
     952                        'where' => '',
     953                );
     954
     955                if ( empty( $tax_query ) ) {
     956                        return $sql_array;
     957                }
     958
     959                $clauses = bp_core_get_tax_sql( $tax_query, 'g', 'id' );
     960
     961                /**
     962                 * BP_Groups_Group::get() uses the comma syntax for table joins
     963                 * meaning we need to do some parsing to adjust..
     964                 */
     965                $inner_joins = explode( 'INNER JOIN', $clauses['join'] );
     966
     967                foreach( $inner_joins as $key => $part ) {
     968                        preg_match( '/(.*) ON/', $part, $matches_a );
     969                        if ( ! empty( $matches_a[1] ) ) {
     970                                $sql_array['join'][] = $matches_a[1];
     971                        }
     972                        preg_match( '/ON \((.*)\)/', $part, $matches_b );
     973                        if ( ! empty( $matches_b[1] ) ) {
     974                                $sql_array['where'][] = $matches_b[1];
     975                        }
     976                }
     977                $sql_array['where'] = array_merge( $sql_array['where'], array( str_replace( ' AND ', '', $clauses['where'] ) ) );
     978
     979                $sql_array['join']  = implode( ',', $sql_array['join'] ). ', ';
     980                $sql_array['where'] = ' AND ' . implode( ' AND ', $sql_array['where'] );
     981
     982                return $sql_array;
     983        }
     984
     985        /**
    914986         * Convert the 'type' parameter to 'order' and 'orderby'.
    915987         *
    916988         * @since BuddyPress (1.8.0)
  • src/bp-groups/bp-groups-filters.php

     
    205205        return apply_filters( 'groups_filter_bbpress_root_page_sql', 't.topic_id' );
    206206}
    207207add_filter( 'get_latest_topics_fields', 'groups_filter_forums_root_page_sql' );
     208
     209/**
     210 * Allow Group Creators/ Admins to assign group tags.
     211 *
     212 * @since BuddyPress (2.1.0)
     213 *
     214 * @see WP_User::has_cap()
     215 *
     216 * @param array $caps The caps that WP associates with the given role.
     217 * @param array $cap The cap being tested for in WP_User::has_cap().
     218 * @param integer $user_id the current user id
     219 * @param array $args Miscellaneous arguments passed to the user_has_cap filter.
     220 * @return array $caps the needed cap
     221 */
     222function bp_groups_tags_cap( $caps = array(), $cap = '', $user_id = 0, $args = array() ) {
     223
     224        switch( $cap ) {
     225                case 'assign_group_tags' :
     226                        // Members in multisite have no roles
     227                        if ( ( bp_is_group_create() && is_user_logged_in() ) || bp_is_item_admin() ) {
     228                                $caps = array( 'exist' );
     229                        }
     230                        break;
     231        }
     232
     233        return $caps;
     234}
     235add_filter( 'bp_map_meta_caps', 'bp_groups_tags_cap', 10, 4 );
     236
     237/**
     238 * Count text callback for the "bp_group_tags" widget tag cloud
     239 *
     240 * @since BuddyPress (2.1.0)
     241 *
     242 * @param array $args arguments passed to the wp_tag_cloud widget.
     243 * @return array $args with the callback if relevant
     244 */
     245function bp_groups_widget_tag_cloud_args( $args = array() ) {
     246        if ( ! empty( $args['taxonomy'] ) && 'bp_group_tags' == $args['taxonomy'] ) {
     247                $args['topic_count_text_callback'] = 'bp_groups_tag_cloud_count_text_callback';
     248        }
     249
     250        return $args;
     251}
     252add_filter( 'widget_tag_cloud_args', 'bp_groups_widget_tag_cloud_args', 10, 1 );
  • src/bp-groups/bp-groups-functions.php

     
    241241        // Remove all outstanding invites for this group
    242242        groups_delete_all_group_invites( $group_id );
    243243
     244        // Remove Group Tags relationships
     245        bp_core_delete_object_term_relationships( $group_id, 'bp_group_tags' );
     246
    244247        do_action( 'groups_delete_group', $group_id );
    245248
    246249        return true;
     
    513516                'exclude'           => false,    // Do not include these specific groups (group_ids)
    514517                'search_terms'      => false,    // Limit to groups that match these search terms
    515518                'meta_query'        => false,    // Filter by groupmeta. See WP_Meta_Query for syntax
     519                'tax_query'         => false,
    516520                'show_hidden'       => false,    // Show hidden groups to non-admins
    517521                'per_page'          => 20,       // The number of results to return per page
    518522                'page'              => 1,        // The page to return if limiting per page
     
    529533                'exclude'           => $r['exclude'],
    530534                'search_terms'      => $r['search_terms'],
    531535                'meta_query'        => $r['meta_query'],
     536                'tax_query'         => $r['tax_query'],
    532537                'show_hidden'       => $r['show_hidden'],
    533538                'per_page'          => $r['per_page'],
    534539                'page'              => $r['page'],
     
    11531158add_action( 'wpmu_delete_user',  'groups_remove_data_for_user' );
    11541159add_action( 'delete_user',       'groups_remove_data_for_user' );
    11551160add_action( 'bp_make_spam_user', 'groups_remove_data_for_user' );
     1161
     1162/* Group Tags *****************************************************************/
     1163
     1164/**
     1165 * Set group tags
     1166 *
     1167 * @since BuddyPress (2.1.0)
     1168 *
     1169 * @param array $taxonomies
     1170 * @param integer $group_id
     1171 * @return true on success, false on failure
     1172 */
     1173function bp_groups_set_taxonomy( $taxonomies = array(), $group_id = 0 ) {
     1174        $retval = true;
     1175
     1176        if ( empty( $group_id ) ) {
     1177                return false;
     1178        }
     1179
     1180        foreach ( $taxonomies as $taxonomy => $tags ) {
     1181                $taxonomy_obj = get_taxonomy( $taxonomy );
     1182
     1183                if ( is_array( $tags ) ) {
     1184                        $tags = array_filter( $tags );
     1185                } else {
     1186                        $comma = _x( ',', 'tag delimiter', 'buddypress' );
     1187                        if ( ',' !== $comma ){
     1188                                $tags = str_replace( $comma, ',', $tags );
     1189                        }
     1190
     1191                        $tags = explode( ',', trim( $tags, " \n\t\r\0\x0B," ) );
     1192                }
     1193                if ( bp_current_user_can( $taxonomy_obj->cap->assign_terms ) ) {
     1194                        $result = bp_core_set_object_terms( $group_id, $tags, $taxonomy );
     1195
     1196                        if ( is_wp_error( $result ) ) {
     1197                                $retval = false;
     1198                        }
     1199                }
     1200        }
     1201
     1202        return $retval;
     1203}
     1204
     1205/**
     1206 * Set tag cloud count text callback
     1207 *
     1208 * @since BuddyPress (2.1.0)
     1209 *
     1210 * @param integer $count
     1211 * @return string the count text callback
     1212 */
     1213function bp_groups_tag_cloud_count_text_callback( $count = 0 ) {
     1214        return sprintf( _n( '%d Group', '%d Groups', $count, 'buddypress' ), $count );
     1215}
     1216
     1217/**
     1218 * Add 'Tags' tab to groups directory page when we're on a group tag page.
     1219 *
     1220 * @since BuddyPress (2.1.0)
     1221 */
     1222function bp_groups_tag_add_directory_tab() {
     1223        if ( ! bp_is_groups_tag() ) {
     1224                return;
     1225        }
     1226?>
     1227
     1228        <li id="groups-tag"><a href="<?php echo bp_get_groups_directory_permalink() . bp_get_groups_tag_slug() . '/' . urldecode( esc_attr( buddypress()->groups->tag->slug ) ) . '/'; ?>" ><?php _ex( 'Tags', 'Group directory tab', 'buddypress' ); ?></a></li>
     1229<?php
     1230}
     1231add_action( 'bp_groups_directory_group_filter', 'bp_groups_tag_add_directory_tab', 0 );
     1232
     1233/**
     1234 * Set group loop scope when on a group tag page.
     1235 *
     1236 * @since BuddyPress (2.1.0)
     1237 */
     1238function bp_groups_tag_set_scope() {
     1239        // group tag page
     1240        if ( bp_is_groups_tag() ) {
     1241
     1242                // set scope to tag
     1243                $_POST['cookie'] = 'bp-groups-scope%3Dtag%3B%20bp-groups-filter%3D-1';
     1244
     1245                // reset the scope to 'tag' so our 'Tags' tab is highlighted
     1246                @setcookie( 'bp-groups-scope', 'tag', 0, '/' );
     1247
     1248                // reset the dropdown menu to 'Everything'
     1249                @setcookie( 'bp-groups-filter', '-1', 0, '/' );
     1250
     1251
     1252        // group directory
     1253        } elseif ( bp_is_groups_directory() ) {
     1254                $scope = ! empty( $_COOKIE['bp-groups-scope'] ) ? $_COOKIE['bp-groups-scope'] : '';
     1255
     1256                // if we're on the group directory and we last-visited a tag page,
     1257                // let's reset the scope to 'all'
     1258                if ( $scope == 'tag' ) {
     1259                        @setcookie( 'bp-groups-scope', 'all', 0, '/' );
     1260                }
     1261        }
     1262}
     1263add_action( 'bp_screens', 'bp_groups_tag_set_scope', 9 );
     1264
     1265/**
     1266 * Set querystring when on a group tag page.
     1267 *
     1268 * @since BuddyPress (2.1.0)
     1269 */
     1270function bp_groups_tag_querystring( $retval ) {
     1271        if ( ! bp_is_groups_tag() ) {
     1272                return $retval;
     1273        }
     1274
     1275        $args = wp_parse_args( $retval );
     1276
     1277        if ( ! isset( $args['scope'] ) ) {
     1278                return $retval;
     1279        }
     1280
     1281        if ( 'tag' !== $args['scope'] ) {
     1282                return $retval;
     1283        }
     1284
     1285        $args['type'] = 'tag';
     1286        $args['slug'] = bp_action_variable( 0 );
     1287
     1288        return $args;
     1289}
     1290add_filter( 'bp_ajax_querystring', 'bp_groups_tag_querystring', 20 );
     1291
     1292/**
     1293 * Inject a header on the group directory page if we're on a tag page.
     1294 *
     1295 * @since BuddyPress (2.1.0)
     1296 */
     1297function bp_groups_tag_header() {
     1298        if ( ! bp_is_groups_tag() ) {
     1299                return;
     1300        }
     1301
     1302        if ( defined( 'DOING_AJAX' ) ) {
     1303                // grab the AJAX querystring
     1304                $qs = ! empty( $_POST['cookie'] ) ? urldecode( $_POST['cookie'] ) : '';
     1305
     1306                // not a tag page? stop now!
     1307                if ( strpos( $qs, 'bp-groups-scope=tag' ) === false ) {
     1308                        return;
     1309                }
     1310        }
     1311
     1312        printf( '<h3>' . __( 'Groups tagged: "%s"', 'buddypress' ) . '</h3>', buddypress()->groups->tag->name );
     1313
     1314        if ( ! empty( buddypress()->groups->tag->description ) ) {
     1315                echo '<p>' . esc_html( buddypress()->groups->tag->description ) . '</p>';
     1316        }
     1317
     1318}
     1319add_action( 'bp_before_groups_loop', 'bp_groups_tag_header' );
     1320
     1321/**
     1322 * Add "Group Tags" input field to group creation and group admin edit pages.
     1323 *
     1324 * @since BuddyPress (2.1.0)
     1325 *
     1326 * @see bp_groups_the_tagbox()
     1327 */
     1328function bp_groups_tag_add_field_to_frontend_group_admin() {
     1329        // prevent duplicate fields on group creation page
     1330        if ( bp_is_group_creation_step( 'group-details' ) && did_action( 'groups_custom_group_fields_editable' ) ) {
     1331                return;
     1332        }
     1333?>
     1334
     1335        <label for="new-tag-bp_group_tags"><?php _e( 'Group Tags', 'buddypress' ); ?></label>
     1336        <div id="tagsdiv-bp_group_tags" class="bp-tag-editor">
     1337                <?php bp_groups_the_tagbox();?>
     1338        </div>
     1339
     1340<?php
     1341}
     1342add_action( 'bp_after_group_details_creation_step', 'bp_groups_tag_add_field_to_frontend_group_admin', 1 );
     1343add_action( 'groups_custom_group_fields_editable',  'bp_groups_tag_add_field_to_frontend_group_admin', 1 );
  • src/bp-groups/bp-groups-loader.php

     
    231231                        'members',
    232232                        'settings',
    233233                        'avatar',
     234                        bp_get_groups_tag_slug(),
    234235                        $this->slug,
    235236                        $this->root_slug,
    236237                ) );
     
    622623
    623624                parent::setup_title();
    624625        }
     626
     627        public function register_taxonomies( $taxonomy = '', $object_type = '', $args = array(), $network = false ) {
     628                $labels = array(
     629                        'name'                       => _x( 'Group Tags',                           'groups tag general name',  'buddypress' ),
     630                        'singular_name'              => _x( 'Group Tag',                            'groups tag singular name', 'buddypress' ),
     631                        'search_items'               => _x( 'Search Group Tags',                    'groups tag search',        'buddypress' ),
     632                        'popular_items'              => _x( 'Popular Group Tags',                   'groups tag popular',       'buddypress' ),
     633                        'all_items'                  => _x( 'All Group Tags',                       'groups tag all',           'buddypress' ),
     634                        'parent_item'                => null,
     635                        'parent_item_colon'          => null,
     636                        'edit_item'                  => _x( 'Edit Group Tag',                       'groups tag edit',          'buddypress' ),
     637                        'update_item'                => _x( 'Update Group Tag',                     'groups tag update',        'buddypress' ),
     638                        'add_new_item'               => _x( 'Add New Group Tag',                    'groups tag add new',       'buddypress' ),
     639                        'new_item_name'              => _x( 'New Group Tag Name',                   'groups tag new',           'buddypress' ),
     640                        'separate_items_with_commas' => _x( 'Separate Group Tags with commas',      'groups tag comma',         'buddypress' ),
     641                        'add_or_remove_items'        => _x( 'Add or remove Group Tags',             'groups tag add remove',    'buddypress' ),
     642                        'choose_from_most_used'      => _x( 'Choose from the most used Group Tags', 'groups tag most used',     'buddypress' ),
     643                        'not_found'                  => _x( 'No Group Tags found.',                 'groups tag not found',     'buddypress' ),
     644                );
     645
     646                $args = array(
     647                        'hierarchical'          => false,
     648                        'labels'                => $labels,
     649                        'show_ui'               => false,
     650                        'show_admin_column'     => false,
     651                        'query_var'             => false,
     652                        'show_tagcloud'         => true,
     653                        'rewrite'               => array(
     654                                'slug' => bp_get_groups_root_slug() . '/' . bp_get_groups_tag_slug(),
     655                                'with_front' => false
     656                        ),
     657                        'capabilities' => array(
     658                                'manage_terms'  => 'manage_group_tags',
     659                                'edit_terms'    => 'edit_group_tags',
     660                                'delete_terms'  => 'delete_group_tags',
     661                                'assign_terms'  => 'assign_group_tags'
     662                        ),
     663                        'update_count_callback' => 'bp_core_update_term_count',
     664                        'meta_box_cb'           => 'bp_tags_meta_box'
     665                );
     666
     667                parent::register_taxonomies( 'bp_group_tags', array( 'bp_group' ), $args, true );
     668        }
    625669}
    626670
    627671
  • src/bp-groups/bp-groups-screens.php

     
    567567
    568568                        $group_notify_members = isset( $_POST['group-notify-members'] ) ? (int) $_POST['group-notify-members'] : 0;
    569569
    570                         if ( !groups_edit_base_group_details( $_POST['group-id'], $_POST['group-name'], $_POST['group-desc'], $group_notify_members ) ) {
     570                        $error = false;
     571
     572                        if ( ! groups_edit_base_group_details( $_POST['group-id'], $_POST['group-name'], $_POST['group-desc'], $group_notify_members ) ) {
     573                                $error = true;
     574                        }
     575
     576                        if ( ! empty( $_POST['tax_input'] ) ) {
     577                                if ( ! bp_groups_set_taxonomy( $_POST['tax_input'], $bp->groups->current_group->id ) ) {
     578                                        $error = true;
     579                                }
     580                        }
     581
     582                        if ( ! empty( $error ) ) {
    571583                                bp_core_add_message( __( 'There was an error updating group details, please try again.', 'buddypress' ), 'error' );
    572584                        } else {
    573585                                bp_core_add_message( __( 'Group details were successfully updated.', 'buddypress' ) );
     
    10071019                        return;
    10081020
    10091021                // Group Directory
    1010                 if ( ! bp_current_action() && ! bp_current_item() ) {
     1022                if ( ( ! bp_current_action() && ! bp_current_item() ) || bp_is_groups_tag() ) {
    10111023                        bp_update_is_directory( true, 'groups' );
    10121024
    10131025                        do_action( 'groups_directory_groups_setup' );
  • src/bp-groups/bp-groups-template.php

     
    131131                }
    132132
    133133                $defaults = array(
    134                         'type'            => 'active',
    135                         'page'            => 1,
    136                         'per_page'        => 20,
    137                         'max'             => false,
    138                         'show_hidden'     => false,
    139                         'page_arg'        => 'grpage',
    140                         'user_id'         => 0,
    141                         'slug'            => false,
    142                         'include'         => false,
    143                         'exclude'         => false,
    144                         'search_terms'    => '',
    145                         'meta_query'      => false,
    146                         'populate_extras' => true,
     134                        'type'              => 'active',
     135                        'page'              => 1,
     136                        'per_page'          => 20,
     137                        'max'               => false,
     138                        'show_hidden'       => false,
     139                        'page_arg'          => 'grpage',
     140                        'user_id'           => 0,
     141                        'slug'              => false,
     142                        'include'           => false,
     143                        'exclude'           => false,
     144                        'search_terms'      => '',
     145                        'meta_query'        => false,
     146                        'tax_query'         => false,
     147                        'populate_extras'   => true,
    147148                        'update_meta_cache' => true,
    148149                );
    149150
     
    192193                                'user_id'           => $user_id,
    193194                                'search_terms'      => $search_terms,
    194195                                'meta_query'        => $meta_query,
     196                                'tax_query'         => $tax_query,
    195197                                'include'           => $include,
    196198                                'exclude'           => $exclude,
    197199                                'populate_extras'   => $populate_extras,
     
    318320 *     @type array $meta_query Optional. An array of meta_query
    319321 *           conditions. See {@link WP_Meta_Query::queries} for
    320322 *           description.
     323 *     @type array $tax_query Optional. An array of tax_query
     324 *           conditions. See {@link WP_Tax_Query::queries} for
     325 *           description.
    321326 *     @type array|string Optional. Array or comma-separated list of
    322327 *           group IDs. Results will be limited to groups within the
    323328 *           list. Default: false.
     
    382387                'slug'              => $slug,
    383388                'search_terms'      => $search_terms,
    384389                'meta_query'        => false,
     390                'tax_query'         => false,
    385391                'include'           => false,
    386392                'exclude'           => false,
    387393                'populate_extras'   => true,
    388394                'update_meta_cache' => true,
    389395        ), 'has_groups' );
    390396
     397        // Filter by group tag
     398        // Pass 'type' as 'tag' and 'slug' with the tag's slug
     399        if ( 'tag' === $r['type'] && ! empty( $r['slug'] ) ) {
     400                $r['tax_query'] = array( array(
     401                        'taxonomy' => 'bp_group_tags',
     402                        'terms'    => $r['slug'],
     403                        'field'    => 'slug',
     404                ) );
     405        }
     406
    391407        // Setup the Groups template global
    392408        $groups_template = new BP_Groups_Template( array(
    393409                'type'              => $r['type'],
     
    402418                'slug'              => $r['slug'],
    403419                'search_terms'      => $r['search_terms'],
    404420                'meta_query'        => $r['meta_query'],
     421                'tax_query'         => $r['tax_query'],
    405422                'include'           => $r['include'],
    406423                'exclude'           => $r['exclude'],
    407424                'populate_extras'   => (bool) $r['populate_extras'],
     
    32133230function bp_group_has_membership_requests( $args = '' ) {
    32143231        global $requests_template;
    32153232
     3233        $tax_query = array();
     3234        if ( bp_is_groups_tag() ) {
     3235                $tax_query = array(
     3236                        array(
     3237                                'taxonomy' => 'bp_group_tags',
     3238                                'terms'    => $bp->groups->tag->term_id,
     3239                                'field'    => 'term_id',
     3240                        )
     3241                );
     3242        }
     3243
    32163244        $defaults = array(
    32173245                'group_id' => bp_get_current_group_id(),
    32183246                'per_page' => 10,
     
    38633891        // Filter and return
    38643892        return apply_filters( 'bp_groups_get_profile_stats', $r['output'], $r );
    38653893}
     3894
     3895/* Group Tags *****************************************************************/
     3896
     3897/**
     3898 * Output the groups component tag slug
     3899 *
     3900 * @package BuddyPress
     3901 * @subpackage Groups Template
     3902 * @since BuddyPress (2.1.0)
     3903 *
     3904 * @uses bp_get_groups_tag_slug()
     3905 */
     3906function bp_groups_tag_slug() {
     3907        echo bp_get_groups_tag_slug();
     3908}
     3909
     3910        /**
     3911         * Return the groups component tag slug
     3912         *
     3913         * @package BuddyPress
     3914         * @subpackage Groups Template
     3915         * @since BuddyPress (2.1.0)
     3916         */
     3917        function bp_get_groups_tag_slug() {
     3918                return apply_filters( 'bp_get_groups_tag_slug', 'tag' );
     3919        }
     3920
     3921/**
     3922 * Output the current group tagbox
     3923 *
     3924 * @since BuddyPress (2.1.0)
     3925 *
     3926 * @uses bp_get_groups_the_tagbox()
     3927 */
     3928function bp_groups_the_tagbox() {
     3929        echo bp_get_groups_the_tagbox();
     3930}
     3931        /**
     3932         * Return the current group tagbox
     3933         *
     3934         * @since BuddyPress (2.1.0)
     3935         */
     3936        function bp_get_groups_the_tagbox() {
     3937                $bp = buddypress();
     3938
     3939                $group = $bp->groups->current_group;
     3940
     3941                if ( empty( $group ) ) {
     3942                        $group = new stdClass;
     3943                        $group->id = 0;
     3944                }
     3945
     3946                $box = array(
     3947                        'taxonomy' => 'bp_group_tags',
     3948                        'title'    => __( 'Group Tags', 'buddypress' ),
     3949                );
     3950
     3951                require_once( ABSPATH . 'wp-admin/includes/taxonomy.php' );
     3952
     3953                ob_start();
     3954                bp_tags_meta_box( $group, $box );
     3955                $tagbox = ob_get_contents();
     3956                ob_end_clean();
     3957
     3958                return apply_filters( 'bp_get_groups_the_tagbox', '<div class="inside">' . $tagbox . '</div>' );
     3959        }
     3960
     3961/**
     3962 * Output group tags
     3963 *
     3964 * @since BuddyPress (2.1.0)
     3965 *
     3966 * @uses bp_get_groups_the_tags()
     3967 * @param int $group_id The group ID.
     3968 */
     3969function bp_groups_the_tags( $group_id = 0 ) {
     3970        echo bp_get_groups_the_tags( $group_id );
     3971}
     3972add_action( 'bp_directory_groups_item',    'bp_groups_the_tags' );
     3973add_action( 'bp_before_group_header_meta', 'bp_groups_the_tags' );
     3974
     3975        /**
     3976         * Return a comma-separated list of tags for a group.
     3977         *
     3978         * @since BuddyPress (2.1.0)
     3979         *
     3980         * @todo Perhaps add parameters for HTML markup?
     3981         *
     3982         * @param int $group_id The group ID.
     3983         * @return string|bool HTML markup of comma-separated tags; boolean false otherwise.
     3984         */
     3985        function bp_get_groups_the_tags( $group_id = 0 ) {
     3986                if ( empty( $group_id ) ) {
     3987                        $group_id = bp_get_group_id();
     3988                }
     3989
     3990                if ( empty( $group_id ) ) {
     3991                        return false;
     3992                }
     3993
     3994                $tag_list = bp_core_get_the_term_list( $group_id, 'bp_group_tags', '', ', ', '' );
     3995
     3996                if ( empty( $tag_list ) ) {
     3997                        return false;
     3998                }
     3999
     4000                $html  = '<div class="group-tags">';
     4001                $html .= '<span>' . esc_html_x( 'Tags:', 'Group tags prefix', 'buddypress' ) . ' </span>';
     4002                $html .= $tag_list;
     4003                $html .= '</div>';
     4004
     4005                return apply_filters( 'bp_get_groups_the_tags', $html, $group_id );
     4006        }