Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * set the ID attribute of nav menu items
- */
- add_filter( 'nav_menu_item_id', 'pagenamed_id', 10, 2 );
- function pagenamed_id( $id, $item ) {
- if ( $content_page_id = get_post_meta ( $item->ID, '_menu_item_object_id', true ) ) {
- if ( $content_page = get_post ( $content_page_id ) )
- $id = $content_page->post_name;
- }
- return $id;
- }
- /**
- * set classes on nav menu item
- *
- * @note contains a large portion of the function _wp_menu_item_classes_by_context()
- */
- add_filter( 'nav_menu_css_class', 'filter_nav_menu_classes', 10, 2 );
- function filter_nav_menu_classes( $classes, $menu_item ) {
- $classes = array();
- global $wp_query;
- $queried_object = $wp_query->get_queried_object();
- $queried_object_id = (int) $wp_query->queried_object_id;
- $active_object = '';
- $active_ancestor_item_ids = array();
- $active_parent_item_ids = array();
- $active_parent_object_ids = array();
- $possible_taxonomy_ancestors = array();
- $possible_object_parents = array();
- $home_page_id = (int) get_option( 'page_for_posts' );
- if ( $wp_query->is_singular && ! empty( $queried_object->post_type ) && ! is_post_type_hierarchical( $queried_object->post_type ) ) {
- foreach ( (array) get_object_taxonomies( $queried_object->post_type ) as $taxonomy ) {
- if ( is_taxonomy_hierarchical( $taxonomy ) ) {
- $term_hierarchy = _get_term_hierarchy( $taxonomy );
- $terms = wp_get_object_terms( $queried_object_id, $taxonomy, array( 'fields' => 'ids' ) );
- if ( is_array( $terms ) ) {
- $possible_object_parents = array_merge( $possible_object_parents, $terms );
- $term_to_ancestor = array();
- foreach ( (array) $term_hierarchy as $anc => $descs ) {
- foreach ( (array) $descs as $desc )
- $term_to_ancestor[ $desc ] = $anc;
- }
- foreach ( $terms as $desc ) {
- do {
- $possible_taxonomy_ancestors[ $taxonomy ][] = $desc;
- if ( isset( $term_to_ancestor[ $desc ] ) ) {
- $_desc = $term_to_ancestor[ $desc ];
- unset( $term_to_ancestor[ $desc ] );
- $desc = $_desc;
- } else {
- $desc = 0;
- }
- } while ( ! empty( $desc ) );
- }
- }
- }
- }
- } elseif ( ! empty( $queried_object->post_type ) && is_post_type_hierarchical( $queried_object->post_type ) ) {
- _get_post_ancestors( $queried_object );
- } elseif ( ! empty( $queried_object->taxonomy ) && is_taxonomy_hierarchical( $queried_object->taxonomy ) ) {
- $term_hierarchy = _get_term_hierarchy( $queried_object->taxonomy );
- $term_to_ancestor = array();
- foreach ( (array) $term_hierarchy as $anc => $descs ) {
- foreach ( (array) $descs as $desc )
- $term_to_ancestor[ $desc ] = $anc;
- }
- $desc = $queried_object->term_id;
- do {
- $possible_taxonomy_ancestors[ $queried_object->taxonomy ][] = $desc;
- if ( isset( $term_to_ancestor[ $desc ] ) ) {
- $_desc = $term_to_ancestor[ $desc ];
- unset( $term_to_ancestor[ $desc ] );
- $desc = $_desc;
- } else {
- $desc = 0;
- }
- } while ( ! empty( $desc ) );
- }
- $possible_object_parents = array_filter( $possible_object_parents );
- $front_page_url = home_url();
- // if the menu item corresponds to the currently-queried post or taxonomy object
- if (
- $menu_item->object_id == $queried_object_id &&
- (
- ( ! empty( $home_page_id ) && 'post_type' == $menu_item->type && $wp_query->is_home && $home_page_id == $menu_item->object_id ) ||
- ( 'post_type' == $menu_item->type && $wp_query->is_singular ) ||
- ( 'taxonomy' == $menu_item->type && ( $wp_query->is_category || $wp_query->is_tag || $wp_query->is_tax ) )
- )
- ) {
- $classes[] = 'current-menu-item';
- // $menu_items[$key]->current = true;
- $_anc_id = (int) $menu_item->db_id;
- while(
- ( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) &&
- ! in_array( $_anc_id, $active_ancestor_item_ids )
- ) {
- $active_ancestor_item_ids[] = $_anc_id;
- }
- $active_parent_item_ids[] = (int) $menu_item->menu_item_parent;
- $active_parent_object_ids[] = (int) $menu_item->post_parent;
- $active_object = $menu_item->object;
- // if the menu item corresponds to the currently-requested URL
- } elseif ( 'custom' == $menu_item->object ) {
- $current_url = untrailingslashit( ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
- $item_url = untrailingslashit( strpos( $menu_item->url, '#' ) ? substr( $menu_item->url, 0, strpos( $menu_item->url, '#' ) ) : $menu_item->url );
- $_indexless_current = untrailingslashit( preg_replace( '/index.php$/', '', $current_url ) );
- if ( in_array( $item_url, array( $current_url, $_indexless_current ) ) ) {
- $classes[] = 'current-menu-item';
- // $menu_items[$key]->current = true;
- $_anc_id = (int) $menu_item->db_id;
- while(
- ( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) &&
- ! in_array( $_anc_id, $active_ancestor_item_ids )
- ) {
- $active_ancestor_item_ids[] = $_anc_id;
- }
- if ( in_array( home_url(), array( untrailingslashit( $current_url ), untrailingslashit( $_indexless_current ) ) ) ) {
- // Back compat for home link to match wp_page_menu()
- $classes[] = 'current_page_item';
- }
- $active_parent_item_ids[] = (int) $menu_item->menu_item_parent;
- $active_parent_object_ids[] = (int) $menu_item->post_parent;
- $active_object = $menu_item->object;
- // give front page item current-menu-item class when extra query arguments involved
- } elseif ( $item_url == $front_page_url && is_front_page() ) {
- $classes[] = 'current-menu-item';
- }
- if ( untrailingslashit($item_url) == home_url() )
- $classes[] = 'menu-item-home';
- }
- // return the new array with classes
- return $classes;
- }
Advertisement
Add Comment
Please, Sign In to add comment