_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 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 );
	}
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *