_wp_menu_item_classes_by_context() │ WP 3.0.0
Службова функція. Заповнює властивість classes
об’єкта пункту меню.
В якості classes
зберігається масив з css класами пункту меню, що присвоюються на основі контексту. У пункту меню, що відповідає за виведення посилання на рубрику буде свій набір css класів, запис – інший. Список класів css можна прочитати в описі функції wp_nav_menu() .
- Світова. WP_Query. $wp_query
- Світова. WP_Rewrite. $wp_rewrite
Ця функція вважається внутрішньою для використання самим ядром . Не рекомендується використовувати цю функцію у своєму коді.
Хуків немає.
Повертає
null
. Нічого. У функцію масив з об’єктами меню передається за посиланням.
Використання
_wp_menu_item_classes_by_context( $menu_items );
-
$menu_items
(масив) (обов’язковий) -
Масив з об’єктами пунктів меню, які мають заповнити властивість
classes
.
Приклади
0
#1 Демонстрація роботи функції
// $menu_items - масив з об'єктами меню з порожньою властивістю _wp_menu_item_classes_by_context( $menu_items ); // $menu_items - масив з об'єктами меню вже з набором css класів
Масив об’єктів меню ДО використання функції:
Array ( [0] => WP_Post Object ( [ID] => 305 [post_author] => 1 [post_date] => 2018-05-04 18:24:22 [post_date_gmt] => 2018-05-04 15:24:22 [post_content] => [post_title] => [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => 305 [to_ping] => [pinged] => [post_modified] => 2018-05-05 00:12:57 [post_modified_gmt] => 2018-05-04 21:12:57 [post_content_filtered] => [post_parent] => 0 [guid] => http://wp-test.ru/?p=305 [menu_order] => 1 [post_type] => nav_menu_item [post_mime_type] => [comment_count] => 0 [filter] => raw [db_id] => 305 [menu_item_parent] => 0 [object_id] => 214 [object] => page [type] => post_type [type_label] => Сторінка [url] => http://wp-test.ru/post-99 [title] => Сторінка 99 [target] => [attr_title] => [description] => [classes] => Array ( [0] => ) [xfn] => ) [1] => WP_Post Object (...) [2] => WP_Post Object (...) [n] => WP_Post Object (...) )
Масив об’єктів меню ПІСЛЯ використання функції:
Array ( [0] => WP_Post Object ( [ID] => 305 [post_author] => 1 [post_date] => 2018-05-04 18:24:22 [post_date_gmt] => 2018-05-04 15:24:22 [post_content] => [post_title] => [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => 305 [to_ping] => [pinged] => [post_modified] => 2018-05-05 00:12:57 [post_modified_gmt] => 2018-05-04 21:12:57 [post_content_filtered] => [post_parent] => 0 [guid] => http://wp-test.ru/?p=305 [menu_order] => 1 [post_type] => nav_menu_item [post_mime_type] => [comment_count] => 0 [filter] => raw [db_id] => 305 [menu_item_parent] => 0 [object_id] => 214 [object] => page [type] => post_type [type_label] => Сторінка [url] => http://wp-test.ru/post-99 [title] => Сторінка 99 [target] => [attr_title] => [description] => [classes] => Array ( [0] => [1] => menu-item [2] => menu-item-type-post_type [3] => menu-item-object-page ) [xfn] => ) [1] => WP_Post Object (...) [2] => WP_Post Object (...) [n] => WP_Post Object (...) )
нотатки
- Global. WP_Query. $wp_query WordPress Query object.
- Global. WP_Rewrite. $wp_rewrite WordPress rewrite component.
список змін
З версії 3.0.0 | Введено. |
Код _wp_menu_item_classes_by_context() wp menu item classes by context WP 6.0.2
function _wp_menu_item_classes_by_context( &$menu_items ) { Global $wp_query, $wp_rewrite; $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->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(); $front_page_id = (int) get_option( 'page_on_front' ); $privacy_policy_page_id = (int) get_option( 'wp_page_for_privacy_policy'); foreach ((array) $menu_items as $key => $menu_item ) { $menu_items[ $key ]->current = false; $classes = (array) $menu_item->classes; $classes[] = 'menu-item'; $classes[] = 'menu-item-type-' . $menu_item->type; $classes[] = 'menu-item-object-' . $menu_item->object; // Цей menu item is set as the 'Front Page'. if ( 'post_type' === $menu_item->type && $front_page_id === (int) $menu_item->object_id ) { $classes[] = 'menu-item-home'; } // Це меню is set as the 'Privacy Policy Page'. if ( 'post_type' === $menu_item->type && $privacy_policy_page_id === (int) $menu_item->object_id ) { $classes[] = 'menu-item-privacy-policy'; } // If the menu item corresponds to a taxonomy term for the currently queried non-hierarchical post object. if ( $wp_query->is_singular && 'taxonomy' === $menu_item->type && in_array( (int) $menu_item->object_id, $possible_object_parents, true ) ) { $active_parent_object_ids[] = (int) $menu_item->object_id; $active_parent_item_ids[] = (int) $menu_item->db_id; $active_object = $queried_object->post_type; // If the menu item correspons to the currently queried post or taxonomy object. } elseif ( $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 ) && $queried_object->taxonomy == $menu_item->object ) ) ) { $classes[] = 'current-menu-item'; $menu_items[ $key ]->current = true; $_anc_id = (int) $menu_item->db_id; while ( ( $_anc_id = (int) get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) &&! in_array( $_anc_id, $active_ancestor_item_ids, true ) ) { $active_ancestor_item_ids[] = $_anc_id; } if ( 'post_type' === $menu_item->type && 'page' === $menu_item->object ) { // Back compat classes for pages to match wp_page_menu(). $classes[] = 'page_item'; $classes[] = 'page-item-' . $menu_item->object_id; $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; // If the menu item correspons to the currently queried post type archive. } elseif ( 'post_type_archive' === $menu_item->type && is_post_type_archive( array( $menu_item->object ) ) ) { $classes[] = 'current-menu-item'; $menu_items[ $key ]->current = true; $_anc_id = (int) $menu_item->db_id; while ( ( $_anc_id = (int) get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) &&! in_array( $_anc_id, $active_ancestor_item_ids, true ) ) { $active_ancestor_item_ids[] = $_anc_id; } $active_parent_item_ids[] = (int) $menu_item->menu_item_parent; // If the menu item corresponds to the currently requested URL. } elseif ( 'custom' === $menu_item->object && isset( $_SERVER['HTTP_HOST'] ) ) { $_root_relative_current = untrailingslashit( $_SERVER['REQUEST_URI'] ); // Якщо це customization page it will strip the query var off the URL before entering the comparison block. if ( is_customize_preview() ) { $_root_relative_current = strtok( untrailingslashit( $_SERVER['REQUEST_URI'] ), '?' ); } $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_root_relative_current ); $raw_item_url = strpos( $menu_item->url, '#' ) ? substr( $menu_item->url, 0, strpos( $menu_item->url, '#' ) ) : $menu_item->url; $item_url = set_url_scheme(untrailingslashit($raw_item_url)); $_indexless_current = untrailingslashit( preg_replace( '/' . preg_quote( $wp_rewrite->index, '/' ) . '$/', '', $current_url ) ); $matches = array( $current_url, urldecode( $current_url ), $_indexless_current, urldecode( $_indexless_current ), $_root_relative_current, urldecode( $_root_relative_current ), ); if ( $raw_item_url && in_array( $item_url, $matches, true ) ) { $classes[] = 'current-menu-item'; $menu_items[ $key ]->current = true; $_anc_id = (int) $menu_item->db_id; while ( ( $_anc_id = (int) get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) &&! in_array( $_anc_id, $active_ancestor_item_ids, true ) ) { $active_ancestor_item_ids[] = $_anc_id; } if ( in_array( home_url(), array( untrailingslashit( $current_url ), untrailingslashit( $_indexless_current ) ), true ) ) { // 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 the 'current-menu-item' class when extra query arguments are involved. } elseif ( $item_url == $front_page_url && is_front_page() ) { $classes[] = 'current-menu-item'; } if ( untrailingslashit( $item_url ) == home_url() ) { $classes[] = 'menu-item-home'; } } // Back-compat with wp_page_menu(): add "current_page_parent" до статевого домашню page link for any no-page query. if ( ! empty( $home_page_id ) && 'post_type' === $menu_item->type && empty( $wp_query->is_page ) && $home_page_id == $menu_item->object_id ) { $classes[] = 'current_page_parent'; } $menu_items[ $key ]->classes = array_unique( $classes ); } $active_ancestor_item_ids = array_filter( array_unique( $active_ancestor_item_ids ) ); $active_parent_item_ids = array_filter( array_unique( $active_parent_item_ids ) ); $active_parent_object_ids = array_filter( array_unique( $active_parent_object_ids ) ); // Set parent's class. foreach ((array) $menu_items as $key => $parent_item ) { $classes = (array) $parent_item->classes; $menu_items[ $key ]->current_item_ancestor = false; $menu_items[ $key ]->current_item_parent = false; if ( isset( $parent_item->type ) && ( // Ancestral post object. ( 'post_type' === $parent_item->type &&! empty( $queried_object->post_type ) && is_post_type_hierarchical( $queried_object->post_type ) && in_array( (int) $parent_item->object_id, $queried_object->ancestors, true ) && $parent_item->object != $queried_object->ID ) || // Ancestral term. ( 'taxonomy' === $parent_item->type && isset( $possible_taxonomy_ancestors[ $parent_item->object ] ) && in_array( (int) $parent_item->object_id, $possible_taxonomy_ancestors[ $parent_item->object ], true ) && ( ! isset( $queried_object->term_id ) || $parent_item->object_id != $queried_object->term_id ) ) ) ) { if ( ! empty( $queried_object->taxonomy ) ) { $classes[] = 'current-'. $queried_object->taxonomy . '-ancestor'; } else { $classes[] = 'current-'. $queried_object->post_type . '-ancestor'; } } if ( in_array( (int) $parent_item->db_id, $active_ancestor_item_ids, true ) ) { $classes[] = 'current-menu-ancestor'; $menu_items[ $key ]->current_item_ancestor = true; } if ( in_array( (int) $parent_item->db_id, $active_parent_item_ids, true ) ) { $classes[] = 'current-menu-parent'; $menu_items[$key]->current_item_parent = true; } if ( in_array( (int) $parent_item->object_id, $active_parent_object_ids, true ) ) { $classes[] = 'current-'. $active_object . '-parent'; } if ( 'post_type' === $parent_item->type && 'page' === $parent_item->object ) { // Back compat classes for pages to match wp_page_menu(). if ( in_array( 'current-menu-parent', $classes, true ) ) { $classes[] = 'current_page_parent'; } if ( in_array( 'current-menu-ancestor', $classes, true ) ) { $classes[] = 'current_page_ancestor'; } } $menu_items[ $key ]->classes = array_unique( $classes ); } }