includes(); /** * Put your component into the active components array, so that * bp_is_active( 'example' ); * returns true when appropriate. We have to do this manually, because non-core * components are not saved as active components in the database. */ $bp->active_components[$this->id] = '1'; /** * Hook the register_post_types() method. If you're using custom post types to store * data (which is recommended), you will need to hook your function manually to * 'init'. */ add_action( 'init', array( &$this, 'register_post_types' ) ); } /** * Include your component's files * * BP_Component has a method called includes(), which will automatically load your plugin's * files, as long as they are properly named and arranged. BP_Component::includes() loops * through the $includes array, defined below, and for each $file in the array, it tries * to load files in the following locations: * (1) $this->path . '/' . $file - For example, if your $includes array is defined as * $includes = array( 'notifications.php', 'filters.php' ); * BP_Component::includes() will try to load these files (assuming a typical WP * setup): * /wp-content/plugins/bp-example/notifications.php * /wp-content/plugins/bp-example/filters.php * Our includes function, listed below, uses a variation on this method, by specifying * the 'includes' directory in our $includes array. * (2) $this->path . '/bp-' . $this->id . '/' . $file - Assuming the same $includes array * as above, BP will look for the following files: * /wp-content/plugins/bp-example/bp-example/notifications.php * /wp-content/plugins/bp-example/bp-example/filters.php * (3) $this->path . '/bp-' . $this->id . '/' . 'bp-' . $this->id . '-' . $file . '.php' - * This is the format that BuddyPress core components use to load their files. Given * an $includes array like * $includes = array( 'notifications', 'filters' ); * BP looks for files at: * /wp-content/plugins/bp-example/bp-example/bp-example-notifications.php * /wp-content/plugins/bp-example/bp-example/bp-example-filters.php * * If you'd prefer not to use any of these naming or organizational schemas, you are not * required to use parent::includes(); your own includes() method can require the files * manually. For example: * require( $this->path . '/includes/notifications.php' ); * require( $this->path . '/includes/filters.php' ); * * Notice that this method is called directly in $this->__construct(). While this step is * not necessary for BuddyPress core components, plugins are loaded later, and thus their * includes() method must be invoked manually. * * Our example component includes a fairly large number of files. Your component may not * need to have versions of all of these files. What follows is a short description of * what each file does; for more details, open the file itself and see its inline docs. * - -actions.php - Functions hooked to bp_actions, mainly used to catch action * requests (save, delete, etc) * - -screens.php - Functions hooked to bp_screens. These are the screen functions * responsible for the display of your plugin's content. * - -filters.php - Functions that are hooked via apply_filters() * - -classes.php - Your plugin's classes. Depending on how you organize your * plugin, this could mean: a database query class, a custom post * type data schema, and so forth * - -activity.php - Functions related to the BP Activity Component. This is where * you put functions responsible for creating, deleting, and * modifying activity items related to your component * - -template.php - Template tags. These are functions that are called from your * templates, or from your screen functions. If your plugin * contains its own version of the WordPress Loop (such as * bp_example_has_items()), those functions should go in this file. * - -functions.php - Miscellaneous utility functions required by your component. * - -notifications.php - Functions related to email notification, as well as the * BuddyPress notifications that show up in the admin bar. * - -widgets.php - If your plugin includes any sidebar widgets, define them in this * file. * - -buddybar.php - Functions related to the BuddyBar. * - -adminbar.php - Functions related to the WordPress Admin Bar. * - -cssjs.php - Here is where you set up and enqueue your CSS and JS. * - -ajax.php - Functions used in the process of AJAX requests. * * @package BuddyPress_Skeleton_Component * @since 1.6 */ function includes() { // Files to include $includes = array( 'includes/bp-example-actions.php', 'includes/bp-example-screens.php', 'includes/bp-example-filters.php', 'includes/bp-example-classes.php', 'includes/bp-example-activity.php', 'includes/bp-example-template.php', 'includes/bp-example-functions.php', 'includes/bp-example-notifications.php', 'includes/bp-example-widgets.php', 'includes/bp-example-cssjs.php', 'includes/bp-example-ajax.php' ); parent::includes( $includes ); // As an example of how you might do it manually, let's include the functions used // on the WordPress Dashboard conditionally: if ( is_admin() || is_network_admin() ) { include( BP_EXAMPLE_PLUGIN_DIR . '/includes/bp-example-admin.php' ); } } /** * Set up your plugin's globals * * Use the parent::setup_globals() method to set up the key global data for your plugin: * - 'slug' - This is the string used to create URLs when your component * adds navigation underneath profile URLs. For example, * in the URL http://testbp.com/members/boone/example, the * 'example' portion of the URL is formed by the 'slug'. * Site admins can customize this value by defining * BP_EXAMPLE_SLUG in their wp-config.php or bp-custom.php * files. * - 'root_slug' - This is the string used to create URLs when your component * adds navigation to the root of the site. In other words, * you only need to define root_slug if your component is a * "root component". Eg, in: * http://testbp.com/example/test * 'example' is a root slug. This should always be defined * in terms of $bp->pages; see the example below. Site admins * can customize this value by changing the permalink of the * corresponding WP page in the Dashboard. NOTE: * 'root_slug' requires that 'has_directory' is true. * - 'has_directory' - Set this to true if your component requires a top-level * directory, such as http://testbp.com/example. When * 'has_directory' is true, BP will require that site admins * associate a WordPress page with your component. NOTE: * When 'has_directory' is true, you must also define your * component's 'root_slug'; see previous item. Defaults to * false. * - 'notification_callback' - The name of the function that is used to format BP * admin bar notifications for your component. * - 'search_string' - If your component is a root component (has_directory), * you can provide a custom string that will be used as the * default text in the directory search box. * - 'global_tables' - If your component creates custom database tables, store * the names of the tables in a $global_tables array, so that * they are available to other BP functions. * * You can also use this function to put data directly into the $bp global. * * @package BuddyPress_Skeleton_Component * @since 1.6 * * @global obj $bp BuddyPress's global object */ function setup_globals() { global $bp; // Defining the slug in this way makes it possible for site admins to override it if ( !defined( 'BP_EXAMPLE_SLUG' ) ) define( 'BP_EXAMPLE_SLUG', $this->id ); // Global tables for the example component. Build your table names using // $bp->table_prefix (instead of hardcoding 'wp_') to ensure that your component // works with $wpdb, multisite, and custom table prefixes. $global_tables = array( 'table_name' => $bp->table_prefix . 'bp_example' ); // Set up the $globals array to be passed along to parent::setup_globals() $globals = array( 'slug' => BP_EXAMPLE_SLUG, 'root_slug' => isset( $bp->pages->{$this->id}->slug ) ? $bp->pages->{$this->id}->slug : BP_EXAMPLE_SLUG, 'has_directory' => true, // Set to false if not required 'notification_callback' => 'bp_example_format_notifications', 'search_string' => __( 'Search Examples...', 'buddypress' ), 'global_tables' => $global_tables ); // Let BP_Component::setup_globals() do its work. parent::setup_globals( $globals ); // If your component requires any other data in the $bp global, put it there now. $bp->{$this->id}->misc_data = '123'; } /** * Set up your component's navigation. * * The navigation elements created here are responsible for the main site navigation (eg * Profile > Activity > Mentions), as well as the navigation in the BuddyBar. WP Admin Bar * navigation is broken out into a separate method; see * BP_Example_Component::setup_admin_bar(). * * @global obj $bp */ function setup_nav() { // Add 'Example' to the main navigation $main_nav = array( 'name' => __( 'Example', 'bp-example' ), 'slug' => bp_get_example_slug(), 'position' => 80, 'screen_function' => 'bp_example_screen_one', 'default_subnav_slug' => 'screen-one' ); $example_link = trailingslashit( bp_loggedin_user_domain() . bp_get_example_slug() ); // Add a few subnav items under the main Example tab $sub_nav[] = array( 'name' => __( 'Screen One', 'bp-example' ), 'slug' => 'screen-one', 'parent_url' => $example_link, 'parent_slug' => bp_get_example_slug(), 'screen_function' => 'bp_example_screen_one', 'position' => 10 ); // Add the subnav items to the friends nav item $sub_nav[] = array( 'name' => __( 'Screen Two', 'bp-example' ), 'slug' => 'screen-two', 'parent_url' => $example_link, 'parent_slug' => bp_get_example_slug(), 'screen_function' => 'bp_example_screen_two', 'position' => 20 ); parent::setup_nav( $main_nav, $sub_nav ); // If your component needs additional navigation menus that are not handled by // BP_Component::setup_nav(), you can register them manually here. For example, // if your component needs a subsection under a user's Settings menu, add // it like this. See bp_example_screen_settings_menu() for more info bp_core_new_subnav_item( array( 'name' => __( 'Example', 'bp-example' ), 'slug' => 'example-admin', 'parent_slug' => bp_get_settings_slug(), 'parent_url' => trailingslashit( bp_loggedin_user_domain() . bp_get_settings_slug() ), 'screen_function' => 'bp_example_screen_settings_menu', 'position' => 40, 'user_has_access' => bp_is_my_profile() // Only the logged in user can access this on his/her profile ) ); } /** * If your component needs to store data, it is highly recommended that you use WordPress * custom post types for that data, instead of creating custom database tables. * * In the future, BuddyPress will have its own bp_register_post_types hook. For the moment, * hook to init. See BP_Example_Component::__construct(). * * @package BuddyPress_Skeleton_Component * @since 1.6 * @see http://codex.wordpress.org/Function_Reference/register_post_type */ function register_post_types() { // Set up some labels for the post type $labels = array( 'name' => __( 'High Fives', 'bp-example' ), 'singular' => __( 'High Five', 'bp-example' ) ); // Set up the argument array for register_post_type() $args = array( 'label' => __( 'High Fives', 'bp-example' ), 'labels' => $labels, 'public' => false, 'show_ui' => true, 'supports' => array( 'title' ) ); // Register the post type. // Here we are using $this->id ('example') as the name of the post type. You may // choose to use a different name for the post type; if you register more than one, // you will have to declare more names. register_post_type( $this->id, $args ); parent::register_post_types(); } function register_taxonomies() { } } /** * Loads your component into the $bp global * * This function loads your component into the $bp global. By hooking to bp_loaded, we ensure that * BP_Example_Component is loaded after BuddyPress's core components. This is a good thing because * it gives us access to those components' functions and data, should our component interact with * them. * * Keep in mind that, when this function is launched, your component has only started its setup * routine. Using print_r( $bp->example ) or var_dump( $bp->example ) at the end of this function * will therefore only give you a partial picture of your component. If you need to dump the content * of your component for troubleshooting, try doing it at bp_init, ie * function bp_example_var_dump() { * global $bp; * var_dump( $bp->example ); * } * add_action( 'bp_init', 'bp_example_var_dump' ); * It goes without saying that you should not do this on a production site! * * @package BuddyPress_Skeleton_Component * @since 1.6 */ function bp_example_load_core_component() { global $bp; $bp->example = new BP_Example_Component; } add_action( 'bp_loaded', 'bp_example_load_core_component' ); ?>