Skip to:
Content

BuddyPress.org

Ticket #4017: 4017.patch

File 4017.patch, 80.9 KB (added by imath, 5 years ago)
  • src/bp-core/admin/bp-core-functions.php

    diff --git src/bp-core/admin/bp-core-functions.php src/bp-core/admin/bp-core-functions.php
    index a26a6f9..47d6c77 100644
    function bp_core_admin_user_spammed_js() { 
    907907        </script>
    908908        <?php
    909909}
     910
     911/**
     912 * Load the needed BuddyPress item List Table
     913 *
     914 * @since BuddyPress (2.1.0)
     915 *
     916 * @param string $class the WP List Table class to init
     917 * @param string $required the WP List class to extend
     918 */
     919function bp_core_admin_get_list_table( $class = '', $required = 'wp' ) {
     920        if ( empty( $class ) ) {
     921                return;
     922        }
     923
     924        if ( ! empty( $required ) ) {
     925                require_once( ABSPATH . 'wp-admin/includes/class-' . $required . '-list-table.php' );
     926        }
     927
     928        return new $class();
     929}
  • src/bp-core/bp-core-actions.php

    diff --git src/bp-core/bp-core-actions.php src/bp-core/bp-core-actions.php
    index df61f5a..3e91faa 100644
    add_action( 'bp_loaded', 'bp_register_theme_directory', 14 ); 
    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 );
    add_action( 'bp_template_redirect', 'bp_get_request', 10 ); 
    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

    diff --git src/bp-core/bp-core-classes.php src/bp-core/bp-core-classes.php
    index bad2c21..e40292c 100644
    class BP_Walker_Nav_Menu_Checklist extends Walker_Nav_Menu { 
    24072407                $output .= '<input type="hidden" class="menu-item-xfn" name="menu-item[' . $possible_object_id . '][menu-item-xfn]" value="'. esc_attr( $item->xfn ) .'" />';
    24082408        }
    24092409}
     2410
     2411/**
     2412 * Use WordPress term/taxonomy functions, forcing the table prefix to be the one of root blog id.
     2413 *
     2414 * This is needed for Multisite configs in case a component taxonomy is used from a child blog.
     2415 *
     2416 * @since BuddyPress (2.1.0)
     2417 */
     2418class BP_Terms {
     2419
     2420        /**
     2421         * WordPress current blog term taxonomy table.
     2422         *
     2423         * @since BuddyPress (2.1.0)
     2424         * @var string
     2425         */
     2426        public static $wp_term_taxonomy = '';
     2427
     2428        /**
     2429         * WordPress current blog term relationships table.
     2430         *
     2431         * @since BuddyPress (2.1.0)
     2432         * @var string
     2433         */
     2434        public static $wp_term_relationships = '';
     2435
     2436        /**
     2437         * WordPress current blog terms table.
     2438         *
     2439         * @since BuddyPress (2.1.0)
     2440         * @var string
     2441         */
     2442        public static $wp_terms = '';
     2443
     2444        /**
     2445         * BuddyPress root blog term taxonomy table.
     2446         *
     2447         * @since BuddyPress (2.1.0)
     2448         * @var string
     2449         */
     2450        public static $bp_term_taxonomy = '';
     2451
     2452        /**
     2453         * BuddyPress root blog term relationships table.
     2454         *
     2455         * @since BuddyPress (2.1.0)
     2456         * @var string
     2457         */
     2458        public static $bp_term_relationships = '';
     2459
     2460        /**
     2461         * BuddyPress root blog terms table.
     2462         *
     2463         * @since BuddyPress (2.1.0)
     2464         * @var string
     2465         */
     2466        public static $bp_terms = '';
     2467
     2468        /**
     2469         * Start the class
     2470         *
     2471         * @access public
     2472         * @since BuddyPress (2.1.0)
     2473         * @static
     2474         */
     2475        public static function start() {
     2476                $bp = buddypress();
     2477
     2478                if ( empty( $bp->terms ) ) {
     2479                        $bp->terms = new self;
     2480                }
     2481
     2482                return $bp->terms;
     2483        }
     2484
     2485        /**
     2486         * Constructor
     2487         *
     2488         * @access public
     2489         * @since BuddyPress (2.1.0)
     2490         */
     2491        public function __construct() {
     2492                $this->setup_globals();
     2493        }
     2494
     2495        /**
     2496         * Set globals
     2497         *
     2498         * @access public
     2499         * @since BuddyPress (2.1.0)
     2500         */
     2501        public function setup_globals() {
     2502                global $wpdb;
     2503
     2504                self::$wp_term_taxonomy      = $wpdb->term_taxonomy;
     2505                self::$wp_term_relationships = $wpdb->term_relationships;
     2506                self::$wp_terms              = $wpdb->terms;
     2507
     2508                $bp_prefix = bp_core_get_table_prefix();
     2509
     2510                self::$bp_term_taxonomy      = $bp_prefix . 'term_taxonomy';
     2511                self::$bp_term_relationships = $bp_prefix . 'term_relationships';
     2512                self::$bp_terms              = $bp_prefix . 'terms';
     2513        }
     2514
     2515        /**
     2516         * Set needed $wpdb->tables to be the one of root blog id
     2517         *
     2518         * @access public
     2519         * @since BuddyPress (2.1.0)
     2520         * @static
     2521         */
     2522        public static function set_tables() {
     2523                global $wpdb;
     2524
     2525                $wpdb->term_taxonomy      = self::$bp_term_taxonomy;
     2526                $wpdb->term_relationships = self::$bp_term_relationships;
     2527                $wpdb->terms              = self::$bp_terms;
     2528        }
     2529
     2530        /**
     2531         * Reset $wpdb->tables to the one set by WordPress
     2532         *
     2533         * @access public
     2534         * @since BuddyPress (2.1.0)
     2535         * @static
     2536         */
     2537        public static function reset_tables() {
     2538                global $wpdb;
     2539
     2540                $wpdb->term_taxonomy      = self::$wp_term_taxonomy;
     2541                $wpdb->term_relationships = self::$wp_term_relationships;
     2542                $wpdb->terms              = self::$wp_terms;
     2543        }
     2544
     2545        /**
     2546         * Update term count
     2547         *
     2548         * @access public
     2549         * @since BuddyPress (2.1.0)
     2550         * @static
     2551         */
     2552        public static function update_term_count( $terms, $taxonomy ) {
     2553                global $wpdb;
     2554                self::set_tables();
     2555                _update_generic_term_count( $terms, $taxonomy );
     2556                self::reset_tables();
     2557        }
     2558
     2559        /**
     2560         * Get group tags
     2561         *
     2562         * @access public
     2563         * @since BuddyPress (2.1.0)
     2564         * @static
     2565         *
     2566         * @uses wp_get_object_terms()
     2567         */
     2568        public static function get_object_terms( $object_ids, $taxonomies, $args = array() ) {
     2569                global $wpdb;
     2570                self::set_tables();
     2571                $return = wp_get_object_terms( $object_ids, $taxonomies, $args );
     2572                self::reset_tables();
     2573                return $return;
     2574        }
     2575
     2576        /**
     2577         * Set group tags
     2578         *
     2579         * @access public
     2580         * @since BuddyPress (2.1.0)
     2581         * @static
     2582         *
     2583         * @uses wp_set_object_terms()
     2584         */
     2585        public static function set_object_terms( $object_id, $terms, $taxonomy, $append ) {
     2586                global $wpdb;
     2587                self::set_tables();
     2588                $return = wp_set_object_terms( $object_id, $terms, $taxonomy, $append );
     2589                self::reset_tables();
     2590                return $return;
     2591        }
     2592
     2593        /**
     2594         * Remove group tags
     2595         *
     2596         * @access public
     2597         * @since BuddyPress (2.1.0)
     2598         * @static
     2599         *
     2600         * @uses wp_remove_object_terms()
     2601         */
     2602        public static function remove_object_terms( $object_id, $terms, $taxonomy ) {
     2603                global $wpdb;
     2604                self::set_tables();
     2605                $return = wp_remove_object_terms( $object_id, $terms, $taxonomy );
     2606                self::reset_tables();
     2607                return $return;
     2608        }
     2609
     2610        /**
     2611         * Remove all group relationships
     2612         *
     2613         * @access public
     2614         * @since BuddyPress (2.1.0)
     2615         * @static
     2616         *
     2617         * @uses wp_delete_object_term_relationships()
     2618         */
     2619        public static function delete_object_term_relationships( $object_id, $taxonomies = 'bp_group_tags' ) {
     2620                global $wpdb;
     2621                self::set_tables();
     2622                $return = wp_delete_object_term_relationships( $object_id, $taxonomies );
     2623                self::reset_tables();
     2624                return $return;
     2625        }
     2626
     2627        /**
     2628         * Get group ids for a given tag
     2629         *
     2630         * @access public
     2631         * @since BuddyPress (2.1.0)
     2632         * @static
     2633         *
     2634         * @uses get_objects_in_term()
     2635         */
     2636        public static function get_objects_in_term( $term_ids, $taxonomies, $args = array() ) {
     2637                global $wpdb;
     2638                self::set_tables();
     2639                $return = get_objects_in_term( $term_ids, $taxonomies, $args );
     2640                self::reset_tables();
     2641                return $return;
     2642        }
     2643
     2644        /**
     2645         * Get all Term data from database by Term ID
     2646         *
     2647         * @access public
     2648         * @since BuddyPress (2.1.0)
     2649         * @static
     2650         *
     2651         * @uses get_term()
     2652         */
     2653        public static function get_term( $term, $taxonomy, $output, $filter ) {
     2654                global $wpdb;
     2655                self::set_tables();
     2656                $return = get_term( $term, $taxonomy, $output, $filter );
     2657                self::reset_tables();
     2658                return $return;
     2659        }
     2660
     2661        /**
     2662         * Get all terms for a given taxonomy
     2663         *
     2664         * @access public
     2665         * @since BuddyPress (2.1.0)
     2666         * @static
     2667         *
     2668         * @uses get_terms()
     2669         */
     2670        public static function get_terms( $taxonomies, $args = array() ) {
     2671                global $wpdb;
     2672                self::set_tables();
     2673                $return = get_terms( $taxonomies, $args );
     2674                self::reset_tables();
     2675                return $return;
     2676        }
     2677
     2678        /**
     2679         * Insert a term based on arguments provided.
     2680         *
     2681         * @access public
     2682         * @since BuddyPress (2.1.0)
     2683         * @static
     2684         *
     2685         * @uses wp_insert_term()
     2686         */
     2687        public static function insert_term( $term, $taxonomy, $args = array() ) {
     2688                global $wpdb;
     2689                self::set_tables();
     2690                $return = wp_insert_term( $term, $taxonomy, $args );
     2691                self::reset_tables();
     2692                return $return;
     2693        }
     2694
     2695        /**
     2696         * Update term based on arguments provided.
     2697         *
     2698         * @access public
     2699         * @since BuddyPress (2.1.0)
     2700         * @static
     2701         *
     2702         * @uses wp_update_term()
     2703         */
     2704        public static function update_term( $term_id, $taxonomy, $args = array() ) {
     2705                global $wpdb;
     2706                self::set_tables();
     2707                $return = wp_update_term( $term_id, $taxonomy, $args );
     2708                self::reset_tables();
     2709                return $return;
     2710        }
     2711
     2712        /**
     2713         * Delete term based on arguments provided.
     2714         *
     2715         * @access public
     2716         * @since BuddyPress (2.1.0)
     2717         * @static
     2718         *
     2719         * @uses wp_delete_term()
     2720         */
     2721        public static function delete_term( $term_id, $taxonomy, $args = array() ) {
     2722                global $wpdb;
     2723                self::set_tables();
     2724                $return = wp_delete_term( $term_id, $taxonomy, $args );
     2725                self::reset_tables();
     2726                return $return;
     2727        }
     2728
     2729        /**
     2730         * Get term thanks to a specific field
     2731         *
     2732         * @access public
     2733         * @since BuddyPress (2.1.0)
     2734         * @static
     2735         *
     2736         * @uses get_term_by()
     2737         */
     2738        public static function get_term_by( $field, $value, $taxonomy, $output, $filter ) {
     2739                global $wpdb;
     2740                self::set_tables();
     2741                $return = get_term_by( $field, $value, $taxonomy, $output, $filter );
     2742                self::reset_tables();
     2743                return $return;
     2744        }
     2745
     2746        /**
     2747         * Get the term link
     2748         *
     2749         * @access public
     2750         * @since BuddyPress (2.1.0)
     2751         * @static
     2752         *
     2753         * @uses get_term_link()
     2754         */
     2755        public static function get_term_link( $term, $taxonomy ) {
     2756                $root_blog = bp_is_root_blog();
     2757
     2758                if ( ! $root_blog ) {
     2759                        switch_to_blog( bp_get_root_blog_id() );
     2760                }
     2761
     2762                $return = get_term_link( $term, $taxonomy );
     2763
     2764                if ( ! $root_blog ) {
     2765                        restore_current_blog();
     2766                }
     2767
     2768                return $return;
     2769        }
     2770
     2771        /**
     2772         * Copy WordPress get_the_term_list without using get_the_terms()
     2773         * function as it checks for an existing post.
     2774         *
     2775         * @access public
     2776         * @since BuddyPress (2.1.0)
     2777         * @static
     2778         *
     2779         * @uses self::get_object_terms()
     2780         * @uses self::get_term_link()
     2781         */
     2782        public static function get_the_term_list( $object_id, $taxonomy, $before, $sep, $after ) {
     2783
     2784                $terms = self::get_object_terms( $object_id, $taxonomy );
     2785
     2786                if ( is_wp_error( $terms ) )
     2787                        return $terms;
     2788
     2789                if ( empty( $terms ) )
     2790                        return false;
     2791
     2792                foreach ( $terms as $term ) {
     2793                        $link = self::get_term_link( $term, $taxonomy );
     2794                        if ( is_wp_error( $link ) )
     2795                                return $link;
     2796                        $term_links[] = '<a href="' . esc_url( $link ) . '" rel="tag">' . $term->name . '</a>';
     2797                }
     2798
     2799                $term_links = apply_filters( "term_links-$taxonomy", $term_links );
     2800
     2801                return $before . join( $sep, $term_links ) . $after;
     2802        }
     2803
     2804        /**
     2805         * Get the sql for a Tax Query
     2806         *
     2807         * @access public
     2808         * @since BuddyPress (2.1.0)
     2809         * @static
     2810         *
     2811         * @uses get_term_link()
     2812         */
     2813        public static function get_tax_sql( $tax_query, $primary_table, $primary_id_column ) {
     2814                global $wpdb;
     2815                self::set_tables();
     2816                $return = get_tax_sql( $tax_query, $primary_table, $primary_id_column );
     2817                self::reset_tables();
     2818                return $return;
     2819        }
     2820}
  • src/bp-core/bp-core-component.php

    diff --git src/bp-core/bp-core-component.php src/bp-core/bp-core-component.php
    index c16c17c..1c0cd53 100644
    class BP_Component { 
    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

    diff --git src/bp-core/bp-core-dependency.php src/bp-core/bp-core-dependency.php
    index eaf839c..5fa30de 100644
    function bp_setup_title() { 
    6060        do_action( 'bp_setup_title' );
    6161}
    6262
     63/**
     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
    6370/**
    6471 * Fire the 'bp_register_widgets' action, where plugins should register widgets.
    6572 */
  • src/bp-core/bp-core-functions.php

    diff --git src/bp-core/bp-core-functions.php src/bp-core/bp-core-functions.php
    index 8d3d60e..62a25da 100644
    function bp_nav_menu_get_item_url( $slug ) { 
    18761876
    18771877        return $nav_item_url;
    18781878}
     1879
     1880/** BuddyPress Terms **********************************************************/
     1881
     1882/**
     1883 * Get all Term data from database by Term ID.
     1884 *
     1885 * WordPress get_term function for BuddyPress root blog id
     1886 * @see get_term() for the full description.
     1887 *
     1888 * @since BuddyPress (2.1.0)
     1889 *
     1890 * @uses BP_Terms::get_term().
     1891 *
     1892 * @param int|object $term If integer, will get from database. If object will apply filters and return $term.
     1893 * @param string $taxonomy Taxonomy name that $term is part of.
     1894 * @param string $output Constant OBJECT, ARRAY_A, or ARRAY_N
     1895 * @param string $filter Optional, default is raw or no WordPress defined filter will applied.
     1896 * @return mixed|null|WP_Error Term Row from database. Will return null if $term is empty. If taxonomy does not
     1897 * exist then WP_Error will be returned.
     1898 */
     1899function bp_core_get_term( $term, $taxonomy, $output = OBJECT, $filter = 'raw' ) {
     1900        return BP_Terms::get_term( $term, $taxonomy, $output, $filter );
     1901}
     1902/**
     1903 * Retrieve the terms in a given taxonomy or list of taxonomies.
     1904 *
     1905 * WordPress get_terms function for BuddyPress root blog id
     1906 * @see get_terms() for the list of possible args.
     1907 *
     1908 * @since BuddyPress (2.1.0)
     1909 *
     1910 * @uses BP_Terms::get_terms().
     1911 *
     1912 * @param string|array $taxonomies Taxonomy name or list of Taxonomy names.
     1913 * @param string|array $args The values of what to search for when returning terms
     1914 * @return array|WP_Error List of Term Objects and their children. Will return WP_Error, if any of $taxonomies do not exist.
     1915 */
     1916function bp_core_get_terms( $taxonomies = '', $args = '' ) {
     1917        return BP_Terms::get_terms( $taxonomies, $args );
     1918}
     1919
     1920/**
     1921 * Add a new term to the database.
     1922 *
     1923 * WordPress wp_insert_term function for BuddyPress root blog id
     1924 * @see wp_insert_term() for the list of possible args.
     1925 *
     1926 * @since BuddyPress (2.1.0)
     1927 *
     1928 * @uses BP_Terms::insert_term().
     1929 *
     1930 * @param string       $term     The term to add or update.
     1931 * @param string       $taxonomy The taxonomy to which to add the term
     1932 * @param array|string $args
     1933 * @return array|WP_Error An array containing the term_id and term_taxonomy_id, WP_Error otherwise.
     1934 */
     1935function bp_core_insert_term( $term, $taxonomy, $args = array() ) {
     1936        return BP_Terms::insert_term( $term, $taxonomy, $args );
     1937}
     1938
     1939/**
     1940 * Update term based on arguments provided.
     1941 *
     1942 * WordPress wp_update_term function for BuddyPress root blog id
     1943 * @see wp_update_term() for the list of possible args.
     1944 *
     1945 * @since BuddyPress (2.1.0)
     1946 *
     1947 * @uses BP_Terms::update_term().
     1948 *
     1949 * @param int $term_id The ID of the term
     1950 * @param string $taxonomy The context in which to relate the term to the object.
     1951 * @param array|string $args Overwrite term field values
     1952 * @return array|WP_Error Returns Term ID and Taxonomy Term ID
     1953 */
     1954function bp_core_update_term( $term_id, $taxonomy, $args = array() ) {
     1955        return BP_Terms::update_term( $term_id, $taxonomy, $args );
     1956}
     1957
     1958/**
     1959 * Removes a term from the database.
     1960 *
     1961 * WordPress wp_update_term function for BuddyPress root blog id
     1962 * @see wp_delete_term() for the list of possible args.
     1963 *
     1964 * @since BuddyPress (2.1.0)
     1965 *
     1966 * @uses BP_Terms::delete_term().
     1967 *
     1968 * @param int $term_id Term ID
     1969 * @param string $taxonomy Taxonomy Name
     1970 * @param array|string $args Optional. Change 'default' term id and override found term ids.
     1971 * @return bool|WP_Error Returns false if not term; true if completes delete action.
     1972 */
     1973function bp_core_delete_term( $term_id, $taxonomy, $args = array() ) {
     1974        return BP_Terms::delete_term( $term_id, $taxonomy, $args );
     1975}
     1976
     1977/**
     1978 * Get all Term data from database by Term field and data.
     1979 *
     1980 * WordPress get_term_by function for BuddyPress root blog id
     1981 * @see get_term_by() for the list of possible args.
     1982 *
     1983 * @since BuddyPress (2.1.0)
     1984 *
     1985 * @uses BP_Terms::get_term_by().
     1986 *
     1987 * @param string $field Either 'slug', 'name', 'id' (term_id), or 'term_taxonomy_id'
     1988 * @param string|int $value Search for this term value
     1989 * @param string $taxonomy Taxonomy Name
     1990 * @param string $output Constant OBJECT, ARRAY_A, or ARRAY_N
     1991 * @param string $filter Optional, default is raw or no WordPress defined filter will applied.
     1992 * @return mixed Term Row from database. Will return false if $taxonomy does not exist or $term was not found.
     1993 */
     1994function bp_core_get_term_by( $field, $value, $taxonomy = '', $output = OBJECT, $filter = 'raw' ) {
     1995        return BP_Terms::get_term_by( $field, $value, $taxonomy, $output, $filter );
     1996}
     1997
     1998/**
     1999 * Generates a permalink for a taxonomy term archive.
     2000 *
     2001 * WordPress get_term_link function for BuddyPress root blog id
     2002 * @see get_term_link()
     2003 *
     2004 * @since BuddyPress (2.1.0)
     2005 *
     2006 * @uses BP_Terms::get_term_link().
     2007 *
     2008 * @param object|int|string $term
     2009 * @param string $taxonomy (optional if $term is object)
     2010 * @return string|WP_Error HTML link to taxonomy term archive on success, WP_Error if term does not exist.
     2011 */
     2012function bp_core_get_term_link( $term, $taxonomy = '' ) {
     2013        return BP_Terms::get_term_link( $term, $taxonomy );
     2014}
     2015
     2016/**
     2017 * Retrieve a BuddyPress item terms as a list with specified format.
     2018 *
     2019 * WordPress get_the_term_list function adapted for BuddyPress
     2020 *
     2021 * @since BuddyPress (2.1.0)
     2022 *
     2023 * @uses BP_Terms::get_the_term_list().
     2024 *
     2025 * @param int $id BuddyPress item id (for instance a group id).
     2026 * @param string $taxonomy Taxonomy name.
     2027 * @param string $before Optional. Before list.
     2028 * @param string $sep Optional. Separate items using this.
     2029 * @param string $after Optional. After list.
     2030 * @return string|bool|WP_Error A list of terms on success, false or WP_Error on failure.
     2031 */
     2032function bp_core_get_the_term_list( $object_id, $taxonomy = '', $before = '', $sep = '', $after = '' ) {
     2033        return BP_Terms::get_the_term_list( $object_id, $taxonomy, $before, $sep, $after );
     2034}
     2035
     2036/**
     2037 * Retrieve object_ids of valid taxonomy and term.
     2038 *
     2039 * WordPress get_objects_in_term function for BuddyPress root blog id
     2040 * @see get_objects_in_term() for the list of possible args.
     2041 *
     2042 * @since BuddyPress (2.1.0)
     2043 *
     2044 * @uses BP_Terms::get_objects_in_term().
     2045 *
     2046 * @param int|array $term_ids Term id or array of term ids of terms that will be used
     2047 * @param string|array $taxonomies String of taxonomy name or Array of string values of taxonomy names
     2048 * @param array|string $args Change the order of the object_ids, either ASC or DESC
     2049 * @return WP_Error|array If the taxonomy does not exist, then WP_Error will be returned. On success
     2050 *      the array can be empty meaning that there are no $object_ids found or it will return the $object_ids found.
     2051 */
     2052function bp_core_get_objects_in_term( $term_ids, $taxonomies = '', $args = array() ) {
     2053        return BP_Terms::get_objects_in_term( $term_ids, $taxonomies, $args );
     2054}
     2055
     2056/**
     2057 * Retrieves the terms associated with the given object(s), in the supplied taxonomies.
     2058 *
     2059 * WordPress wp_get_object_terms function for BuddyPress root blog id
     2060 * @see wp_get_object_terms() for the list of possible args.
     2061 *
     2062 * @since BuddyPress (2.1.0)
     2063 *
     2064 * @uses BP_Terms::get_object_terms().
     2065 *
     2066 * @param int|array $object_ids The ID(s) of the object(s) to retrieve.
     2067 * @param string|array $taxonomies The taxonomies to retrieve terms from.
     2068 * @param array|string $args Change what is returned
     2069 * @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.
     2070 */
     2071function bp_core_get_object_terms( $object_ids, $taxonomies = '', $args = array() ) {
     2072        return BP_Terms::get_object_terms( $object_ids, $taxonomies, $args );
     2073}
     2074
     2075/**
     2076 * Create Term and Taxonomy Relationships.
     2077 *
     2078 * WordPress wp_set_object_terms function for BuddyPress root blog id
     2079 * @see wp_set_object_terms()
     2080 *
     2081 * @since BuddyPress (2.1.0)
     2082 *
     2083 * @uses BP_Terms::set_object_terms().
     2084 *
     2085 * @param int $object_id The object to relate to.
     2086 * @param array|int|string $terms The slug or id of the term, will replace all existing
     2087 * related terms in this taxonomy.
     2088 * @param array|string $taxonomy The context in which to relate the term to the object.
     2089 * @param bool $append If false will delete difference of terms.
     2090 * @return array|WP_Error Affected Term IDs
     2091 */
     2092function bp_core_set_object_terms( $object_id, $terms, $taxonomy = '', $append = false ) {
     2093        return BP_Terms::set_object_terms( $object_id, $terms, $taxonomy, $append );
     2094}
     2095
     2096/**
     2097 * Remove term(s) associated with a given object.
     2098 *
     2099 * WordPress wp_remove_object_terms function for BuddyPress root blog id
     2100 * @see wp_remove_object_terms()
     2101 *
     2102 * @since BuddyPress (2.1.0)
     2103 *
     2104 * @uses BP_Terms::remove_object_terms().
     2105 *
     2106 * @param int $object_id The ID of the object from which the terms will be removed.
     2107 * @param array|int|string $terms The slug(s) or ID(s) of the term(s) to remove.
     2108 * @param array|string $taxonomy Taxonomy name.
     2109 * @return bool|WP_Error True on success, false or WP_Error on failure.
     2110 */
     2111function bp_core_remove_object_terms( $object_id, $terms, $taxonomy = '' ) {
     2112        return BP_Terms::remove_object_terms( $object_id, $terms, $taxonomy );
     2113}
     2114
     2115/**
     2116 * Will unlink the object from the taxonomy or taxonomies.
     2117 *
     2118 * WordPress wp_delete_object_term_relationships function for BuddyPress root blog id
     2119 * @see wp_delete_object_term_relationships()
     2120 *
     2121 * @since BuddyPress (2.1.0)
     2122 *
     2123 * @uses BP_Terms::delete_object_term_relationships().
     2124 *
     2125 * @param int $object_id The term Object Id that refers to the term
     2126 * @param string|array $taxonomies List of Taxonomy Names or single Taxonomy name.
     2127 */
     2128function bp_core_delete_object_term_relationships( $object_id, $taxonomies = '' ) {
     2129        return BP_Terms::delete_object_term_relationships( $object_id, $taxonomies );
     2130}
     2131
     2132/**
     2133 * Will update term count based on number of objects.
     2134 *
     2135 * WordPress _update_generic_term_count function for BuddyPress root blog id
     2136 * @see _update_generic_term_count()
     2137 *
     2138 * @since BuddyPress (2.1.0)
     2139 *
     2140 * @uses BP_Terms::update_term_count().
     2141 *
     2142 * @param array $terms List of Term taxonomy IDs
     2143 * @param object $taxonomy Current taxonomy object of terms
     2144 */
     2145function bp_core_update_term_count( $terms, $taxonomy = '' ) {
     2146        return BP_Terms::update_term_count( $terms, $taxonomy );
     2147}
     2148
     2149/**
     2150 * Given a taxonomy query, generates SQL to be appended to a main query.
     2151 *
     2152 * WordPress get_tax_sql function for BuddyPress root blog id
     2153 * @see get_tax_sql()
     2154 *
     2155 * @since BuddyPress (2.1.0)
     2156 *
     2157 * @param array $tax_query A compact tax query
     2158 * @param string $primary_table
     2159 * @param string $primary_id_column
     2160 * @return array
     2161 */
     2162function bp_core_get_tax_sql( $tax_query = array(), $primary_table = '', $primary_id_column ='' ) {
     2163        return BP_Terms::get_tax_sql( $tax_query, $primary_table, $primary_id_column );
     2164}
  • src/bp-core/bp-core-template.php

    diff --git src/bp-core/bp-core-template.php src/bp-core/bp-core-template.php
    index de05701..784ff37 100644
    function bp_is_current_component_core() { 
    15191519 * Is the current page the activity directory ?
    15201520 *
    15211521 * @since BuddyPress (2.0.0)
    1522  * 
     1522 *
    15231523 * @return True if the current page is the activity directory.
    15241524 */
    15251525function bp_is_activity_directory() {
    function bp_is_single_activity() { 
    15471547 * Is the current page the members directory ?
    15481548 *
    15491549 * @since BuddyPress (2.0.0)
    1550  * 
     1550 *
    15511551 * @return True if the current page is the members directory.
    15521552 */
    15531553function bp_is_members_directory() {
    function bp_is_user_settings_profile() { 
    19181918 * Is the current page the groups directory ?
    19191919 *
    19201920 * @since BuddyPress (2.0.0)
    1921  * 
     1921 *
    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() ) {
     1926                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 one ?
     1938 *
     1939 * @since BuddyPress (2.1.0)
     1940 *
     1941 * @return True if the current page is a groups tag one.
     1942 */
     1943function bp_is_groups_tag() {
     1944        $bp = buddypress();
     1945
     1946        if ( ! empty( $bp->groups->tag ) ) {
    19261947                return true;
     1948        }
    19271949
    19281950        return false;
    19291951}
    function bp_is_create_blog() { 
    21382160 * Is the current page the blogs directory ?
    21392161 *
    21402162 * @since BuddyPress (2.0.0)
    2141  * 
     2163 *
    21422164 * @return True if the current page is the blogs directory.
    21432165 */
    21442166function bp_is_blogs_directory() {
    function bp_nav_menu( $args = array() ) { 
    26852707        else
    26862708                return $nav_menu;
    26872709}
     2710
     2711/**
     2712 * Display BuddyPress item tags form fields.
     2713 *
     2714 * An adapted copy of WordPress post_tags_meta_box()
     2715 * to avoid including the meta-boxes.php file and to
     2716 * be able to use in group edit/create/admin screens
     2717 *
     2718 * @since BuddyPress (2.1.0)
     2719 *
     2720 * @param Object BuddyPress item (such as BP_Groups_Group)
     2721 * @param array   $box {
     2722 *     Tags meta box arguments.
     2723 *
     2724 *     @type string   $id       Meta box ID.
     2725 *     @type string   $title    Meta box title.
     2726 *     @type callback $callback Meta box display callback.
     2727 *     @type array    $args {
     2728 *         Extra meta box arguments.
     2729 *
     2730 *         @type string $taxonomy Taxonomy. Default 'bp_group_tags'.
     2731 *     }
     2732 * }
     2733 */
     2734function bp_tags_meta_box( $item, $box ) {
     2735        $defaults = array( 'taxonomy' => 'bp_group_tags' );
     2736
     2737        if ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) {
     2738                $args = array();
     2739        } else {
     2740                $args = $box['args'];
     2741        }
     2742
     2743        $r = wp_parse_args( $args, $defaults );
     2744        $tax = $r['taxonomy'];
     2745        $tax_name = esc_attr( $tax );
     2746        $taxonomy = get_taxonomy( $tax );
     2747        $user_can_assign_terms = bp_current_user_can( $taxonomy->cap->assign_terms );
     2748        $comma = _x( ',', 'tag delimiter', 'buddypress' );
     2749        ?>
     2750        <div class="tagsdiv" id="<?php echo $tax_name; ?>">
     2751                <div class="jaxtag">
     2752                <div class="nojs-tags hide-if-js">
     2753                <p><?php echo $taxonomy->labels->add_or_remove_items; ?></p>
     2754                <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 . ' ', get_terms_to_edit( $item->id, $tax_name ) ); // textarea_escaped by esc_attr() ?></textarea></div>
     2755                <?php if ( $user_can_assign_terms ) : ?>
     2756                <div class="ajaxtag hide-if-no-js">
     2757                        <label class="screen-reader-text" for="new-tag-<?php echo $tax_name; ?>"><?php echo $box['title']; ?></label>
     2758                        <div class="taghint"><?php echo $taxonomy->labels->add_new_item; ?></div>
     2759                        <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="" />
     2760                        <input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" /></p>
     2761                </div>
     2762                <p class="howto"><?php echo $taxonomy->labels->separate_items_with_commas; ?></p>
     2763                <?php endif; ?>
     2764                </div>
     2765                <div class="tagchecklist"></div>
     2766        </div>
     2767        <?php if ( $user_can_assign_terms ) : ?>
     2768        <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>
     2769        <?php endif;
     2770}
  • src/bp-core/css/tagbox.css

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

    diff --git src/bp-core/js/tagbox.js src/bp-core/js/tagbox.js
    index e69de29..61838c2 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/js/admin.js

    diff --git src/bp-groups/admin/js/admin.js src/bp-groups/admin/js/admin.js
    index 05c61e2..21492ad 100644
     
    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

    diff --git src/bp-groups/bp-groups-actions.php src/bp-groups/bp-groups-actions.php
    index 2a0ea8b..4ff3be1 100644
    function groups_action_create_group() { 
    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
    function groups_action_group_feed() { 
    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

    diff --git src/bp-groups/bp-groups-admin.php src/bp-groups/bp-groups-admin.php
    index 46e6a94..27ed2ca 100644
     
    1313// Exit if accessed directly
    1414if ( !defined( 'ABSPATH' ) ) exit;
    1515
    16 // Include WP's list table class
    17 if ( !class_exists( 'WP_List_Table' ) ) require( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
    18 
    1916// per_page screen option. Has to be hooked in extremely early.
    2017if ( is_admin() && ! empty( $_REQUEST['page'] ) && 'bp-groups' == $_REQUEST['page'] )
    2118        add_filter( 'set-screen-option', 'bp_groups_admin_screen_options', 10, 3 );
    if ( is_admin() && ! empty( $_REQUEST['page'] ) && 'bp-groups' == $_REQUEST['pag 
    2421 * Register the Groups component admin screen.
    2522 *
    2623 * @since BuddyPress (1.7.0)
     24 *
     25 * @global $bp_groups_screens;
    2726 */
    2827function bp_groups_add_admin_menu() {
     28        global $bp_groups_screens;
     29
     30        $hooks = $bp_groups_screens = array();
    2931
    3032        // Add our screen
    31         $hook = add_menu_page(
     33        $hooks['admin_load'] = add_menu_page(
    3234                __( 'Groups', 'buddypress' ),
    3335                __( 'Groups', 'buddypress' ),
    3436                'bp_moderate',
    function bp_groups_add_admin_menu() { 
    3739                'div'
    3840        );
    3941
    40         // Hook into early actions to load custom CSS and our init handler.
    41         add_action( "load-$hook", 'bp_groups_admin_load' );
     42        $hooks['admin_tags_load'] = add_submenu_page(
     43                'bp-groups',
     44                __( 'Group Tags', 'buddypress' ),
     45                __( 'Group Tags', 'buddypress' ),
     46                'bp_moderate',
     47                'bp-group-tags',
     48                'bp_groups_admin_tags'
     49        );
     50
     51        foreach( $hooks as $key => $hook ) {
     52                $bp_groups_screens[] = is_network_admin() ? $hook . '-network' : $hook ;
     53                // Hook into early actions to load custom CSS and our init handler.
     54                add_action( "load-$hook", "bp_groups_$key" );
     55        }
     56
    4257}
    4358add_action( bp_core_admin_hook(), 'bp_groups_add_admin_menu' );
    4459
    add_filter( 'bp_admin_menu_order', 'bp_groups_admin_menu_order' ); 
    6984 * @since BuddyPress (1.7.0)
    7085 *
    7186 * @global BP_Groups_List_Table $bp_groups_list_table Groups screen list table
     87 * @uses bp_core_admin_get_list_table() to load the BP_Groups_List_Table and the needed extended class
    7288 */
    7389function bp_groups_admin_load() {
    7490        global $bp_groups_list_table;
     91        $bp = buddypress();
    7592
    7693        // Build redirection URL
    7794        $redirect_to = remove_query_arg( array( 'action', 'action2', 'gid', 'deleted', 'error', 'updated', 'success_new', 'error_new', 'success_modified', 'error_modified' ), $_SERVER['REQUEST_URI'] );
    function bp_groups_admin_load() { 
    126143                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' );
    127144                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' );
    128145
     146                if ( ! empty( get_current_screen()->taxonomy ) ) {
     147                        $taxonomy = get_taxonomy( get_current_screen()->taxonomy );
     148
     149                        // meta_box_cb argument of register_taxonomy was introduced in WordPress 3.8
     150                        if ( 'bp_group_tags' == $taxonomy->name && ( empty( $taxonomy->meta_box_cb ) || 'bp_tags_meta_box' != $taxonomy->meta_box_cb ) ) {
     151                                $taxonomy->meta_box_cb = 'bp_tags_meta_box';
     152                        }
     153
     154                        $tax_meta_box_id = 'tagsdiv-' . $taxonomy->name;
     155                        add_meta_box( $tax_meta_box_id, $taxonomy->labels->name, $taxonomy->meta_box_cb, get_current_screen()->id, 'side', 'core', array( 'taxonomy' => $taxonomy->name ) );
     156
     157                        wp_enqueue_script( 'bp-tagbox-js', $bp->plugin_url . "bp-core/js/tagbox.{$min}js", array( 'suggest', 'wp-ajax-response' ), bp_get_version(), true  );
     158                        wp_localize_script( 'bp-tagbox-js', 'tagvars', array(
     159                                'comma' => _x( ',', 'tag delimiter', 'buddypress' ),
     160                        ) );
     161                }
     162
    129163                do_action( 'bp_groups_admin_meta_boxes' );
    130164
    131165                // Enqueue javascripts
    function bp_groups_admin_load() { 
    135169        // Index screen
    136170        } else {
    137171                // Create the Groups screen list table
    138                 $bp_groups_list_table = new BP_Groups_List_Table();
     172                $bp_groups_list_table = bp_core_admin_get_list_table( 'BP_Groups_List_Table' ) ;
    139173
    140174                // per_page screen option
    141175                add_screen_option( 'per_page', array( 'label' => _x( 'Groups', 'Groups per page (screen options)', 'buddypress' )) );
    function bp_groups_admin_load() { 
    164198                );
    165199        }
    166200
    167         $bp = buddypress();
    168 
    169201        // Enqueue CSS and JavaScript
    170202        wp_enqueue_script( 'bp_groups_admin_js', $bp->plugin_url . "bp-groups/admin/js/admin.{$min}js", array( 'jquery', 'wp-ajax-response', 'jquery-ui-autocomplete' ), bp_get_version(), true );
    171203        wp_enqueue_style( 'bp_groups_admin_css', $bp->plugin_url . "bp-groups/admin/css/admin.{$min}css", array(), bp_get_version() );
    function bp_groups_admin_load() { 
    333365                        }
    334366                }
    335367
     368                if ( ! empty( $_POST['tax_input'] ) ) {
     369                        if ( ! bp_groups_set_taxonomy( $_POST['tax_input'], $group_id ) ) {
     370                                $error = $group_id;
     371                        }
     372                }
     373
    336374                // Call actions for plugins to do something before we redirect
    337375                do_action( 'bp_group_admin_edit_after', $group_id );
    338376
    class BP_Groups_List_Table extends WP_List_Table { 
    13051343                        'comment'     => _x( 'Name', 'Groups admin Group Name column header',               'buddypress' ),
    13061344                        'description' => _x( 'Description', 'Groups admin Group Description column header', 'buddypress' ),
    13071345                        'status'      => _x( 'Status', 'Groups admin Privacy Status column header',         'buddypress' ),
     1346                        'tag'         => _x( 'Tags', 'Groups admin Tags column header',                     'buddypress' ),
    13081347                        'members'     => _x( '# Members', 'Groups admin Members column header',             'buddypress' ),
    13091348                        'last_active' => _x( 'Last Active', 'Groups admin Last Active column header',       'buddypress' )
    13101349                ) );
    class BP_Groups_List_Table extends WP_List_Table { 
    14621501        }
    14631502
    14641503        /**
     1504         * Markup for the Tag column.
     1505         *
     1506         * @since BuddyPress (2.1.0)
     1507         *
     1508         * @param array Information about the current row.
     1509         */
     1510        public function column_tag( $item = array() ) {
     1511                echo bp_core_get_the_term_list( $item['id'], 'bp_group_tags', '', ', ', '' );
     1512        }
     1513
     1514        /**
    14651515         * Markup for the Number of Members column.
    14661516         *
    14671517         * @since BuddyPress (1.7.0)
    class BP_Groups_List_Table extends WP_List_Table { 
    14971547                return apply_filters( 'bp_groups_admin_get_group_custom_column', '', $column_name, $item );
    14981548        }
    14991549}
     1550
     1551/* Group Tags Admin ***********************************************************/
     1552
     1553/**
     1554 * Maybe we should rewrite the all Group Admins to work like bp-members-admin
     1555 *
     1556 * It would avoid using globals for instance and would be best to get screen ids.
     1557 *
     1558 * As the Groups Admin is located in network admin in multisite and this area doesn't
     1559 * include an edit-tags.php file, we need to "rewrite" the "edit-bp-group-tags" admin.
     1560 */
     1561
     1562/**
     1563 * Make sure the BP Group Tags Screen includes the post type and taxonomy properties
     1564 *
     1565 * @since BuddyPress (2.1.0)
     1566 *
     1567 * @global $bp_groups_screens;
     1568 * @param WP_Screen $current_screen
     1569 */
     1570function bp_groups_admin_tags_set_current_screen( $current_screen = OBJECT ) {
     1571        global $bp_groups_screens;
     1572
     1573        if ( empty( $bp_groups_screens ) || ! in_array( $current_screen->id, $bp_groups_screens ) ) {
     1574                return;
     1575        }
     1576
     1577        $current_screen->post_type = 'bp_group';
     1578        $current_screen->taxonomy  = 'bp_group_tags';
     1579}
     1580add_action( 'current_screen', 'bp_groups_admin_tags_set_current_screen' );
     1581
     1582/**
     1583 * Set up the Group Tags admin page.
     1584 *
     1585 * @since BuddyPress (2.1.0)
     1586 *
     1587 * @global $wp_post_types the list of available post types
     1588 * @global $bp_group_tags_list_table the list table for group tags
     1589 * @global $bp_group_tags_tax the bp group tags taxonomy object
     1590 * @uses bp_core_admin_get_list_table() to load the WP_Terms_List_Table and the needed extended class
     1591 */
     1592function bp_groups_admin_tags_load() {
     1593        global $wp_post_types, $bp_group_tags_list_table, $bp_group_tags_tax;
     1594
     1595        $cheating = __( 'Cheatin&#8217; uh?', 'buddypress' );
     1596
     1597        if ( ! bp_current_user_can( 'bp_moderate' ) ) {
     1598                wp_die( $cheating );
     1599        }
     1600
     1601        $bp_group_tags_tax = get_taxonomy( get_current_screen()->taxonomy );
     1602
     1603        if ( ! $bp_group_tags_tax ) {
     1604                wp_die( __( 'Invalid taxonomy', 'buddypress' ) );
     1605        }
     1606
     1607        // Decide whether to load the dev version of the CSS and JavaScript
     1608        $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : 'min.';
     1609
     1610        $title = $bp_group_tags_tax->labels->name;
     1611
     1612        $bp_group_post_type_labels = new stdClass;
     1613        $bp_group_post_type_labels->name = __( 'Groups', 'buddypress' );
     1614
     1615        $bp_group_post_type = (object) array(
     1616                'labels' => $bp_group_post_type_labels,
     1617                'show_ui' => false,
     1618        );
     1619
     1620        $wp_post_types = array_merge( $wp_post_types, array(
     1621                'bp_group' => $bp_group_post_type
     1622        ) );
     1623
     1624        $bp_group_tags_list_table = bp_core_admin_get_list_table( 'WP_Terms_List_Table', 'wp-terms' );
     1625        $pagenum = $bp_group_tags_list_table->get_pagenum();
     1626
     1627        add_screen_option( 'per_page', array( 'label' => $title, 'default' => 20, 'option' => 'edit_' . $bp_group_tags_tax->name . '_per_page' ) );
     1628
     1629        $redirect_to = add_query_arg( 'page', 'bp-group-tags', bp_get_admin_url( 'admin.php' ) );
     1630
     1631        switch ( $bp_group_tags_list_table->current_action() ) {
     1632                case 'add-tag':
     1633
     1634                        check_admin_referer( 'add-tag', '_wpnonce_add-tag' );
     1635
     1636                        if ( ! bp_current_user_can( $bp_group_tags_tax->cap->edit_terms ) ) {
     1637                                wp_die( $cheating );
     1638                        }
     1639
     1640                        $inserted = bp_core_insert_term( $_POST['tag-name'], $bp_group_tags_tax->name, $_POST );
     1641
     1642                        if ( ! empty( $inserted ) && ! is_wp_error( $inserted ) ){
     1643                                $redirect_to = add_query_arg( 'message', 1, $redirect_to );
     1644                        } else {
     1645                                $redirect_to = add_query_arg( 'message', 4, $redirect_to );
     1646                        }
     1647                        wp_redirect( $redirect_to );
     1648                exit;
     1649
     1650                case 'delete':
     1651                case 'bulk-delete':
     1652                        $tag_IDs = array();
     1653                        $query_args = array();
     1654
     1655                        if ( empty( $_REQUEST['tag_ID'] ) && empty( $_REQUEST['delete_tags'] ) ) {
     1656                                wp_redirect( $redirect_to );
     1657                                exit;
     1658                        } else if ( ! empty( $_REQUEST['tag_ID'] ) ) {
     1659                                $tag_ID = absint( $_REQUEST['tag_ID'] );
     1660                                check_admin_referer( 'delete-tag_' . $tag_ID );
     1661                                $tag_IDs = array( $tag_ID );
     1662                                $query_args['message'] = 2;
     1663                        } else {
     1664                                check_admin_referer( 'bulk-tags' );
     1665                                $tag_IDs = wp_parse_id_list( $_REQUEST['delete_tags'] );
     1666                                $query_args['message'] = 6;
     1667                        }
     1668
     1669                        if ( ! bp_current_user_can( $bp_group_tags_tax->cap->delete_terms ) ) {
     1670                                wp_die( $cheating );
     1671                        }
     1672
     1673                        foreach ( $tag_IDs as $tag_ID ) {
     1674                                bp_core_delete_term( $tag_ID, $bp_group_tags_tax->name );
     1675                        }
     1676
     1677                        $redirect_to = add_query_arg( $query_args, $redirect_to );
     1678                        wp_redirect( $redirect_to );
     1679                exit;
     1680
     1681                case 'edit':
     1682                        // We need to reset the action of the edit form
     1683                        wp_enqueue_script( 'bp_groups_admin_tags_js', buddypress()->plugin_url . "bp-groups/admin/js/admin.{$min}js", array( 'jquery' ), bp_get_version(), true );
     1684                        wp_localize_script( 'bp_groups_admin_tags_js', 'BP_Group_Admin', array(
     1685                                'edit_action' => $redirect_to,
     1686                        ) );
     1687                        break;
     1688
     1689                case 'editedtag':
     1690                        $tag_ID = (int) $_POST['tag_ID'];
     1691                        check_admin_referer( 'update-tag_' . $tag_ID );
     1692
     1693                        if ( ! bp_current_user_can( $bp_group_tags_tax->cap->edit_terms ) )
     1694                                wp_die( $cheating );
     1695
     1696                        $tag = bp_core_get_term( $tag_ID, $bp_group_tags_tax->name );
     1697                        if ( ! $tag ) {
     1698                                wp_die( __( 'You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?', 'buddypress' ) );
     1699                        }
     1700
     1701                        $ret = bp_core_update_term( $tag_ID, $bp_group_tags_tax->name, $_POST );
     1702
     1703                        if ( ! empty( $ret ) && ! is_wp_error( $ret ) ) {
     1704                                $redirect_to = add_query_arg( 'message', 3, $redirect_to );
     1705                        } else {
     1706                                $redirect_to = add_query_arg( 'message', 5, $redirect_to );
     1707                        }
     1708
     1709                        wp_redirect( $redirect_to );
     1710                exit;
     1711
     1712                default:
     1713                        $bp_group_tags_list_table->prepare_items();
     1714                        $total_pages = $bp_group_tags_list_table->get_pagination_arg( 'total_pages' );
     1715
     1716                        if ( $pagenum > $total_pages && $total_pages > 0 ) {
     1717                                wp_redirect( add_query_arg( 'paged', $total_pages ) );
     1718                                exit;
     1719                        }
     1720
     1721                        wp_enqueue_script('admin-tags');
     1722                        wp_enqueue_script('inline-edit-tax');
     1723                        break;
     1724        }
     1725}
     1726
     1727/**
     1728 * Display the Group Tags admin page.
     1729 *
     1730 * @since BuddyPress (2.1.0)
     1731 *
     1732 * @global $bp_group_tags_list_table the list table for group tags
     1733 * @global $bp_group_tags_tax the bp group tags taxonomy object
     1734 */
     1735function bp_groups_admin_tags() {
     1736        global $bp_group_tags_list_table, $bp_group_tags_tax;
     1737
     1738        switch ( $bp_group_tags_list_table->current_action() ) {
     1739
     1740                case 'edit':
     1741                        $tax = $bp_group_tags_tax;
     1742                        $title = $bp_group_tags_tax->labels->edit_item;
     1743                        $taxonomy = $bp_group_tags_tax->name;
     1744
     1745                        $tag_ID = (int) $_REQUEST['tag_ID'];
     1746
     1747                        $tag = get_term( $tag_ID, $bp_group_tags_tax->name, OBJECT, 'edit' );
     1748                        if ( ! $tag )
     1749                                wp_die( __( 'You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?' ) );
     1750                        include( ABSPATH . 'wp-admin/edit-tag-form.php' );
     1751
     1752                break;
     1753
     1754                default:
     1755                        $form_url = add_query_arg( 'page', 'bp-group-tags', bp_get_admin_url( 'admin.php' ) );
     1756                        $messages = array(
     1757                                0 => '', // Unused. Messages start at index 1.
     1758                                1 => __( 'Group Tag added.', 'buddypress' ),
     1759                                2 => __( 'Group Tag deleted.', 'buddypress' ),
     1760                                3 => __( 'Group Tag updated.', 'buddypress' ),
     1761                                4 => __( 'Group Tag not added.', 'buddypress' ),
     1762                                5 => __( 'Group Tag not updated.', 'buddypress' ),
     1763                                6 => __( 'Group Tags deleted.', 'buddypress' ),
     1764                        );
     1765
     1766                        $message = false;
     1767                        if ( isset( $_REQUEST['message'] ) && ( $msg = (int) $_REQUEST['message'] ) ) {
     1768                                $message = $messages[ $_REQUEST['message'] ];
     1769                        }
     1770                        ?>
     1771                        <div class="wrap nosubsub">
     1772                                <h2><?php echo esc_html( $bp_group_tags_tax->labels->name );
     1773                                if ( !empty($_REQUEST['s']) )
     1774                                        printf( '<span class="subtitle">' . __('Search results for &#8220;%s&#8221;') . '</span>', esc_html( wp_unslash($_REQUEST['s']) ) ); ?>
     1775                                </h2>
     1776
     1777                                <?php if ( ! empty( $message ) ) : ?>
     1778                                        <div id="message" class="updated"><p><?php echo $message; ?></p></div>
     1779                                <?php endif; ?>
     1780                                <div id="ajax-response"></div>
     1781
     1782                                <form class="search-form" action="<?php echo esc_url( $form_url ) ;?>" method="get">
     1783                                        <input type="hidden" name="page" value="bp-group-tags" />
     1784                                        <?php $bp_group_tags_list_table->search_box( $bp_group_tags_tax->labels->search_items, 'tag' ); ?>
     1785                                </form>
     1786                                <br class="clear" />
     1787
     1788                                <div id="col-container">
     1789
     1790                                        <div id="col-right">
     1791                                                <div class="col-wrap">
     1792                                                        <form id="posts-filter" action="" method="post">
     1793
     1794                                                                <?php $bp_group_tags_list_table->display(); ?>
     1795
     1796                                                                <br class="clear" />
     1797                                                        </form>
     1798
     1799                                                        <?php do_action( "after-{$bp_group_tags_tax->name}-table", $bp_group_tags_tax->name ); ?>
     1800                                                </div>
     1801                                        </div><!-- /col-right -->
     1802
     1803                                        <div id="col-left">
     1804                                                <div class="col-wrap">
     1805
     1806                                                        <?php
     1807                                                        if ( !is_null( $bp_group_tags_tax->labels->popular_items ) ) {
     1808                                                                if ( current_user_can( $bp_group_tags_tax->cap->edit_terms ) ) {
     1809                                                                        $tag_cloud = wp_tag_cloud( array(
     1810                                                                                'taxonomy'                  => $bp_group_tags_tax->name,
     1811                                                                                'post_type'                 => 'bp_group',
     1812                                                                                'echo'                      => false,
     1813                                                                                'link'                      => 'edit',
     1814                                                                                'topic_count_text_callback' => 'bp_groups_tag_cloud_count_text_callback'
     1815                                                                        ) );
     1816                                                                } else {
     1817                                                                        $tag_cloud = wp_tag_cloud( array(
     1818                                                                                'taxonomy'                  => $bp_group_tags_tax,
     1819                                                                                'echo'                      => false,
     1820                                                                                'topic_count_text_callback' => 'bp_groups_tag_cloud_count_text_callback'
     1821                                                                        ) );
     1822                                                                }
     1823
     1824                                                                if ( $tag_cloud ) :
     1825                                                                ?>
     1826                                                                <div class="tagcloud">
     1827                                                                <h3><?php echo $bp_group_tags_tax->labels->popular_items; ?></h3>
     1828                                                                <?php echo $tag_cloud; unset( $tag_cloud ); ?>
     1829                                                                </div>
     1830                                                                <?php
     1831                                                                endif;
     1832                                                        }
     1833
     1834                                                        do_action( "{$bp_group_tags_tax->name}_pre_add_form", $bp_group_tags_tax->name );
     1835                                                        ?>
     1836
     1837                                                        <div class="form-wrap">
     1838                                                                <h3><?php echo $bp_group_tags_tax->labels->add_new_item; ?></h3>
     1839
     1840                                                                <form id="addtag" method="post" action="<?php echo esc_url( $form_url ) ;?>" class="validate"<?php do_action( "{$bp_group_tags_tax->name}_term_new_form_tag" ); ?>>
     1841                                                                        <input type="hidden" name="action" value="add-tag" />
     1842                                                                        <input type="hidden" name="screen" value="edit-<?php echo esc_attr( $bp_group_tags_tax->name ); ?>" />
     1843                                                                        <input type="hidden" name="taxonomy" value="<?php echo esc_attr( $bp_group_tags_tax->name ); ?>" />
     1844                                                                        <input type="hidden" name="post_type" value="bp_group" />
     1845                                                                        <?php wp_nonce_field('add-tag', '_wpnonce_add-tag'); ?>
     1846
     1847                                                                        <div class="form-field form-required">
     1848                                                                                <label for="tag-name"><?php _ex( 'Name', 'Taxonomy Name', 'buddypress' ); ?></label>
     1849                                                                                <input name="tag-name" id="tag-name" type="text" value="" size="40" aria-required="true" />
     1850                                                                                <p><?php _e('The name is how it appears on your site.'); ?></p>
     1851                                                                        </div>
     1852
     1853                                                                        <?php if ( ! global_terms_enabled() ) : ?>
     1854                                                                                <div class="form-field">
     1855                                                                                        <label for="tag-slug"><?php _ex( 'Slug', 'Taxonomy Slug', 'buddypress' ); ?></label>
     1856                                                                                        <input name="slug" id="tag-slug" type="text" value="" size="40" />
     1857                                                                                        <p><?php _e('The &#8220;slug&#8221; is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.', 'buddypress' ); ?></p>
     1858                                                                                </div>
     1859                                                                        <?php endif; // global_terms_enabled() ?>
     1860
     1861                                                                        <div class="form-field">
     1862                                                                                <label for="tag-description"><?php _ex( 'Description', 'Taxonomy Description', 'buddypress' ); ?></label>
     1863                                                                                <textarea name="description" id="tag-description" rows="5" cols="40"></textarea>
     1864                                                                                <p><?php _e( 'The description is not prominent by default; however, some themes may show it.', 'buddypress' ); ?></p>
     1865                                                                        </div>
     1866
     1867                                                                        <?php do_action( "{$bp_group_tags_tax->name}_add_form_fields", $bp_group_tags_tax->name );
     1868
     1869                                                                        submit_button( $bp_group_tags_tax->labels->add_new_item );
     1870
     1871                                                                        do_action( "{$bp_group_tags_tax->name}_add_form", $bp_group_tags_tax->name );
     1872                                                                        ?>
     1873                                                                </form>
     1874
     1875                                                        </div>
     1876
     1877                                                </div>
     1878                                        </div><!-- /col-left -->
     1879
     1880                                </div><!-- /col-container -->
     1881                        </div><!-- /wrap -->
     1882                        <script type="text/javascript">
     1883                        try{document.forms.addtag['tag-name'].focus();}catch(e){}
     1884                        </script>
     1885                        <?php $bp_group_tags_list_table->inline_edit();
     1886                break;
     1887        }
     1888}
     1889
     1890// Filters
     1891
     1892/**
     1893 * Override the edit link for the bp_group_tags taxo
     1894 *
     1895 * @since BuddyPress (2.1.0)
     1896 */
     1897function bp_groups_admin_tags_edit_term_link( $link = '', $term_id = 0, $taxonomy = '', $object_type = '' ) {
     1898        if ( empty( $taxonomy ) || 'bp_group_tags' != $taxonomy ) {
     1899                return $link;
     1900        }
     1901
     1902        $query_args = array(
     1903                'page'   => 'bp-group-tags',
     1904                'action' => 'edit',
     1905                'tag_ID' => $term_id,
     1906        );
     1907
     1908        return add_query_arg( $query_args, bp_get_admin_url( 'admin.php' ) );
     1909
     1910}
     1911add_filter( 'get_edit_term_link', 'bp_groups_admin_tags_edit_term_link', 10, 4 );
     1912
     1913/**
     1914 * Override the delete link for the bp_group_tags taxonomy
     1915 *
     1916 * @since BuddyPress (2.1.0)
     1917 */
     1918function bp_groups_admin_tags_row_action( $actions = array(), $tag ) {
     1919        if ( empty( $tag ) ) {
     1920                return $actions;
     1921        }
     1922
     1923        // Only the delete action is to edit.
     1924        $query_args = array(
     1925                'page'     => 'bp-group-tags',
     1926                'action'   => 'delete',
     1927                'tag_ID'   => $tag->term_id,
     1928                'taxonomy' => 'bp_group_tags'
     1929        );
     1930        $delete_link = add_query_arg( $query_args, bp_get_admin_url( 'admin.php' ) );
     1931        $actions['delete'] = "<a class='delete-tag' href='" . esc_url( wp_nonce_url( $delete_link, 'delete-tag_' . $tag->term_id ) ) . "'>" . esc_html( _x( 'Delete', 'Group Tags term delete link', 'buddypress' ) ) . "</a>";
     1932
     1933        return $actions;
     1934}
     1935add_filter( 'bp_group_tags_row_actions', 'bp_groups_admin_tags_row_action', 10, 2 );
  • src/bp-groups/bp-groups-classes.php

    diff --git src/bp-groups/bp-groups-classes.php src/bp-groups/bp-groups-classes.php
    index 3b98ff5..435e95f 100644
    class BP_Groups_Group { 
    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,
    class BP_Groups_Group { 
    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                }
    class BP_Groups_Group { 
    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})";
    class BP_Groups_Group { 
    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

    diff --git src/bp-groups/bp-groups-filters.php src/bp-groups/bp-groups-filters.php
    index 5ec2d91..49ebb06 100644
    function groups_filter_forums_root_page_sql( $sql ) { 
    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

    diff --git src/bp-groups/bp-groups-functions.php src/bp-groups/bp-groups-functions.php
    index 971f8b1..f1a7819 100644
    function groups_delete_group( $group_id ) { 
    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;
    function groups_get_groups( $args = '' ) { 
    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
    function groups_get_groups( $args = '' ) { 
    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'],
    function groups_get_groups( $args = '' ) { 
    542547}
    543548
    544549function groups_get_total_group_count() {
    545         if ( !$count = wp_cache_get( 'bp_total_group_count', 'bp' ) ) {
    546                 $count = BP_Groups_Group::get_total_group_count();
    547                 wp_cache_set( 'bp_total_group_count', $count, 'bp' );
     550        if ( bp_is_groups_tag() ) {
     551                $count = absint( buddypress()->groups->tag->count );
     552        } else {
     553                if ( ! $count = wp_cache_get( 'bp_total_group_count', 'bp' ) ) {
     554                        $count = BP_Groups_Group::get_total_group_count();
     555                        wp_cache_set( 'bp_total_group_count', $count, 'bp' );
     556                }
    548557        }
    549558
    550559        return $count;
    function groups_total_groups_for_user( $user_id = 0 ) { 
    568577                wp_cache_set( 'bp_total_groups_for_user_' . $user_id, $count, 'bp' );
    569578        }
    570579
     580        if ( ! empty( $count ) && bp_is_groups_tag() ) {
     581                $user_groups = groups_get_user_groups( $user_id );
     582                $current_tag_groups = bp_core_get_objects_in_term( buddypress()->groups->tag->term_id, 'bp_group_tags' );
     583                $count = count( array_intersect( $user_groups['groups'], $current_tag_groups ) );
     584        }
     585
    571586        return $count;
    572587}
    573588
    function groups_remove_data_for_user( $user_id ) { 
    11531168add_action( 'wpmu_delete_user',  'groups_remove_data_for_user' );
    11541169add_action( 'delete_user',       'groups_remove_data_for_user' );
    11551170add_action( 'bp_make_spam_user', 'groups_remove_data_for_user' );
     1171
     1172/* Group Tags *****************************************************************/
     1173
     1174/**
     1175 * Set group tags
     1176 *
     1177 * @since BuddyPress (2.1.0)
     1178 *
     1179 * @param array $taxonomies
     1180 * @param integer $group_id
     1181 * @return true on success, false on failure
     1182 */
     1183function bp_groups_set_taxonomy( $taxonomies = array(), $group_id = 0 ) {
     1184        $retval = true;
     1185
     1186        if ( empty( $group_id ) ) {
     1187                return false;
     1188        }
     1189
     1190        foreach ( $taxonomies as $taxonomy => $tags ) {
     1191                $taxonomy_obj = get_taxonomy( $taxonomy );
     1192
     1193                if ( is_array( $tags ) ) {
     1194                        $tags = array_filter( $tags );
     1195                } else {
     1196                        $comma = _x( ',', 'tag delimiter', 'buddypress' );
     1197                        if ( ',' !== $comma ){
     1198                                $tags = str_replace( $comma, ',', $tags );
     1199                        }
     1200
     1201                        $tags = explode( ',', trim( $tags, " \n\t\r\0\x0B," ) );
     1202                }
     1203                if ( bp_current_user_can( $taxonomy_obj->cap->assign_terms ) ) {
     1204                        $result = bp_core_set_object_terms( $group_id, $tags, $taxonomy );
     1205
     1206                        if ( is_wp_error( $result ) ) {
     1207                                $retval = false;
     1208                        }
     1209                }
     1210        }
     1211
     1212        return $retval;
     1213}
     1214
     1215/**
     1216 * Set tag cloud count text callback
     1217 *
     1218 * @since BuddyPress (2.1.0)
     1219 *
     1220 * @param integer $count
     1221 * @return string the count text callback
     1222 */
     1223function bp_groups_tag_cloud_count_text_callback( $count = 0 ) {
     1224        return sprintf( _n( '%d Group', '%d Groups', $count, 'buddypress' ), $count );
     1225}
  • src/bp-groups/bp-groups-loader.php

    diff --git src/bp-groups/bp-groups-loader.php src/bp-groups/bp-groups-loader.php
    index 08edbff..60a2edc 100644
    class BP_Groups_Component extends BP_Component { 
    231231                        'members',
    232232                        'settings',
    233233                        'avatar',
     234                        bp_get_groups_tag_slug(),
    234235                        $this->slug,
    235236                        $this->root_slug,
    236237                ) );
    class BP_Groups_Component extends BP_Component { 
    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

    diff --git src/bp-groups/bp-groups-screens.php src/bp-groups/bp-groups-screens.php
    index c2feff5..4181a0f 100644
    function groups_screen_group_admin_edit_details() { 
    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' ) );
    class BP_Groups_Theme_Compat { 
    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

    diff --git src/bp-groups/bp-groups-template.php src/bp-groups/bp-groups-template.php
    index 5084984..aab582c 100644
    class BP_Groups_Template { 
    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
    class BP_Groups_Template { 
    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,
    function bp_has_groups( $args = '' ) { 
    341343                $search_terms = false;
    342344        }
    343345
     346        $tax_query = array();
     347        if ( bp_is_groups_tag() ) {
     348                $tax_query = array(
     349                        array(
     350                                'taxonomy' => 'bp_group_tags',
     351                                'terms'    => $bp->groups->tag->term_id,
     352                                'field'    => 'term_id',
     353                        )
     354                );
     355        }
     356
    344357        $defaults = array(
    345358                'type'              => $type, // 'type' is an override for 'order' and 'orderby'. See docblock.
    346359                'order'             => 'DESC',
    function bp_has_groups( $args = '' ) { 
    356369                'slug'              => $slug,    // Pass a group slug to only return that group
    357370                'search_terms'      => $search_terms, // Pass search terms to return only matching groups
    358371                'meta_query'        => false,    // Filter by groupmeta. See WP_Meta_Query for format
     372                'tax_query'         => $tax_query,
    359373                'include'           => false,    // Pass comma separated list or array of group ID's to return only these groups
    360374                'exclude'           => false,    // Pass comma separated list or array of group ID's to exclude these groups
    361375
    function bp_has_groups( $args = '' ) { 
    378392                'slug'              => $r['slug'],
    379393                'search_terms'      => $r['search_terms'],
    380394                'meta_query'        => $r['meta_query'],
     395                'tax_query'         => $r['tax_query'],
    381396                'include'           => $r['include'],
    382397                'exclude'           => $r['exclude'],
    383398                'populate_extras'   => (bool) $r['populate_extras'],
    function bp_groups_get_profile_stats( $args = '' ) { 
    38173832        // Filter and return
    38183833        return apply_filters( 'bp_groups_get_profile_stats', $r['output'], $r );
    38193834}
     3835
     3836/* Group Tags *****************************************************************/
     3837
     3838/**
     3839 * Output the groups component tag slug
     3840 *
     3841 * @package BuddyPress
     3842 * @subpackage Groups Template
     3843 * @since BuddyPress (2.1.0)
     3844 *
     3845 * @uses bp_get_groups_tag_slug()
     3846 */
     3847function bp_groups_tag_slug() {
     3848        echo bp_get_groups_tag_slug();
     3849}
     3850
     3851        /**
     3852         * Return the groups component tag slug
     3853         *
     3854         * @package BuddyPress
     3855         * @subpackage Groups Template
     3856         * @since BuddyPress (2.1.0)
     3857         */
     3858        function bp_get_groups_tag_slug() {
     3859                return apply_filters( 'bp_get_groups_tag_slug', 'tag' );
     3860        }
     3861
     3862/**
     3863 * Output the current group tagbox
     3864 *
     3865 * @package BuddyPress
     3866 * @subpackage Groups Template
     3867 * @since BuddyPress (2.1.0)
     3868 *
     3869 * @uses bp_get_group_tagbox()
     3870 */
     3871function bp_group_tagbox() {
     3872        echo bp_get_group_tagbox();
     3873}
     3874        /**
     3875         * Return the current group tagbox
     3876         *
     3877         * @package BuddyPress
     3878         * @subpackage Groups Template
     3879         * @since BuddyPress (2.1.0)
     3880         */
     3881        function bp_get_group_tagbox() {
     3882                $bp = buddypress();
     3883
     3884                $group = $bp->groups->current_group;
     3885
     3886                if ( empty( $group ) ) {
     3887                        $group = new stdClass;
     3888                        $group->id = 0;
     3889                }
     3890
     3891                $box = array(
     3892                        'taxonomy' => 'bp_group_tags',
     3893                        'title'    => __( 'Group Tags', 'buddypress' ),
     3894                );
     3895
     3896                require_once( ABSPATH . 'wp-admin/includes/taxonomy.php' );
     3897
     3898                ob_start();
     3899                bp_tags_meta_box( $group, $box );
     3900                $tagbox = ob_get_contents();
     3901                ob_end_clean();
     3902
     3903                return apply_filters( 'bp_get_group_tagbox', '<div class="inside">' . $tagbox . '</div>' );
     3904        }
     3905
     3906/**
     3907 * Output infos about the tag being browsed in Groups Directory
     3908 *
     3909 * @package BuddyPress
     3910 * @subpackage Groups Template
     3911 * @since BuddyPress (2.1.0)
     3912 *
     3913 * @uses bp_get_groups_tag_browsing_info()
     3914 */
     3915function bp_groups_tag_browsing_info() {
     3916        echo bp_get_groups_tag_browsing_info();
     3917}
     3918add_action( 'bp_before_directory_groups_content', 'bp_groups_tag_browsing_info' );
     3919
     3920        /**
     3921         * Return infos about the tag being browsed in Groups Directory
     3922         *
     3923         * @package BuddyPress
     3924         * @subpackage Groups Template
     3925         * @since BuddyPress (2.1.0)
     3926         */
     3927        function bp_get_groups_tag_browsing_info() {
     3928                $bp = buddypress();
     3929
     3930                if ( empty( $bp->groups->tag ) ) {
     3931                        return;
     3932                }
     3933
     3934                $output  = '<div class="groups-tag-infos">';
     3935                $output .= '<h4>' . sprintf( esc_html__( 'You are browing Groups tagged : %s', 'buddypress' ), $bp->groups->tag->name ) . '</h4>';
     3936
     3937                if ( ! empty( $bp->groups->tag->description ) ) {
     3938                        $output .= '<p>' . esc_html( $bp->groups->tag->description ) . '</p>';
     3939                }
     3940
     3941                $output .= '<p><a href="' . esc_url( bp_get_groups_directory_permalink() ) . '" title="' . esc_attr__( 'View all Groups', 'buddypress' ) . '">' . esc_html__( 'View all Groups', 'buddypress' ) . '</a></p>';
     3942
     3943                $output .= '</div>';
     3944
     3945                return apply_filters( 'bp_get_groups_tag_browsing_info', $output, $bp->groups->tag );
     3946        }
     3947
     3948/**
     3949 * Output group tags
     3950 *
     3951 * @package BuddyPress
     3952 * @subpackage Groups Template
     3953 * @since BuddyPress (2.1.0)
     3954 *
     3955 * @uses bp_get_groups_the_tags()
     3956 */
     3957function bp_groups_the_tags() {
     3958        echo bp_get_groups_the_tags();
     3959}
     3960add_action( 'bp_directory_groups_item',    'bp_groups_the_tags' );
     3961add_action( 'bp_before_group_header_meta', 'bp_groups_the_tags' );
     3962
     3963        /**
     3964         * Return group tags
     3965         *
     3966         * @package BuddyPress
     3967         * @subpackage Groups Template
     3968         * @since BuddyPress (2.1.0)
     3969         */
     3970        function bp_get_groups_the_tags() {
     3971                $group_id = bp_get_group_id();
     3972
     3973                if ( empty( $group_id ) ) {
     3974                        return;
     3975                }
     3976
     3977                $tag_list  = '<div class="group-tags">';
     3978                $tag_list .= '<span>' . esc_html__( 'Tagged in:', 'buddypress' ) . ' </span>';
     3979                $tag_list .= bp_core_get_the_term_list( $group_id, 'bp_group_tags', '', ', ', '' );
     3980                $tag_list .= '</div>';
     3981
     3982                return apply_filters( 'bp_get_groups_the_tags', $tag_list, $group_id );
     3983        }
  • src/bp-templates/bp-legacy/buddypress/groups/create.php

    diff --git src/bp-templates/bp-legacy/buddypress/groups/create.php src/bp-templates/bp-legacy/buddypress/groups/create.php
    index b90223d..650d0b2 100644
     
    3535                                        <textarea name="group-desc" id="group-desc" aria-required="true"><?php bp_new_group_description(); ?></textarea>
    3636                                </div>
    3737
     38                                <div id="tagsdiv-bp_group_tags" class="bp-tag-editor">
     39                                        <?php bp_group_tagbox();?>
     40                                </div>
     41
    3842                                <?php
    3943                                do_action( 'bp_after_group_details_creation_step' );
    4044                                do_action( 'groups_custom_group_fields_editable' ); // @Deprecated
     
    303307
    304308</div>
    305309
    306 <?php do_action( 'bp_after_create_group_page' ); ?>
    307  No newline at end of file
     310<?php do_action( 'bp_after_create_group_page' ); ?>
  • src/bp-templates/bp-legacy/buddypress/groups/single/admin.php

    diff --git src/bp-templates/bp-legacy/buddypress/groups/single/admin.php src/bp-templates/bp-legacy/buddypress/groups/single/admin.php
    index 90dfb3b..2f044c3 100644
     
    1919        <label for="group-desc"><?php _e( 'Group Description (required)', 'buddypress' ); ?></label>
    2020        <textarea name="group-desc" id="group-desc" aria-required="true"><?php bp_group_description_editable(); ?></textarea>
    2121
     22        <div id="tagsdiv-bp_group_tags" class="bp-tag-editor">
     23                <?php bp_group_tagbox();?>
     24        </div>
     25
    2226        <?php do_action( 'groups_custom_group_fields_editable' ); ?>
    2327
    2428        <p>
  • src/bp-templates/bp-legacy/css/buddypress.css

    diff --git src/bp-templates/bp-legacy/css/buddypress.css src/bp-templates/bp-legacy/css/buddypress.css
    index 6441cd3..9e31ad1 100644
    body.activity-permalink #buddypress div.activity-comments div.acomment-content { 
    501501        clear: both;
    502502}
    503503
     504#buddypress div.groups-tag-infos {
     505        float:left;
     506        margin-top:39px;
     507}
     508
    504509/*--------------------------------------------------------------
    5055103.4 - Errors / Success Messages
    506511--------------------------------------------------------------*/
    a.bp-title-button { 
    10911096        background-color: #ffd;
    10921097        border: 1px solid #cb2;
    10931098        color: #440;
    1094        
     1099
    10951100}
    10961101#buddypress div#item-header {
    10971102        overflow: hidden;