WP_Customize_Nav_Menus::load_available_items_query( string $object_type = ‘post_type’, string $object_name = ‘page’, int $page ): array|WP_Error

In this article

Performs the post_type and taxonomy queries for loading available menu items.

Parameters

$object_typestringoptional
Accepts any custom object type and has built-in support for 'post_type' and 'taxonomy'. Default is 'post_type'.

Default:'post_type'

$object_namestringoptional
Accepts any registered taxonomy or post type name. Default is 'page'.

Default:'page'

$pageintoptional
The page number used to generate the query offset. Default is '0'.

Return

array|WP_Error An array of menu items on success, a WP_Error object on failure.

Source

public function load_available_items_query( $object_type = 'post_type', $object_name = 'page', $page = 0 ) {
	$items = array();

	if ( 'post_type' === $object_type ) {
		$post_type = get_post_type_object( $object_name );
		if ( ! $post_type ) {
			return new WP_Error( 'nav_menus_invalid_post_type' );
		}

		/*
		 * If we're dealing with pages, let's prioritize the Front Page,
		 * Posts Page and Privacy Policy Page at the top of the list.
		 */
		$important_pages   = array();
		$suppress_page_ids = array();
		if ( 0 === $page && 'page' === $object_name ) {
			// Insert Front Page or custom "Home" link.
			$front_page = 'page' === get_option( 'show_on_front' ) ? (int) get_option( 'page_on_front' ) : 0;
			if ( ! empty( $front_page ) ) {
				$front_page_obj      = get_post( $front_page );
				$important_pages[]   = $front_page_obj;
				$suppress_page_ids[] = $front_page_obj->ID;
			} else {
				// Add "Home" link. Treat as a page, but switch to custom on add.
				$items[] = array(
					'id'         => 'home',
					'title'      => _x( 'Home', 'nav menu home label' ),
					'type'       => 'custom',
					'type_label' => __( 'Custom Link' ),
					'object'     => '',
					'url'        => home_url(),
				);
			}

			// Insert Posts Page.
			$posts_page = 'page' === get_option( 'show_on_front' ) ? (int) get_option( 'page_for_posts' ) : 0;
			if ( ! empty( $posts_page ) ) {
				$posts_page_obj      = get_post( $posts_page );
				$important_pages[]   = $posts_page_obj;
				$suppress_page_ids[] = $posts_page_obj->ID;
			}

			// Insert Privacy Policy Page.
			$privacy_policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' );
			if ( ! empty( $privacy_policy_page_id ) ) {
				$privacy_policy_page = get_post( $privacy_policy_page_id );
				if ( $privacy_policy_page instanceof WP_Post && 'publish' === $privacy_policy_page->post_status ) {
					$important_pages[]   = $privacy_policy_page;
					$suppress_page_ids[] = $privacy_policy_page->ID;
				}
			}
		} elseif ( 'post' !== $object_name && 0 === $page && $post_type->has_archive ) {
			// Add a post type archive link.
			$items[] = array(
				'id'         => $object_name . '-archive',
				'title'      => $post_type->labels->archives,
				'type'       => 'post_type_archive',
				'type_label' => __( 'Post Type Archive' ),
				'object'     => $object_name,
				'url'        => get_post_type_archive_link( $object_name ),
			);
		}

		// Prepend posts with nav_menus_created_posts on first page.
		$posts = array();
		if ( 0 === $page && $this->manager->get_setting( 'nav_menus_created_posts' ) ) {
			foreach ( $this->manager->get_setting( 'nav_menus_created_posts' )->value() as $post_id ) {
				$auto_draft_post = get_post( $post_id );
				if ( $post_type->name === $auto_draft_post->post_type ) {
					$posts[] = $auto_draft_post;
				}
			}
		}

		$args = array(
			'numberposts' => 10,
			'offset'      => 10 * $page,
			'orderby'     => 'date',
			'order'       => 'DESC',
			'post_type'   => $object_name,
		);

		// Add suppression array to arguments for get_posts.
		if ( ! empty( $suppress_page_ids ) ) {
			$args['post__not_in'] = $suppress_page_ids;
		}

		$posts = array_merge(
			$posts,
			$important_pages,
			get_posts( $args )
		);

		foreach ( $posts as $post ) {
			$post_title = $post->post_title;
			if ( '' === $post_title ) {
				/* translators: %d: ID of a post. */
				$post_title = sprintf( __( '#%d (no title)' ), $post->ID );
			}

			$post_type_label = get_post_type_object( $post->post_type )->labels->singular_name;
			$post_states     = get_post_states( $post );
			if ( ! empty( $post_states ) ) {
				$post_type_label = implode( ',', $post_states );
			}

			$items[] = array(
				'id'         => "post-{$post->ID}",
				'title'      => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ),
				'type'       => 'post_type',
				'type_label' => $post_type_label,
				'object'     => $post->post_type,
				'object_id'  => (int) $post->ID,
				'url'        => get_permalink( (int) $post->ID ),
			);
		}
	} elseif ( 'taxonomy' === $object_type ) {
		$terms = get_terms(
			array(
				'taxonomy'     => $object_name,
				'child_of'     => 0,
				'exclude'      => '',
				'hide_empty'   => false,
				'hierarchical' => 1,
				'include'      => '',
				'number'       => 10,
				'offset'       => 10 * $page,
				'order'        => 'DESC',
				'orderby'      => 'count',
				'pad_counts'   => false,
			)
		);

		if ( is_wp_error( $terms ) ) {
			return $terms;
		}

		foreach ( $terms as $term ) {
			$items[] = array(
				'id'         => "term-{$term->term_id}",
				'title'      => html_entity_decode( $term->name, ENT_QUOTES, get_bloginfo( 'charset' ) ),
				'type'       => 'taxonomy',
				'type_label' => get_taxonomy( $term->taxonomy )->labels->singular_name,
				'object'     => $term->taxonomy,
				'object_id'  => (int) $term->term_id,
				'url'        => get_term_link( (int) $term->term_id, $term->taxonomy ),
			);
		}
	}

	/**
	 * Filters the available menu items.
	 *
	 * @since 4.3.0
	 *
	 * @param array  $items       The array of menu items.
	 * @param string $object_type The object type.
	 * @param string $object_name The object name.
	 * @param int    $page        The current page number.
	 */
	$items = apply_filters( 'customize_nav_menu_available_items', $items, $object_type, $object_name, $page );

	return $items;
}

Hooks

apply_filters( ‘customize_nav_menu_available_items’, array $items, string $object_type, string $object_name, int $page )

Filters the available menu items.

Changelog

VersionDescription
4.3.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.