Skip to:
Content

BuddyPress.org

Ticket #5122: 5122.03.diff

File 5122.03.diff, 12.0 KB (added by imath, 13 years ago)
  • bp-core/bp-core-functions.php

     
    14111411        <?php
    14121412}
    14131413add_action( 'wp_footer', 'bp_core_print_generation_time' );
     1414
     1415
     1416/* BP Nav Menu */
     1417
     1418/**
     1419 * Builds a list of page to display in WP Nav Menu BuddyPress accordeon
     1420 *
     1421 * Or if a slug is given, returns the good link for the current loggedin user
     1422 *
     1423 * @param  string $selected bo_nav slug
     1424 * @uses   bp_core_get_directory_page_ids() to get all the directory page, and check 'register' is in
     1425 * @uses   get_the_title() to get the title for the registration page
     1426 * @uses   get_permalink() to get the link to the registration page
     1427 * @uses   buddypress() to get the bp_nav items
     1428 * @return mixed           an url or a dummy array of pages
     1429 */
     1430function bp_get_nav_item_pages( $selected = '' ) {
     1431
     1432        $utilities = array(
     1433                array(
     1434                        'name' => __('Log in/Log out', 'buddypress'),
     1435                        'slug' => 'login',
     1436                        'link' => wp_login_url()
     1437                )
     1438        );
     1439
     1440        $bp_directory_page_ids = bp_core_get_directory_page_ids();
     1441
     1442        if( !empty( $bp_directory_page_ids['register'] ) ) {
     1443                $utilities[] = array(
     1444                        'name' => get_the_title( $bp_directory_page_ids['register'] ),
     1445                        'slug' => 'register',
     1446                        'link' => get_permalink( $bp_directory_page_ids['register'] )
     1447                );
     1448        }
     1449
     1450        $bp_menu_items = buddypress()->bp_nav;
     1451        $bp_menu_items = array_merge( $utilities, $bp_menu_items );
     1452        $page_args = array();
     1453
     1454        if( count( $bp_menu_items ) < 1 )
     1455                return false;
     1456
     1457        $found = '';
     1458
     1459        foreach( $bp_menu_items as $bp_item ) {
     1460                $item_name = '';
     1461
     1462                if( !empty( $selected ) && $bp_item['slug'] == $selected )
     1463                        return $bp_item['link'];
     1464
     1465                else {
     1466
     1467                        // deleting <span>number</span>
     1468                        $item_name = preg_replace( '/([.0-9]+)/', '', $bp_item['name'] );
     1469                        $item_name = trim( wp_kses( $item_name, array() ) );
     1470
     1471                        $page_args[] = (object) array(
     1472                                'ID'             => -1,
     1473                                'post_title'     => $item_name,
     1474                                'post_author'    => 0,
     1475                                'post_date'      => 0,
     1476                                'post_excerpt'   => $bp_item['slug'],
     1477                                'post_type'      => 'page',
     1478                                'post_status'    => 'publish',
     1479                                'comment_status' => 'closed',
     1480                                'guid'           => $bp_item['link']
     1481                        );
     1482                }
     1483
     1484        }
     1485       
     1486        return $page_args;
     1487       
     1488}
  • bp-core/bp-core-filters.php

     
    386386add_filter( 'bp_modify_page_title', 'wptexturize'     );
    387387add_filter( 'bp_modify_page_title', 'convert_chars'   );
    388388add_filter( 'bp_modify_page_title', 'esc_html'        );
     389
     390
     391/* BP Nav Menu */
     392
     393/**
     394 * Filters wp_setup_nav_menu_item to adapt the links to current user
     395 *
     396 * If user is not logged in regiser menu and login menu item must show
     397 * If user is logged in register menu must be unset and logout must replace login
     398 *
     399 * @param  WP_Post $menu_item the menu item
     400 * @uses   is_admin() to check we're in backend
     401 * @uses   is_user_logged_in() to check if we have a user logged in
     402 * @uses   wp_logout_url() to build the log out url
     403 * @uses   bp_get_root_domain() to be redirected to root domain url once logged out
     404 * @uses   wp_login_url() to build log in url
     405 * @uses   wp_guess_url() to be redirected to be redirected at the best place once logged in
     406 * @uses   bp_get_nav_item_pages() to get the url for the user's nav
     407 * @uses   bp_get_requested_url() to get the current url
     408 * @return WP_Post            a modified menu item if needed
     409 */
     410function bp_setup_nav_menu_item( $menu_item ) {
     411
     412        if( is_admin() )
     413                return $menu_item;
     414
     415        $css_target = preg_match( '/\sbp-(.*)-nav/', implode( ' ', $menu_item->classes), $matches );
     416
     417        if( empty( $matches[1] ) )
     418                return $menu_item;
     419
     420        switch( $matches[1] ) {
     421                case 'login' :
     422                                if( is_user_logged_in() ) {
     423                                        $menu_item->url = wp_logout_url( bp_get_root_domain() );
     424                                        $menu_item->title = __( 'Log out', 'buddypress' );
     425                                } else {
     426                                        $menu_item->url = wp_login_url( wp_guess_url() );
     427                                        $menu_item->title = __( 'Log in', 'buddypress' );
     428                                }
     429                                       
     430                        break;
     431
     432                case 'register' :
     433                                if( is_user_logged_in() )
     434                                        $menu_item->_invalid = true;
     435                        break;
     436
     437                default:
     438                                if( is_user_logged_in() )
     439                                        $menu_item->url = bp_get_nav_item_pages( $matches[1] );
     440                                else
     441                                        $menu_item->_invalid = true;
     442                        break;
     443        }
     444
     445        $current = bp_get_requested_url();
     446
     447        if( strpos( $current, $menu_item->url ) !== false )
     448                $menu_item->classes[] = 'current_page_item';
     449
     450        return $menu_item;
     451}
     452
     453add_filter( 'wp_setup_nav_menu_item', 'bp_setup_nav_menu_item', 10, 1 );
  • bp-core/admin/bp-core-functions.php

     
    642642
    643643        return $action;
    644644}
     645
     646
     647/* BP Nav Menu */
     648
     649/**
     650 * Registers a meta box for BuddyPress WP Nav Menu and a js at the bottom of the page
     651 *
     652 * @global integer the current blog id
     653 * @uses   bp_get_root_blog_id() to check current is root
     654 * @uses   add_meta_box() to register the BuddyPress WP Nav accordeon
     655 * @uses   add_action() to hook to admin footer scripts and load a piece of javascript
     656 */
     657function bp_admin_wp_nav_menu_meta_box() {
     658        global $blog_id;
     659
     660        if( $blog_id != bp_get_root_blog_id() )
     661                return;
     662
     663        add_meta_box( 'add-buddypress-nav-menu', __( 'BuddyPress', 'buddypress' ), 'bp_admin_do_wp_nav_menu_meta_box', 'nav-menus', 'side', 'default' );
     664
     665        add_action( 'admin_print_footer_scripts', 'bp_admin_wp_nav_menu_restrict_class_attr' );
     666}
     667
     668/**
     669 * Builds the accordeon and populates it with login/register/bp_nav items
     670 *
     671 * @global $nav_menu_selected_id
     672 * @uses   BP_Walker_Nav_Menu_Checklist to use our adapted walker
     673 * @uses   bp_get_nav_item_pages() to get the menu items
     674 * @return string html output
     675 */
     676function bp_admin_do_wp_nav_menu_meta_box() {
     677        global $nav_menu_selected_id;
     678
     679        $walker = new BP_Walker_Nav_Menu_Checklist( false );
     680        $args = array( 'walker' => $walker );
     681        $menu_pages = bp_get_nav_item_pages();
     682        ?>
     683        <div id="buddypress-menu">
     684                <div class="tabs-panel tabs-panel-active">
     685                        <ul id="buddypress-menu-checklist" class="categorychecklist form-no-clear">
     686                                <?php echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $menu_pages ), 0, (object) $args );?>
     687                        </ul>
     688                </div>
     689                <span class="add-to-menu">
     690                        <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-custom-menu-item" id="submit-buddypress-menu" />
     691                        <span class="spinner"></span>
     692                </span>
     693        </div><!-- /.tabs-panel -->
     694        <?php
     695}
     696
     697/**
     698 * Listen to the right boxes item-edit click to add an attribute to classes field
     699 *
     700 * It's a soft security to avoid an admin to delete the bp-slug-nav class that is useful for the final output
     701 *
     702 * @return string js
     703 */
     704function bp_admin_wp_nav_menu_restrict_class_attr() {
     705        ?>
     706        <script type="text/javascript">
     707        jQuery( '#menu-to-edit').on( 'click', 'a.item-edit', function() {
     708                jQuery('.edit-menu-item-classes').each( function() {
     709                        if( jQuery(this).val().indexOf( 'bp-menu') !=1 )
     710                                jQuery(this).attr( 'readonly', 'readonly' );
     711                });
     712        });
     713        </script>
     714        <?php
     715}
  • bp-core/bp-core-admin.php

     
    124124
    125125                /** BuddyPress Actions ************************************************/
    126126
     127                // Loads a metabox in the WP Nav Menu Admin UI
     128                add_action( 'load-nav-menus.php', 'bp_admin_wp_nav_menu_meta_box' );
     129
    127130                // Add settings
    128131                add_action( 'bp_register_admin_settings', array( $this, 'register_admin_settings' ) );
    129132
  • bp-core/bp-core-classes.php

     
    20102010                $output .= apply_filters( 'bp_walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    20112011        }
    20122012}
     2013
     2014
     2015/* BP Nav Menu */
     2016
     2017/**
     2018 * It's almost the same walker than Walker_Nav_Menu_Checklist
     2019 * We just need to adapt it as no post_type or taxonomy are used
     2020 * We also need to use the classes attribute to better identify nav slugs later
     2021 */
     2022class BP_Walker_Nav_Menu_Checklist extends Walker_Nav_Menu {
     2023        function __construct( $fields = false ) {
     2024                if ( $fields ) {
     2025                        $this->db_fields = $fields;
     2026                }
     2027        }
     2028
     2029        function start_lvl( &$output, $depth = 0, $args = array() ) {
     2030                $indent = str_repeat( "\t", $depth );
     2031                $output .= "\n$indent<ul class='children'>\n";
     2032        }
     2033
     2034        function end_lvl( &$output, $depth = 0, $args = array() ) {
     2035                $indent = str_repeat( "\t", $depth );
     2036                $output .= "\n$indent</ul>";
     2037        }
     2038
     2039        /**
     2040         * @see Walker::start_el()
     2041         * @since 3.0.0
     2042         *
     2043         * @param string $output Passed by reference. Used to append additional content.
     2044         * @param object $item Menu item data object.
     2045         * @param int $depth Depth of menu item. Used for padding.
     2046         * @param object $args
     2047         */
     2048        function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
     2049                global $_nav_menu_placeholder;
     2050
     2051                $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1;
     2052                $possible_object_id = isset( $item->post_type ) && 'nav_menu_item' == $item->post_type ? $item->object_id : $_nav_menu_placeholder;
     2053                $possible_db_id = ( ! empty( $item->ID ) ) && ( 0 < $possible_object_id ) ? (int) $item->ID : 0;
     2054
     2055                $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
     2056
     2057                $output .= $indent . '<li>';
     2058                $output .= '<label class="menu-item-title">';
     2059                $output .= '<input type="checkbox" class="menu-item-checkbox';
     2060
     2061                if ( property_exists( $item, 'label' ) )
     2062                        $title = $item->label;
     2063
     2064                $output .= '" name="menu-item[' . $possible_object_id . '][menu-item-object-id]" value="'. esc_attr( $item->object_id ) .'" /> ';
     2065                $output .= isset( $title ) ? esc_html( $title ) : esc_html( $item->title );
     2066                $output .= '</label>';
     2067
     2068                if( empty( $item->url ) )
     2069                        $item->url = $item->guid;
     2070
     2071                if( !in_array( array( 'bp-menu', 'bp-'. $item->post_excerpt .'-nav' ), $item->classes ) ) {
     2072                        $item->classes[] = 'bp-menu';
     2073                        $item->classes[] = 'bp-'. $item->post_excerpt .'-nav';
     2074                }
     2075
     2076                // Menu item hidden fields
     2077                $output .= '<input type="hidden" class="menu-item-db-id" name="menu-item[' . $possible_object_id . '][menu-item-db-id]" value="' . $possible_db_id . '" />';
     2078                $output .= '<input type="hidden" class="menu-item-object" name="menu-item[' . $possible_object_id . '][menu-item-object]" value="'. esc_attr( $item->object ) .'" />';
     2079                $output .= '<input type="hidden" class="menu-item-parent-id" name="menu-item[' . $possible_object_id . '][menu-item-parent-id]" value="'. esc_attr( $item->menu_item_parent ) .'" />';
     2080                $output .= '<input type="hidden" class="menu-item-type" name="menu-item[' . $possible_object_id . '][menu-item-type]" value="custom" />';
     2081                $output .= '<input type="hidden" class="menu-item-title" name="menu-item[' . $possible_object_id . '][menu-item-title]" value="'. esc_attr( $item->title ) .'" />';
     2082                $output .= '<input type="hidden" class="menu-item-url" name="menu-item[' . $possible_object_id . '][menu-item-url]" value="'. esc_attr( $item->url ) .'" />';
     2083                $output .= '<input type="hidden" class="menu-item-target" name="menu-item[' . $possible_object_id . '][menu-item-target]" value="'. esc_attr( $item->target ) .'" />';
     2084                $output .= '<input type="hidden" class="menu-item-attr_title" name="menu-item[' . $possible_object_id . '][menu-item-attr_title]" value="'. esc_attr( $item->attr_title ) .'" />';
     2085                $output .= '<input type="hidden" class="menu-item-classes" name="menu-item[' . $possible_object_id . '][menu-item-classes]" value="'. esc_attr( implode( ' ', $item->classes ) ) .'" />';
     2086                $output .= '<input type="hidden" class="menu-item-xfn" name="menu-item[' . $possible_object_id . '][menu-item-xfn]" value="'. esc_attr( $item->xfn ) .'" />';
     2087        }
     2088}