Ticket #5122: 5122.03.diff
File 5122.03.diff, 12.0 KB (added by , 11 years ago) |
---|
-
bp-core/bp-core-functions.php
1411 1411 <?php 1412 1412 } 1413 1413 add_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 */ 1430 function 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
386 386 add_filter( 'bp_modify_page_title', 'wptexturize' ); 387 387 add_filter( 'bp_modify_page_title', 'convert_chars' ); 388 388 add_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 */ 410 function 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 453 add_filter( 'wp_setup_nav_menu_item', 'bp_setup_nav_menu_item', 10, 1 ); -
bp-core/admin/bp-core-functions.php
642 642 643 643 return $action; 644 644 } 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 */ 657 function 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 */ 676 function 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 */ 704 function 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
124 124 125 125 /** BuddyPress Actions ************************************************/ 126 126 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 127 130 // Add settings 128 131 add_action( 'bp_register_admin_settings', array( $this, 'register_admin_settings' ) ); 129 132 -
bp-core/bp-core-classes.php
2010 2010 $output .= apply_filters( 'bp_walker_nav_menu_start_el', $item_output, $item, $depth, $args ); 2011 2011 } 2012 2012 } 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 */ 2022 class 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 }