wp_nav_menu_item_post_type_meta_box

The timeline below displays how wordpress function wp_nav_menu_item_post_type_meta_box has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.3

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $data_object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type callable     $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box($data_object, $box)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $box['args']->name;
    $post_type = get_post_type_object($post_type_name);
    $tab_name = $post_type_name . '-tab';
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$tab_name]) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($box['args']->_default_query)) {
        $args = array_merge($args, (array) $box['args']->_default_query);
    }
    /*
     * 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();
    if ('page' === $post_type_name) {
        $suppress_page_ids = array();
        // Insert Front Page or custom Home link.
        $front_page = ('page' === get_option('show_on_front')) ? (int) get_option('page_on_front') : 0;
        $front_page_obj = null;
        if (!empty($front_page)) {
            $front_page_obj = get_post($front_page);
        }
        if ($front_page_obj) {
            $front_page_obj->front_or_home = true;
            $important_pages[] = $front_page_obj;
            $suppress_page_ids[] = $front_page_obj->ID;
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? (int) $_nav_menu_placeholder - 1 : -1;
            $front_page_obj = (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/'));
            $important_pages[] = $front_page_obj;
        }
        // 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);
            if ($posts_page_obj) {
                $front_page_obj->posts_page = true;
                $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) {
                $privacy_policy_page->privacy_policy_page = true;
                $important_pages[] = $privacy_policy_page;
                $suppress_page_ids[] = $privacy_policy_page->ID;
            }
        }
        // Add suppression array to arguments for WP_Query.
        if (!empty($suppress_page_ids)) {
            $args['post__not_in'] = $suppress_page_ids;
        }
    }
    // @todo Transient caching of these results with proper invalidation on updating of a post of this type.
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    // Only suppress and insert when more than just suppression pages available.
    if (!$get_posts->post_count) {
        if (!empty($suppress_page_ids)) {
            unset($args['post__not_in']);
            $get_posts = new WP_Query();
            $posts = $get_posts->query($args);
        } else {
            echo '<p>' . __('No items.') . '</p>';
            return;
        }
    } elseif (!empty($important_pages)) {
        $posts = array_merge($important_pages, $posts);
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array(
        'base' => add_query_arg(array($tab_name => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)),
        'format' => '',
        'prev_text' => '<span aria-label="' . esc_attr__('Previous page') . '">' . __('&laquo;') . '</span>',
        'next_text' => '<span aria-label="' . esc_attr__('Next page') . '">' . __('&raquo;') . '</span>',
        /* translators: Hidden accessibility text. */
        'before_page_number' => '<span class="screen-reader-text">' . __('Page') . '</span> ',
        'total' => $num_pages,
        'current' => $pagenum,
    ));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$tab_name]) && in_array($_REQUEST[$tab_name], array('all', 'search'), true)) {
        $current_tab = $_REQUEST[$tab_name];
    }
    if (!empty($_REQUEST["quick-search-posttype-{$post_type_name}"])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    $most_recent_url = '';
    $view_all_url = '';
    $search_url = '';
    if ($nav_menu_selected_id) {
        $most_recent_url = add_query_arg($tab_name, 'most-recent', remove_query_arg($removed_args));
        $view_all_url = add_query_arg($tab_name, 'all', remove_query_arg($removed_args));
        $search_url = add_query_arg($tab_name, 'search', remove_query_arg($removed_args));
    }
    ?>
	<div id="<?php 
    echo esc_attr("posttype-{$post_type_name}");
    ?>" class="posttypediv">
		<ul id="<?php 
    echo esc_attr("posttype-{$post_type_name}-tabs");
    ?>" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link"
					data-type="<?php 
    echo esc_attr("tabs-panel-posttype-{$post_type_name}-most-recent");
    ?>"
					href="<?php 
    echo esc_url($most_recent_url . "#tabs-panel-posttype-{$post_type_name}-most-recent");
    ?>"
				>
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link"
					data-type="<?php 
    echo esc_attr("{$post_type_name}-all");
    ?>"
					href="<?php 
    echo esc_url($view_all_url . "#{$post_type_name}-all");
    ?>"
				>
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link"
					data-type="<?php 
    echo esc_attr("tabs-panel-posttype-{$post_type_name}-search");
    ?>"
					href="<?php 
    echo esc_url($search_url . "#tabs-panel-posttype-{$post_type_name}-search");
    ?>"
				>
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="<?php 
    echo esc_attr("tabs-panel-posttype-{$post_type_name}-most-recent");
    ?>"
			class="tabs-panel <?php 
    echo ('most-recent' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>"
			role="region" aria-label="<?php 
    esc_attr_e('Most Recent');
    ?>" tabindex="0"
		>
			<ul id="<?php 
    echo esc_attr("{$post_type_name}checklist-most-recent");
    ?>"
				class="categorychecklist form-no-clear"
			>
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filters the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * Possible hook names include:
     *
     *  - `nav_menu_items_post_recent`
     *  - `nav_menu_items_page_recent`
     *
     * @since 4.3.0
     * @since 4.9.0 Added the `$recent_args` parameter.
     *
     * @param WP_Post[] $most_recent An array of post objects being listed.
     * @param array     $args        An array of `WP_Query` arguments for the meta box.
     * @param array     $box         Arguments passed to `wp_nav_menu_item_post_type_meta_box()`.
     * @param array     $recent_args An array of `WP_Query` arguments for 'Most Recent' tab.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box, $recent_args);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo esc_attr("tabs-panel-posttype-{$post_type_name}-search");
    ?>"
			class="tabs-panel <?php 
    echo ('search' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>"
			role="region" aria-label="<?php 
    echo esc_attr($post_type->labels->search_items);
    ?>" tabindex="0"
		>
			<?php 
    if (isset($_REQUEST["quick-search-posttype-{$post_type_name}"])) {
        $searched = esc_attr($_REQUEST["quick-search-posttype-{$post_type_name}"]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="<?php 
    echo esc_attr("quick-search-posttype-{$post_type_name}");
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('Search');
    ?>
				</label>
				<input type="search"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?>
					class="quick-search" value="<?php 
    echo $searched;
    ?>"
					name="<?php 
    echo esc_attr("quick-search-posttype-{$post_type_name}");
    ?>"
					id="<?php 
    echo esc_attr("quick-search-posttype-{$post_type_name}");
    ?>"
				/>
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'small quick-search-submit hide-if-js', 'submit', false, array('id' => "submit-quick-search-posttype-{$post_type_name}"));
    ?>
			</p>

			<ul id="<?php 
    echo esc_attr("{$post_type_name}-search-checklist");
    ?>"
				data-wp-lists="<?php 
    echo esc_attr("list:{$post_type_name}");
    ?>"
				class="categorychecklist form-no-clear"
			>
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo esc_attr("{$post_type_name}-all");
    ?>"
			class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>"
			role="region" aria-label="<?php 
    echo esc_attr($post_type->labels->all_items);
    ?>" tabindex="0"
		>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>

			<ul id="<?php 
    echo esc_attr("{$post_type_name}checklist");
    ?>"
				data-wp-lists="<?php 
    echo esc_attr("list:{$post_type_name}");
    ?>"
				class="categorychecklist form-no-clear"
			>
				<?php 
    $args['walker'] = $walker;
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? (int) $_nav_menu_placeholder - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filters the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * Possible hook names include:
     *
     *  - `nav_menu_items_post`
     *  - `nav_menu_items_page`
     *
     * @since 3.2.0
     * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
     *
     * @see WP_Query::query()
     *
     * @param object[]     $posts     The posts for the current post type. Mostly `WP_Post` objects, but
     *                                can also contain "fake" post objects to represent other menu items.
     * @param array        $args      An array of `WP_Query` arguments.
     * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    echo $checkbox_items;
    ?>
			</ul>

			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix" data-items-type="<?php 
    echo esc_attr("posttype-{$post_type_name}");
    ?>">
			<span class="list-controls hide-if-no-js">
				<input type="checkbox"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?>
					id="<?php 
    echo esc_attr($tab_name);
    ?>" class="select-all"
				/>
				<label for="<?php 
    echo esc_attr($tab_name);
    ?>"><?php 
    _e('Select All');
    ?></label>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?>
					class="button submit-add-to-menu right" value="<?php 
    esc_attr_e('Add to Menu');
    ?>"
					name="add-post-type-menu-item" id="<?php 
    echo esc_attr("submit-posttype-{$post_type_name}");
    ?>"
				/>
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 6.2

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $data_object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type callable     $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box($data_object, $box)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $box['args']->name;
    $post_type = get_post_type_object($post_type_name);
    $tab_name = $post_type_name . '-tab';
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$tab_name]) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($box['args']->_default_query)) {
        $args = array_merge($args, (array) $box['args']->_default_query);
    }
    /*
     * 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();
    if ('page' === $post_type_name) {
        $suppress_page_ids = array();
        // Insert Front Page or custom Home link.
        $front_page = ('page' === get_option('show_on_front')) ? (int) get_option('page_on_front') : 0;
        $front_page_obj = null;
        if (!empty($front_page)) {
            $front_page_obj = get_post($front_page);
            $front_page_obj->front_or_home = true;
            $important_pages[] = $front_page_obj;
            $suppress_page_ids[] = $front_page_obj->ID;
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? (int) $_nav_menu_placeholder - 1 : -1;
            $front_page_obj = (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/'));
            $important_pages[] = $front_page_obj;
        }
        // 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);
            $posts_page_obj->posts_page = true;
            $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) {
                $privacy_policy_page->privacy_policy_page = true;
                $important_pages[] = $privacy_policy_page;
                $suppress_page_ids[] = $privacy_policy_page->ID;
            }
        }
        // Add suppression array to arguments for WP_Query.
        if (!empty($suppress_page_ids)) {
            $args['post__not_in'] = $suppress_page_ids;
        }
    }
    // @todo Transient caching of these results with proper invalidation on updating of a post of this type.
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    // Only suppress and insert when more than just suppression pages available.
    if (!$get_posts->post_count) {
        if (!empty($suppress_page_ids)) {
            unset($args['post__not_in']);
            $get_posts = new WP_Query();
            $posts = $get_posts->query($args);
        } else {
            echo '<p>' . __('No items.') . '</p>';
            return;
        }
    } elseif (!empty($important_pages)) {
        $posts = array_merge($important_pages, $posts);
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array(
        'base' => add_query_arg(array($tab_name => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)),
        'format' => '',
        'prev_text' => '<span aria-label="' . esc_attr__('Previous page') . '">' . __('&laquo;') . '</span>',
        'next_text' => '<span aria-label="' . esc_attr__('Next page') . '">' . __('&raquo;') . '</span>',
        /* translators: Hidden accessibility text. */
        'before_page_number' => '<span class="screen-reader-text">' . __('Page') . '</span> ',
        'total' => $num_pages,
        'current' => $pagenum,
    ));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$tab_name]) && in_array($_REQUEST[$tab_name], array('all', 'search'), true)) {
        $current_tab = $_REQUEST[$tab_name];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    $most_recent_url = '';
    $view_all_url = '';
    $search_url = '';
    if ($nav_menu_selected_id) {
        $most_recent_url = esc_url(add_query_arg($tab_name, 'most-recent', remove_query_arg($removed_args)));
        $view_all_url = esc_url(add_query_arg($tab_name, 'all', remove_query_arg($removed_args)));
        $search_url = esc_url(add_query_arg($tab_name, 'search', remove_query_arg($removed_args)));
    }
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    echo $most_recent_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    echo $view_all_url;
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    echo $search_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" role="region" aria-label="<?php 
    esc_attr_e('Most Recent');
    ?>" tabindex="0">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filters the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * Possible hook names include:
     *
     *  - `nav_menu_items_post_recent`
     *  - `nav_menu_items_page_recent`
     *
     * @since 4.3.0
     * @since 4.9.0 Added the `$recent_args` parameter.
     *
     * @param WP_Post[] $most_recent An array of post objects being listed.
     * @param array     $args        An array of `WP_Query` arguments for the meta box.
     * @param array     $box         Arguments passed to `wp_nav_menu_item_post_type_meta_box()`.
     * @param array     $recent_args An array of `WP_Query` arguments for 'Most Recent' tab.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box, $recent_args);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search" role="region" aria-label="<?php 
    echo $post_type->labels->search_items;
    ?>" tabindex="0">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('Search');
    ?>
				</label>
				<input type="search"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="quick-search" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" id="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'small quick-search-submit hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" role="region" aria-label="<?php 
    echo $post_type->labels->all_items;
    ?>" tabindex="0">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? (int) $_nav_menu_placeholder - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filters the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * Possible hook names include:
     *
     *  - `nav_menu_items_post`
     *  - `nav_menu_items_page`
     *
     * @since 3.2.0
     * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
     *
     * @see WP_Query::query()
     *
     * @param object[]     $posts     The posts for the current post type. Mostly `WP_Post` objects, but
     *                                can also contain "fake" post objects to represent other menu items.
     * @param array        $args      An array of `WP_Query` arguments.
     * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix" data-items-type="posttype-<?php 
    echo esc_attr($post_type_name);
    ?>">
			<span class="list-controls hide-if-no-js">
				<input type="checkbox"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> id="<?php 
    echo esc_attr($tab_name);
    ?>" class="select-all" />
				<label for="<?php 
    echo esc_attr($tab_name);
    ?>"><?php 
    _e('Select All');
    ?></label>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="button submit-add-to-menu right" value="<?php 
    esc_attr_e('Add to Menu');
    ?>" name="add-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 6.1

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $data_object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type callable     $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box($data_object, $box)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $box['args']->name;
    $post_type = get_post_type_object($post_type_name);
    $tab_name = $post_type_name . '-tab';
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$tab_name]) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($box['args']->_default_query)) {
        $args = array_merge($args, (array) $box['args']->_default_query);
    }
    /*
     * 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();
    if ('page' === $post_type_name) {
        $suppress_page_ids = array();
        // Insert Front Page or custom Home link.
        $front_page = ('page' === get_option('show_on_front')) ? (int) get_option('page_on_front') : 0;
        $front_page_obj = null;
        if (!empty($front_page)) {
            $front_page_obj = get_post($front_page);
            $front_page_obj->front_or_home = true;
            $important_pages[] = $front_page_obj;
            $suppress_page_ids[] = $front_page_obj->ID;
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? (int) $_nav_menu_placeholder - 1 : -1;
            $front_page_obj = (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/'));
            $important_pages[] = $front_page_obj;
        }
        // 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);
            $posts_page_obj->posts_page = true;
            $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) {
                $privacy_policy_page->privacy_policy_page = true;
                $important_pages[] = $privacy_policy_page;
                $suppress_page_ids[] = $privacy_policy_page->ID;
            }
        }
        // Add suppression array to arguments for WP_Query.
        if (!empty($suppress_page_ids)) {
            $args['post__not_in'] = $suppress_page_ids;
        }
    }
    // @todo Transient caching of these results with proper invalidation on updating of a post of this type.
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    // Only suppress and insert when more than just suppression pages available.
    if (!$get_posts->post_count) {
        if (!empty($suppress_page_ids)) {
            unset($args['post__not_in']);
            $get_posts = new WP_Query();
            $posts = $get_posts->query($args);
        } else {
            echo '<p>' . __('No items.') . '</p>';
            return;
        }
    } elseif (!empty($important_pages)) {
        $posts = array_merge($important_pages, $posts);
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($tab_name => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => '<span aria-label="' . esc_attr__('Previous page') . '">' . __('&laquo;') . '</span>', 'next_text' => '<span aria-label="' . esc_attr__('Next page') . '">' . __('&raquo;') . '</span>', 'before_page_number' => '<span class="screen-reader-text">' . __('Page') . '</span> ', 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$tab_name]) && in_array($_REQUEST[$tab_name], array('all', 'search'), true)) {
        $current_tab = $_REQUEST[$tab_name];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    $most_recent_url = '';
    $view_all_url = '';
    $search_url = '';
    if ($nav_menu_selected_id) {
        $most_recent_url = esc_url(add_query_arg($tab_name, 'most-recent', remove_query_arg($removed_args)));
        $view_all_url = esc_url(add_query_arg($tab_name, 'all', remove_query_arg($removed_args)));
        $search_url = esc_url(add_query_arg($tab_name, 'search', remove_query_arg($removed_args)));
    }
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    echo $most_recent_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    echo $view_all_url;
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    echo $search_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" role="region" aria-label="<?php 
    _e('Most Recent');
    ?>" tabindex="0">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filters the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * Possible hook names include:
     *
     *  - `nav_menu_items_post_recent`
     *  - `nav_menu_items_page_recent`
     *
     * @since 4.3.0
     * @since 4.9.0 Added the `$recent_args` parameter.
     *
     * @param WP_Post[] $most_recent An array of post objects being listed.
     * @param array     $args        An array of `WP_Query` arguments for the meta box.
     * @param array     $box         Arguments passed to `wp_nav_menu_item_post_type_meta_box()`.
     * @param array     $recent_args An array of `WP_Query` arguments for 'Most Recent' tab.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box, $recent_args);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search" role="region" aria-label="<?php 
    echo $post_type->labels->search_items;
    ?>" tabindex="0">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" class="screen-reader-text"><?php 
    _e('Search');
    ?></label>
				<input type="search"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="quick-search" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" id="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'small quick-search-submit hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" role="region" aria-label="<?php 
    echo $post_type->labels->all_items;
    ?>" tabindex="0">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? (int) $_nav_menu_placeholder - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filters the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * Possible hook names include:
     *
     *  - `nav_menu_items_post`
     *  - `nav_menu_items_page`
     *
     * @since 3.2.0
     * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
     *
     * @see WP_Query::query()
     *
     * @param object[]     $posts     The posts for the current post type. Mostly `WP_Post` objects, but
     *                                can also contain "fake" post objects to represent other menu items.
     * @param array        $args      An array of `WP_Query` arguments.
     * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix" data-items-type="posttype-<?php 
    echo esc_attr($post_type_name);
    ?>">
			<span class="list-controls hide-if-no-js">
				<input type="checkbox"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> id="<?php 
    echo esc_attr($tab_name);
    ?>" class="select-all" />
				<label for="<?php 
    echo esc_attr($tab_name);
    ?>"><?php 
    _e('Select All');
    ?></label>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="button submit-add-to-menu right" value="<?php 
    esc_attr_e('Add to Menu');
    ?>" name="add-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 5.8

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type callable     $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box($object, $box)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $box['args']->name;
    $post_type = get_post_type_object($post_type_name);
    $tab_name = $post_type_name . '-tab';
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$tab_name]) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($box['args']->_default_query)) {
        $args = array_merge($args, (array) $box['args']->_default_query);
    }
    /*
     * 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();
    if ('page' === $post_type_name) {
        $suppress_page_ids = array();
        // Insert Front Page or custom Home link.
        $front_page = ('page' === get_option('show_on_front')) ? (int) get_option('page_on_front') : 0;
        $front_page_obj = null;
        if (!empty($front_page)) {
            $front_page_obj = get_post($front_page);
            $front_page_obj->front_or_home = true;
            $important_pages[] = $front_page_obj;
            $suppress_page_ids[] = $front_page_obj->ID;
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? (int) $_nav_menu_placeholder - 1 : -1;
            $front_page_obj = (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/'));
            $important_pages[] = $front_page_obj;
        }
        // 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);
            $posts_page_obj->posts_page = true;
            $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) {
                $privacy_policy_page->privacy_policy_page = true;
                $important_pages[] = $privacy_policy_page;
                $suppress_page_ids[] = $privacy_policy_page->ID;
            }
        }
        // Add suppression array to arguments for WP_Query.
        if (!empty($suppress_page_ids)) {
            $args['post__not_in'] = $suppress_page_ids;
        }
    }
    // @todo Transient caching of these results with proper invalidation on updating of a post of this type.
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    // Only suppress and insert when more than just suppression pages available.
    if (!$get_posts->post_count) {
        if (!empty($suppress_page_ids)) {
            unset($args['post__not_in']);
            $get_posts = new WP_Query();
            $posts = $get_posts->query($args);
        } else {
            echo '<p>' . __('No items.') . '</p>';
            return;
        }
    } elseif (!empty($important_pages)) {
        $posts = array_merge($important_pages, $posts);
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($tab_name => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => '<span aria-label="' . esc_attr__('Previous page') . '">' . __('&laquo;') . '</span>', 'next_text' => '<span aria-label="' . esc_attr__('Next page') . '">' . __('&raquo;') . '</span>', 'before_page_number' => '<span class="screen-reader-text">' . __('Page') . '</span> ', 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$tab_name]) && in_array($_REQUEST[$tab_name], array('all', 'search'), true)) {
        $current_tab = $_REQUEST[$tab_name];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    $most_recent_url = '';
    $view_all_url = '';
    $search_url = '';
    if ($nav_menu_selected_id) {
        $most_recent_url = esc_url(add_query_arg($tab_name, 'most-recent', remove_query_arg($removed_args)));
        $view_all_url = esc_url(add_query_arg($tab_name, 'all', remove_query_arg($removed_args)));
        $search_url = esc_url(add_query_arg($tab_name, 'search', remove_query_arg($removed_args)));
    }
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    echo $most_recent_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    echo $view_all_url;
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    echo $search_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" role="region" aria-label="<?php 
    _e('Most Recent');
    ?>" tabindex="0">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filters the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * Possible hook names include:
     *
     *  - `nav_menu_items_post_recent`
     *  - `nav_menu_items_page_recent`
     *
     * @since 4.3.0
     * @since 4.9.0 Added the `$recent_args` parameter.
     *
     * @param WP_Post[] $most_recent An array of post objects being listed.
     * @param array     $args        An array of `WP_Query` arguments for the meta box.
     * @param array     $box         Arguments passed to `wp_nav_menu_item_post_type_meta_box()`.
     * @param array     $recent_args An array of `WP_Query` arguments for 'Most Recent' tab.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box, $recent_args);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search" role="region" aria-label="<?php 
    echo $post_type->labels->search_items;
    ?>" tabindex="0">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" class="screen-reader-text"><?php 
    _e('Search');
    ?></label>
				<input type="search"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="quick-search" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" id="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'small quick-search-submit hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" role="region" aria-label="<?php 
    echo $post_type->labels->all_items;
    ?>" tabindex="0">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? (int) $_nav_menu_placeholder - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filters the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * Possible hook names include:
     *
     *  - `nav_menu_items_post`
     *  - `nav_menu_items_page`
     *
     * @since 3.2.0
     * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
     *
     * @see WP_Query::query()
     *
     * @param object[]     $posts     The posts for the current post type. Mostly `WP_Post` objects, but
     *                                can also contain "fake" post objects to represent other menu items.
     * @param array        $args      An array of `WP_Query` arguments.
     * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix" data-items-type="posttype-<?php 
    echo esc_attr($post_type_name);
    ?>">
			<span class="list-controls hide-if-no-js">
				<input type="checkbox"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> id="<?php 
    echo esc_attr($tab_name);
    ?>" class="select-all" />
				<label for="<?php 
    echo esc_attr($tab_name);
    ?>"><?php 
    _e('Select All');
    ?></label>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="button submit-add-to-menu right" value="<?php 
    esc_attr_e('Add to Menu');
    ?>" name="add-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 5.6

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type callable     $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box($object, $box)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $box['args']->name;
    $post_type = get_post_type_object($post_type_name);
    $tab_name = $post_type_name . '-tab';
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$tab_name]) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($box['args']->_default_query)) {
        $args = array_merge($args, (array) $box['args']->_default_query);
    }
    /*
     * 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();
    if ('page' === $post_type_name) {
        $suppress_page_ids = array();
        // Insert Front Page or custom Home link.
        $front_page = ('page' === get_option('show_on_front')) ? (int) get_option('page_on_front') : 0;
        $front_page_obj = null;
        if (!empty($front_page)) {
            $front_page_obj = get_post($front_page);
            $front_page_obj->front_or_home = true;
            $important_pages[] = $front_page_obj;
            $suppress_page_ids[] = $front_page_obj->ID;
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? (int) $_nav_menu_placeholder - 1 : -1;
            $front_page_obj = (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/'));
            $important_pages[] = $front_page_obj;
        }
        // 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);
            $posts_page_obj->posts_page = true;
            $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) {
                $privacy_policy_page->privacy_policy_page = true;
                $important_pages[] = $privacy_policy_page;
                $suppress_page_ids[] = $privacy_policy_page->ID;
            }
        }
        // Add suppression array to arguments for WP_Query.
        if (!empty($suppress_page_ids)) {
            $args['post__not_in'] = $suppress_page_ids;
        }
    }
    // @todo Transient caching of these results with proper invalidation on updating of a post of this type.
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    // Only suppress and insert when more than just suppression pages available.
    if (!$get_posts->post_count) {
        if (!empty($suppress_page_ids)) {
            unset($args['post__not_in']);
            $get_posts = new WP_Query();
            $posts = $get_posts->query($args);
        } else {
            echo '<p>' . __('No items.') . '</p>';
            return;
        }
    } elseif (!empty($important_pages)) {
        $posts = array_merge($important_pages, $posts);
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($tab_name => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => '<span aria-label="' . esc_attr__('Previous page') . '">' . __('&laquo;') . '</span>', 'next_text' => '<span aria-label="' . esc_attr__('Next page') . '">' . __('&raquo;') . '</span>', 'before_page_number' => '<span class="screen-reader-text">' . __('Page') . '</span> ', 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$tab_name]) && in_array($_REQUEST[$tab_name], array('all', 'search'), true)) {
        $current_tab = $_REQUEST[$tab_name];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    $most_recent_url = '';
    $view_all_url = '';
    $search_url = '';
    if ($nav_menu_selected_id) {
        $most_recent_url = esc_url(add_query_arg($tab_name, 'most-recent', remove_query_arg($removed_args)));
        $view_all_url = esc_url(add_query_arg($tab_name, 'all', remove_query_arg($removed_args)));
        $search_url = esc_url(add_query_arg($tab_name, 'search', remove_query_arg($removed_args)));
    }
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    echo $most_recent_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    echo $view_all_url;
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    echo $search_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" role="region" aria-label="<?php 
    _e('Most Recent');
    ?>" tabindex="0">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filters the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * @since 4.3.0
     * @since 4.9.0 Added the `$recent_args` parameter.
     *
     * @param WP_Post[] $most_recent An array of post objects being listed.
     * @param array     $args        An array of `WP_Query` arguments for the meta box.
     * @param array     $box         Arguments passed to `wp_nav_menu_item_post_type_meta_box()`.
     * @param array     $recent_args An array of `WP_Query` arguments for 'Most Recent' tab.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box, $recent_args);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search" role="region" aria-label="<?php 
    echo $post_type->labels->search_items;
    ?>" tabindex="0">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" class="screen-reader-text"><?php 
    _e('Search');
    ?></label>
				<input type="search"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="quick-search" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" id="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'small quick-search-submit hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" role="region" aria-label="<?php 
    echo $post_type->labels->all_items;
    ?>" tabindex="0">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? (int) $_nav_menu_placeholder - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filters the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * @since 3.2.0
     * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
     *
     * @see WP_Query::query()
     *
     * @param object[]     $posts     The posts for the current post type. Mostly `WP_Post` objects, but
     *                                can also contain "fake" post objects to represent other menu items.
     * @param array        $args      An array of `WP_Query` arguments.
     * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix" data-items-type="posttype-<?php 
    echo esc_attr($post_type_name);
    ?>">
			<span class="list-controls hide-if-no-js">
				<input type="checkbox"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> id="<?php 
    echo esc_attr($tab_name);
    ?>" class="select-all" />
				<label for="<?php 
    echo esc_attr($tab_name);
    ?>"><?php 
    _e('Select All');
    ?></label>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="button submit-add-to-menu right" value="<?php 
    esc_attr_e('Add to Menu');
    ?>" name="add-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 5.5

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type callable     $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box($object, $box)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $box['args']->name;
    $post_type = get_post_type_object($post_type_name);
    $tab_name = $post_type_name . '-tab';
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$tab_name]) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($box['args']->_default_query)) {
        $args = array_merge($args, (array) $box['args']->_default_query);
    }
    /*
     * 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();
    if ('page' === $post_type_name) {
        $suppress_page_ids = array();
        // Insert Front Page or custom Home link.
        $front_page = ('page' === get_option('show_on_front')) ? (int) get_option('page_on_front') : 0;
        $front_page_obj = null;
        if (!empty($front_page)) {
            $front_page_obj = get_post($front_page);
            $front_page_obj->front_or_home = true;
            $important_pages[] = $front_page_obj;
            $suppress_page_ids[] = $front_page_obj->ID;
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            $front_page_obj = (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/'));
            $important_pages[] = $front_page_obj;
        }
        // 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);
            $posts_page_obj->posts_page = true;
            $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) {
                $privacy_policy_page->privacy_policy_page = true;
                $important_pages[] = $privacy_policy_page;
                $suppress_page_ids[] = $privacy_policy_page->ID;
            }
        }
        // Add suppression array to arguments for WP_Query.
        if (!empty($suppress_page_ids)) {
            $args['post__not_in'] = $suppress_page_ids;
        }
    }
    // @todo Transient caching of these results with proper invalidation on updating of a post of this type.
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    // Only suppress and insert when more than just suppression pages available.
    if (!$get_posts->post_count) {
        if (!empty($suppress_page_ids)) {
            unset($args['post__not_in']);
            $get_posts = new WP_Query();
            $posts = $get_posts->query($args);
        } else {
            echo '<p>' . __('No items.') . '</p>';
            return;
        }
    } elseif (!empty($important_pages)) {
        $posts = array_merge($important_pages, $posts);
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($tab_name => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => '<span aria-label="' . esc_attr__('Previous page') . '">' . __('&laquo;') . '</span>', 'next_text' => '<span aria-label="' . esc_attr__('Next page') . '">' . __('&raquo;') . '</span>', 'before_page_number' => '<span class="screen-reader-text">' . __('Page') . '</span> ', 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$tab_name]) && in_array($_REQUEST[$tab_name], array('all', 'search'), true)) {
        $current_tab = $_REQUEST[$tab_name];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    $most_recent_url = '';
    $view_all_url = '';
    $search_url = '';
    if ($nav_menu_selected_id) {
        $most_recent_url = esc_url(add_query_arg($tab_name, 'most-recent', remove_query_arg($removed_args)));
        $view_all_url = esc_url(add_query_arg($tab_name, 'all', remove_query_arg($removed_args)));
        $search_url = esc_url(add_query_arg($tab_name, 'search', remove_query_arg($removed_args)));
    }
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    echo $most_recent_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    echo $view_all_url;
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' === $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    echo $search_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" role="region" aria-label="<?php 
    _e('Most Recent');
    ?>" tabindex="0">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filters the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * @since 4.3.0
     * @since 4.9.0 Added the `$recent_args` parameter.
     *
     * @param WP_Post[] $most_recent An array of post objects being listed.
     * @param array     $args        An array of `WP_Query` arguments for the meta box.
     * @param array     $box         Arguments passed to `wp_nav_menu_item_post_type_meta_box()`.
     * @param array     $recent_args An array of `WP_Query` arguments for 'Most Recent' tab.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box, $recent_args);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search" role="region" aria-label="<?php 
    echo $post_type->labels->search_items;
    ?>" tabindex="0">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" class="screen-reader-text"><?php 
    _e('Search');
    ?></label>
				<input type="search"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="quick-search" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" id="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'small quick-search-submit hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' === $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" role="region" aria-label="<?php 
    echo $post_type->labels->all_items;
    ?>" tabindex="0">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filters the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * @since 3.2.0
     * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
     *
     * @see WP_Query::query()
     *
     * @param object[]     $posts     The posts for the current post type. Mostly `WP_Post` objects, but
     *                                can also contain "fake" post objects to represent other menu items.
     * @param array        $args      An array of `WP_Query` arguments.
     * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix" data-items-type="posttype-<?php 
    echo esc_attr($post_type_name);
    ?>">
			<span class="list-controls hide-if-no-js">
				<input type="checkbox"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> id="<?php 
    echo esc_attr($tab_name);
    ?>" class="select-all" />
				<label for="<?php 
    echo esc_attr($tab_name);
    ?>"><?php 
    _e('Select All');
    ?></label>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="button submit-add-to-menu right" value="<?php 
    esc_attr_e('Add to Menu');
    ?>" name="add-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 5.4

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type string       $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box($object, $box)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $box['args']->name;
    $post_type = get_post_type_object($post_type_name);
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($box['args']->_default_query)) {
        $args = array_merge($args, (array) $box['args']->_default_query);
    }
    /*
     * 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();
    if ('page' == $post_type_name) {
        $suppress_page_ids = array();
        // Insert Front Page or custom Home link.
        $front_page = ('page' == get_option('show_on_front')) ? (int) get_option('page_on_front') : 0;
        $front_page_obj = null;
        if (!empty($front_page)) {
            $front_page_obj = get_post($front_page);
            $front_page_obj->front_or_home = true;
            $important_pages[] = $front_page_obj;
            $suppress_page_ids[] = $front_page_obj->ID;
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            $front_page_obj = (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/'));
            $important_pages[] = $front_page_obj;
        }
        // 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);
            $posts_page_obj->posts_page = true;
            $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) {
                $privacy_policy_page->privacy_policy_page = true;
                $important_pages[] = $privacy_policy_page;
                $suppress_page_ids[] = $privacy_policy_page->ID;
            }
        }
        // Add suppression array to arguments for WP_Query.
        if (!empty($suppress_page_ids)) {
            $args['post__not_in'] = $suppress_page_ids;
        }
    }
    // @todo Transient caching of these results with proper invalidation on updating of a post of this type.
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    // Only suppress and insert when more than just suppression pages available.
    if (!$get_posts->post_count) {
        if (!empty($suppress_page_ids)) {
            unset($args['post__not_in']);
            $get_posts = new WP_Query();
            $posts = $get_posts->query($args);
        } else {
            echo '<p>' . __('No items.') . '</p>';
            return;
        }
    } elseif (!empty($important_pages)) {
        $posts = array_merge($important_pages, $posts);
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => '<span aria-label="' . esc_attr__('Previous page') . '">' . __('&laquo;') . '</span>', 'next_text' => '<span aria-label="' . esc_attr__('Next page') . '">' . __('&raquo;') . '</span>', 'before_page_number' => '<span class="screen-reader-text">' . __('Page') . '</span> ', 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    $most_recent_url = '';
    $view_all_url = '';
    $search_url = '';
    if ($nav_menu_selected_id) {
        $most_recent_url = esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
        $view_all_url = esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
        $search_url = esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    echo $most_recent_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    echo $view_all_url;
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    echo $search_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" role="region" aria-label="<?php 
    _e('Most Recent');
    ?>" tabindex="0">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filters the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * @since 4.3.0
     * @since 4.9.0 Added the `$recent_args` parameter.
     *
     * @param WP_Post[] $most_recent An array of post objects being listed.
     * @param array     $args        An array of `WP_Query` arguments for the meta box.
     * @param array     $box         Arguments passed to `wp_nav_menu_item_post_type_meta_box()`.
     * @param array     $recent_args An array of `WP_Query` arguments for 'Most Recent' tab.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box, $recent_args);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search" role="region" aria-label="<?php 
    echo $post_type->labels->search_items;
    ?>" tabindex="0">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" class="screen-reader-text"><?php 
    _e('Search');
    ?></label>
				<input type="search"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="quick-search" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" id="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'small quick-search-submit hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" role="region" aria-label="<?php 
    echo $post_type->labels->all_items;
    ?>" tabindex="0">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filters the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * @since 3.2.0
     * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
     *
     * @see WP_Query::query()
     *
     * @param object[]     $posts     The posts for the current post type. Mostly `WP_Post` objects, but
     *                                can also contain "fake" post objects to represent other menu items.
     * @param array        $args      An array of `WP_Query` arguments.
     * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix" data-items-type="posttype-<?php 
    echo esc_attr($post_type_name);
    ?>">
			<span class="list-controls hide-if-no-js">
				<input type="checkbox"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> id="<?php 
    echo esc_attr($post_type_name . '-tab');
    ?>" class="select-all" />
				<label for="<?php 
    echo esc_attr($post_type_name . '-tab');
    ?>"><?php 
    _e('Select All');
    ?></label>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="button submit-add-to-menu right" value="<?php 
    esc_attr_e('Add to Menu');
    ?>" name="add-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 3.1

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type string       $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box($object, $box)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $box['args']->name;
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($box['args']->_default_query)) {
        $args = array_merge($args, (array) $box['args']->_default_query);
    }
    /*
     * 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();
    if ('page' == $post_type_name) {
        $suppress_page_ids = array();
        // Insert Front Page or custom Home link.
        $front_page = ('page' == get_option('show_on_front')) ? (int) get_option('page_on_front') : 0;
        $front_page_obj = null;
        if (!empty($front_page)) {
            $front_page_obj = get_post($front_page);
            $front_page_obj->front_or_home = true;
            $important_pages[] = $front_page_obj;
            $suppress_page_ids[] = $front_page_obj->ID;
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            $front_page_obj = (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/'));
            $important_pages[] = $front_page_obj;
        }
        // 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);
            $posts_page_obj->posts_page = true;
            $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) {
                $privacy_policy_page->privacy_policy_page = true;
                $important_pages[] = $privacy_policy_page;
                $suppress_page_ids[] = $privacy_policy_page->ID;
            }
        }
        // Add suppression array to arguments for WP_Query.
        if (!empty($suppress_page_ids)) {
            $args['post__not_in'] = $suppress_page_ids;
        }
    }
    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    // Only suppress and insert when more than just suppression pages available.
    if (!$get_posts->post_count) {
        if (!empty($suppress_page_ids)) {
            unset($args['post__not_in']);
            $get_posts = new WP_Query();
            $posts = $get_posts->query($args);
        } else {
            echo '<p>' . __('No items.') . '</p>';
            return;
        }
    } elseif (!empty($important_pages)) {
        $posts = array_merge($important_pages, $posts);
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => '<span aria-label="' . esc_attr__('Previous page') . '">' . __('&laquo;') . '</span>', 'next_text' => '<span aria-label="' . esc_attr__('Next page') . '">' . __('&raquo;') . '</span>', 'before_page_number' => '<span class="screen-reader-text">' . __('Page') . '</span> ', 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    $most_recent_url = '';
    $view_all_url = '';
    $search_url = '';
    if ($nav_menu_selected_id) {
        $most_recent_url = esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
        $view_all_url = esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
        $search_url = esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    echo $most_recent_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    echo $view_all_url;
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    echo $search_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filters the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * @since 4.3.0
     * @since 4.9.0 Added the `$recent_args` parameter.
     *
     * @param WP_Post[] $most_recent An array of post objects being listed.
     * @param array     $args        An array of `WP_Query` arguments for the meta box.
     * @param array     $box         Arguments passed to `wp_nav_menu_item_post_type_meta_box()`.
     * @param array     $recent_args An array of `WP_Query` arguments for 'Most Recent' tab.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box, $recent_args);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" class="screen-reader-text"><?php 
    _e('Search');
    ?></label>
				<input type="search"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="quick-search" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" id="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'small quick-search-submit hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    $post_type = get_post_type_object($post_type_name);
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filters the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * @since 3.2.0
     * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
     *
     * @see WP_Query::query()
     *
     * @param object[]     $posts     The posts for the current post type. Mostly `WP_Post` objects, but
     *                                can also contain "fake" post objects to represent other menu items.
     * @param array        $args      An array of `WP_Query` arguments.
     * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix" data-items-type="posttype-<?php 
    echo esc_attr($post_type_name);
    ?>">
			<span class="list-controls hide-if-no-js">
				<input type="checkbox"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> id="<?php 
    echo esc_attr($post_type_name . '-tab');
    ?>" class="select-all" />
				<label for="<?php 
    echo esc_attr($post_type_name . '-tab');
    ?>"><?php 
    _e('Select All');
    ?></label>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="button submit-add-to-menu right" value="<?php 
    esc_attr_e('Add to Menu');
    ?>" name="add-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 5.3

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type string       $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box($object, $box)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $box['args']->name;
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($box['args']->_default_query)) {
        $args = array_merge($args, (array) $box['args']->_default_query);
    }
    /*
     * 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();
    if ('page' == $post_type_name) {
        $suppress_page_ids = array();
        // Insert Front Page or custom Home link.
        $front_page = ('page' == get_option('show_on_front')) ? (int) get_option('page_on_front') : 0;
        $front_page_obj = null;
        if (!empty($front_page)) {
            $front_page_obj = get_post($front_page);
            $front_page_obj->front_or_home = true;
            $important_pages[] = $front_page_obj;
            $suppress_page_ids[] = $front_page_obj->ID;
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            $front_page_obj = (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/'));
            $important_pages[] = $front_page_obj;
        }
        // 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);
            $posts_page_obj->posts_page = true;
            $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) {
                $privacy_policy_page->privacy_policy_page = true;
                $important_pages[] = $privacy_policy_page;
                $suppress_page_ids[] = $privacy_policy_page->ID;
            }
        }
        // Add suppression array to arguments for WP_Query.
        if (!empty($suppress_page_ids)) {
            $args['post__not_in'] = $suppress_page_ids;
        }
    }
    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    // Only suppress and insert when more than just suppression pages available.
    if (!$get_posts->post_count) {
        if (!empty($suppress_page_ids)) {
            unset($args['post__not_in']);
            $get_posts = new WP_Query();
            $posts = $get_posts->query($args);
        } else {
            echo '<p>' . __('No items.') . '</p>';
            return;
        }
    } elseif (!empty($important_pages)) {
        $posts = array_merge($important_pages, $posts);
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => '<span aria-label="' . esc_attr__('Previous page') . '">' . __('&laquo;') . '</span>', 'next_text' => '<span aria-label="' . esc_attr__('Next page') . '">' . __('&raquo;') . '</span>', 'before_page_number' => '<span class="screen-reader-text">' . __('Page') . '</span> ', 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    $most_recent_url = '';
    $view_all_url = '';
    $search_url = '';
    if ($nav_menu_selected_id) {
        $most_recent_url = esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
        $view_all_url = esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
        $search_url = esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    echo $most_recent_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    echo $view_all_url;
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    echo $search_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filters the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * @since 4.3.0
     * @since 4.9.0 Added the `$recent_args` parameter.
     *
     * @param WP_Post[] $most_recent An array of post objects being listed.
     * @param array     $args        An array of `WP_Query` arguments for the meta box.
     * @param array     $box         Arguments passed to `wp_nav_menu_item_post_type_meta_box()`.
     * @param array     $recent_args An array of `WP_Query` arguments for 'Most Recent' tab.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box, $recent_args);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" class="screen-reader-text"><?php 
    _e('Search');
    ?></label>
				<input type="search" class="quick-search" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" id="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'small quick-search-submit hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    $post_type = get_post_type_object($post_type_name);
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filters the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * @since 3.2.0
     * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
     *
     * @see WP_Query::query()
     *
     * @param object[]     $posts     The posts for the current post type. Mostly `WP_Post` objects, but
     *                                can also contain "fake" post objects to represent other menu items.
     * @param array        $args      An array of `WP_Query` arguments.
     * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix" data-items-type="posttype-<?php 
    echo esc_attr($post_type_name);
    ?>">
			<span class="list-controls hide-if-no-js">
				<input type="checkbox" id="<?php 
    echo esc_attr($post_type_name . '-tab');
    ?>" class="select-all" />
				<label for="<?php 
    echo esc_attr($post_type_name . '-tab');
    ?>"><?php 
    _e('Select All');
    ?></label>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="button submit-add-to-menu right" value="<?php 
    esc_attr_e('Add to Menu');
    ?>" name="add-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 5.1

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type string       $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box($object, $box)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $box['args']->name;
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($box['args']->_default_query)) {
        $args = array_merge($args, (array) $box['args']->_default_query);
    }
    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    if (!$get_posts->post_count) {
        echo '<p>' . __('No items.') . '</p>';
        return;
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => '<span aria-label="' . esc_attr__('Previous page') . '">' . __('&laquo;') . '</span>', 'next_text' => '<span aria-label="' . esc_attr__('Next page') . '">' . __('&raquo;') . '</span>', 'before_page_number' => '<span class="screen-reader-text">' . __('Page') . '</span> ', 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    $most_recent_url = $view_all_url = $search_url = '';
    if ($nav_menu_selected_id) {
        $most_recent_url = esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
        $view_all_url = esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
        $search_url = esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    echo $most_recent_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    echo $view_all_url;
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    echo $search_url;
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filters the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * @since 4.3.0
     * @since 4.9.0 Added the `$recent_args` parameter.
     *
     * @param WP_Post[] $most_recent An array of post objects being listed.
     * @param array     $args        An array of `WP_Query` arguments for the meta box.
     * @param array     $box         Arguments passed to `wp_nav_menu_item_post_type_meta_box()`.
     * @param array     $recent_args An array of `WP_Query` arguments for 'Most Recent' tab.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box, $recent_args);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" class="screen-reader-text"><?php 
    _e('Search');
    ?></label>
				<input type="search" class="quick-search" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" id="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'small quick-search-submit hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    /*
     * If we're dealing with pages, let's put a checkbox for the front
     * page at the top of the list.
     */
    if ('page' == $post_type_name) {
        $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);
            $front_page_obj->front_or_home = true;
            array_unshift($posts, $front_page_obj);
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            array_unshift($posts, (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/')));
        }
    }
    $post_type = get_post_type_object($post_type_name);
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filters the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * @since 3.2.0
     * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
     *
     * @see WP_Query::query()
     *
     * @param object[]     $posts     The posts for the current post type. Mostly `WP_Post` objects, but
     *                                can also contain "fake" post objects to represent other menu items.
     * @param array        $args      An array of `WP_Query` arguments.
     * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    if ('all' == $current_tab && !empty($_REQUEST['selectall'])) {
        $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items);
    }
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix">
			<span class="list-controls">
				<a href="
				<?php 
    echo esc_url(add_query_arg(array($post_type_name . '-tab' => 'all', 'selectall' => 1), remove_query_arg($removed_args)));
    ?>
				#posttype-<?php 
    echo $post_type_name;
    ?>" class="select-all aria-button-if-js"><?php 
    _e('Select All');
    ?></a>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="button submit-add-to-menu right" value="<?php 
    esc_attr_e('Add to Menu');
    ?>" name="add-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 4.9

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type string       $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box($object, $box)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $box['args']->name;
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($box['args']->_default_query)) {
        $args = array_merge($args, (array) $box['args']->_default_query);
    }
    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    if (!$get_posts->post_count) {
        echo '<p>' . __('No items.') . '</p>';
        return;
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => '<span aria-label="' . esc_attr__('Previous page') . '">' . __('&laquo;') . '</span>', 'next_text' => '<span aria-label="' . esc_attr__('Next page') . '">' . __('&raquo;') . '</span>', 'before_page_number' => '<span class="screen-reader-text">' . __('Page') . '</span> ', 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
    }
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filters the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * @since 4.3.0
     * @since 4.9.0 Added the `$recent_args` parameter.
     *
     * @param array $most_recent An array of post objects being listed.
     * @param array $args        An array of WP_Query arguments for the meta box.
     * @param array $box         Arguments passed to wp_nav_menu_item_post_type_meta_box().
     * @param array $recent_args An array of WP_Query arguments for 'Most Recent' tab.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box, $recent_args);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" class="screen-reader-text"><?php 
    _e('Search');
    ?></label>
				<input type="search" class="quick-search" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" id="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'small quick-search-submit hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    /*
     * If we're dealing with pages, let's put a checkbox for the front
     * page at the top of the list.
     */
    if ('page' == $post_type_name) {
        $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);
            $front_page_obj->front_or_home = true;
            array_unshift($posts, $front_page_obj);
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            array_unshift($posts, (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/')));
        }
    }
    $post_type = get_post_type_object($post_type_name);
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filters the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * @since 3.2.0
     * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
     *
     * @see WP_Query::query()
     *
     * @param array        $posts     The posts for the current post type.
     * @param array        $args      An array of WP_Query arguments.
     * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    if ('all' == $current_tab && !empty($_REQUEST['selectall'])) {
        $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items);
    }
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix">
			<span class="list-controls">
				<a href="<?php 
    echo esc_url(add_query_arg(array($post_type_name . '-tab' => 'all', 'selectall' => 1), remove_query_arg($removed_args)));
    ?>#posttype-<?php 
    echo $post_type_name;
    ?>" class="select-all aria-button-if-js"><?php 
    _e('Select All');
    ?></a>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="button submit-add-to-menu right" value="<?php 
    esc_attr_e('Add to Menu');
    ?>" name="add-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 4.7

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type string       $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box($object, $box)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $box['args']->name;
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($box['args']->_default_query)) {
        $args = array_merge($args, (array) $box['args']->_default_query);
    }
    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    if (!$get_posts->post_count) {
        echo '<p>' . __('No items.') . '</p>';
        return;
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => '<span aria-label="' . esc_attr__('Previous page') . '">' . __('&laquo;') . '</span>', 'next_text' => '<span aria-label="' . esc_attr__('Next page') . '">' . __('&raquo;') . '</span>', 'before_page_number' => '<span class="screen-reader-text">' . __('Page') . '</span> ', 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
    }
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filters the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * @since 4.3.0
     *
     * @param array $most_recent An array of post objects being listed.
     * @param array $args        An array of WP_Query arguments.
     * @param array $box         Arguments passed to wp_nav_menu_item_post_type_meta_box().
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" class="screen-reader-text"><?php 
    _e('Search');
    ?></label>
				<input type="search" class="quick-search" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" id="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'small quick-search-submit hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    /*
     * If we're dealing with pages, let's put a checkbox for the front
     * page at the top of the list.
     */
    if ('page' == $post_type_name) {
        $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);
            $front_page_obj->front_or_home = true;
            array_unshift($posts, $front_page_obj);
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            array_unshift($posts, (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/')));
        }
    }
    $post_type = get_post_type_object($post_type_name);
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filters the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * @since 3.2.0
     * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
     *
     * @see WP_Query::query()
     *
     * @param array        $posts     The posts for the current post type.
     * @param array        $args      An array of WP_Query arguments.
     * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    if ('all' == $current_tab && !empty($_REQUEST['selectall'])) {
        $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items);
    }
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix">
			<span class="list-controls">
				<a href="<?php 
    echo esc_url(add_query_arg(array($post_type_name . '-tab' => 'all', 'selectall' => 1), remove_query_arg($removed_args)));
    ?>#posttype-<?php 
    echo $post_type_name;
    ?>" class="select-all aria-button-if-js"><?php 
    _e('Select All');
    ?></a>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php 
    wp_nav_menu_disabled_check($nav_menu_selected_id);
    ?> class="button submit-add-to-menu right" value="<?php 
    esc_attr_e('Add to Menu');
    ?>" name="add-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 4.6

/**
 * Displays a meta box for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $object Not used.
 * @param array  $box {
 *     Post type menu item meta box arguments.
 *
 *     @type string       $id       Meta box 'id' attribute.
 *     @type string       $title    Meta box title.
 *     @type string       $callback Meta box display callback.
 *     @type WP_Post_Type $args     Extra meta box arguments (the post type object for this meta box).
 * }
 */
function wp_nav_menu_item_post_type_meta_box($object, $box)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $box['args']->name;
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($box['args']->_default_query)) {
        $args = array_merge($args, (array) $box['args']->_default_query);
    }
    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    if (!$get_posts->post_count) {
        echo '<p>' . __('No items.') . '</p>';
        return;
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => __('&laquo;'), 'next_text' => __('&raquo;'), 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
    }
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filters the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * @since 4.3.0
     *
     * @param array $most_recent An array of post objects being listed.
     * @param array $args        An array of WP_Query arguments.
     * @param array $box         Arguments passed to wp_nav_menu_item_post_type_meta_box().
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" class="screen-reader-text"><?php 
    _e('Search');
    ?></label>
				<input type="search" class="quick-search" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" id="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    /*
     * If we're dealing with pages, let's put a checkbox for the front
     * page at the top of the list.
     */
    if ('page' == $post_type_name) {
        $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);
            $front_page_obj->front_or_home = true;
            array_unshift($posts, $front_page_obj);
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            array_unshift($posts, (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/')));
        }
    }
    $post_type = get_post_type_object($post_type_name);
    $archive_link = get_post_type_archive_link($post_type_name);
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filters the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * @since 3.2.0
     * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
     *
     * @see WP_Query::query()
     *
     * @param array        $posts     The posts for the current post type.
     * @param array        $args      An array of WP_Query arguments.
     * @param WP_Post_Type $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    if ('all' == $current_tab && !empty($_REQUEST['selectall'])) {
        $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items);
    }
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix">
			<span class="list-controls">
				<a href="<?php 
    echo esc_url(add_query_arg(array($post_type_name . '-tab' => 'all', 'selectall' => 1), remove_query_arg($removed_args)));
    ?>#posttype-<?php 
    echo $post_type_name;
    ?>" class="select-all"><?php 
    _e('Select All');
    ?></a>
			</span>

			<span class="add-to-menu">
				<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-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 4.5

/**
 * Displays a metabox for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $object Not used.
 * @param string $post_type The post type object.
 */
function wp_nav_menu_item_post_type_meta_box($object, $post_type)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $post_type['args']->name;
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($post_type['args']->_default_query)) {
        $args = array_merge($args, (array) $post_type['args']->_default_query);
    }
    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    if (!$get_posts->post_count) {
        echo '<p>' . __('No items.') . '</p>';
        return;
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => __('&laquo;'), 'next_text' => __('&raquo;'), 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
    }
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filter the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * @since 4.3.0
     *
     * @param array  $most_recent An array of post objects being listed.
     * @param array  $args        An array of WP_Query arguments.
     * @param object $post_type   The current post type object for this menu item meta box.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $post_type);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<label for="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" class="screen-reader-text"><?php 
    _e('Search');
    ?></label>
				<input type="search" class="quick-search" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" id="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    /*
     * If we're dealing with pages, let's put a checkbox for the front
     * page at the top of the list.
     */
    if ('page' == $post_type_name) {
        $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);
            $front_page_obj->front_or_home = true;
            array_unshift($posts, $front_page_obj);
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            array_unshift($posts, (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/')));
        }
    }
    $post_type = get_post_type_object($post_type_name);
    $archive_link = get_post_type_archive_link($post_type_name);
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filter the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * @since 3.2.0
     *
     * @see WP_Query::query()
     *
     * @param array  $posts     The posts for the current post type.
     * @param array  $args      An array of WP_Query arguments.
     * @param object $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    if ('all' == $current_tab && !empty($_REQUEST['selectall'])) {
        $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items);
    }
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix">
			<span class="list-controls">
				<a href="<?php 
    echo esc_url(add_query_arg(array($post_type_name . '-tab' => 'all', 'selectall' => 1), remove_query_arg($removed_args)));
    ?>#posttype-<?php 
    echo $post_type_name;
    ?>" class="select-all"><?php 
    _e('Select All');
    ?></a>
			</span>

			<span class="add-to-menu">
				<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-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 4.4

/**
 * Displays a metabox for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $object Not used.
 * @param string $post_type The post type object.
 */
function wp_nav_menu_item_post_type_meta_box($object, $post_type)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $post_type['args']->name;
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($post_type['args']->_default_query)) {
        $args = array_merge($args, (array) $post_type['args']->_default_query);
    }
    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    if (!$get_posts->post_count) {
        echo '<p>' . __('No items.') . '</p>';
        return;
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => __('&laquo;'), 'next_text' => __('&raquo;'), 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
    }
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filter the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * @since 4.3.0
     *
     * @param array  $most_recent An array of post objects being listed.
     * @param array  $args        An array of WP_Query arguments.
     * @param object $post_type   The current post type object for this menu item meta box.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $post_type);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<input type="search" class="quick-search input-with-default-title" title="<?php 
    esc_attr_e('Search');
    ?>" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    /*
     * If we're dealing with pages, let's put a checkbox for the front
     * page at the top of the list.
     */
    if ('page' == $post_type_name) {
        $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);
            $front_page_obj->front_or_home = true;
            array_unshift($posts, $front_page_obj);
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            array_unshift($posts, (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/')));
        }
    }
    $post_type = get_post_type_object($post_type_name);
    $archive_link = get_post_type_archive_link($post_type_name);
    if ($post_type->has_archive) {
        $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
        array_unshift($posts, (object) array('ID' => 0, 'object_id' => $_nav_menu_placeholder, 'object' => $post_type_name, 'post_content' => '', 'post_excerpt' => '', 'post_title' => $post_type->labels->archives, 'post_type' => 'nav_menu_item', 'type' => 'post_type_archive', 'url' => get_post_type_archive_link($post_type_name)));
    }
    /**
     * Filter the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * @since 3.2.0
     *
     * @see WP_Query::query()
     *
     * @param array  $posts     The posts for the current post type.
     * @param array  $args      An array of WP_Query arguments.
     * @param object $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    if ('all' == $current_tab && !empty($_REQUEST['selectall'])) {
        $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items);
    }
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls">
			<span class="list-controls">
				<a href="<?php 
    echo esc_url(add_query_arg(array($post_type_name . '-tab' => 'all', 'selectall' => 1), remove_query_arg($removed_args)));
    ?>#posttype-<?php 
    echo $post_type_name;
    ?>" class="select-all"><?php 
    _e('Select All');
    ?></a>
			</span>

			<span class="add-to-menu">
				<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-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 4.3

/**
 * Displays a metabox for a post type menu item.
 *
 * @since 3.0.0
 *
 * @global int        $_nav_menu_placeholder
 * @global int|string $nav_menu_selected_id
 *
 * @param string $object Not used.
 * @param string $post_type The post type object.
 */
function wp_nav_menu_item_post_type_meta_box($object, $post_type)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $post_type['args']->name;
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($post_type['args']->_default_query)) {
        $args = array_merge($args, (array) $post_type['args']->_default_query);
    }
    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    if (!$get_posts->post_count) {
        echo '<p>' . __('No items.') . '</p>';
        return;
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => __('&laquo;'), 'next_text' => __('&raquo;'), 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
    }
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    /**
     * Filter the posts displayed in the 'Most Recent' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.
     *
     * @since 4.3.0
     *
     * @param array  $most_recent An array of post objects being listed.
     * @param array  $args        An array of WP_Query arguments.
     * @param object $post_type   The current post type object for this menu item meta box.
     */
    $most_recent = apply_filters("nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $post_type);
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<input type="search" class="quick-search input-with-default-title" title="<?php 
    esc_attr_e('Search');
    ?>" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    /*
     * If we're dealing with pages, let's put a checkbox for the front
     * page at the top of the list.
     */
    if ('page' == $post_type_name) {
        $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);
            $front_page_obj->front_or_home = true;
            array_unshift($posts, $front_page_obj);
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            array_unshift($posts, (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/')));
        }
    }
    /**
     * Filter the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * @since 3.2.0
     *
     * @see WP_Query::query()
     *
     * @param array  $posts     The posts for the current post type.
     * @param array  $args      An array of WP_Query arguments.
     * @param object $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    if ('all' == $current_tab && !empty($_REQUEST['selectall'])) {
        $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items);
    }
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls">
			<span class="list-controls">
				<a href="<?php 
    echo esc_url(add_query_arg(array($post_type_name . '-tab' => 'all', 'selectall' => 1), remove_query_arg($removed_args)));
    ?>#posttype-<?php 
    echo $post_type_name;
    ?>" class="select-all"><?php 
    _e('Select All');
    ?></a>
			</span>

			<span class="add-to-menu">
				<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-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 4.1

/**
 * Displays a metabox for a post type menu item.
 *
 * @since 3.0.0
 *
 * @param string $object Not used.
 * @param string $post_type The post type object.
 */
function wp_nav_menu_item_post_type_meta_box($object, $post_type)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $post_type['args']->name;
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($post_type['args']->_default_query)) {
        $args = array_merge($args, (array) $post_type['args']->_default_query);
    }
    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    if (!$get_posts->post_count) {
        echo '<p>' . __('No items.') . '</p>';
        return;
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => __('&laquo;'), 'next_text' => __('&raquo;'), 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
    }
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<input type="search" class="quick-search input-with-default-title" title="<?php 
    esc_attr_e('Search');
    ?>" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    /*
     * If we're dealing with pages, let's put a checkbox for the front
     * page at the top of the list.
     */
    if ('page' == $post_type_name) {
        $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);
            $front_page_obj->front_or_home = true;
            array_unshift($posts, $front_page_obj);
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            array_unshift($posts, (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/')));
        }
    }
    /**
     * Filter the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, `$post_type_name`, refers
     * to the slug of the current post type.
     *
     * @since 3.2.0
     *
     * @see WP_Query::query()
     *
     * @param array  $posts     The posts for the current post type.
     * @param array  $args      An array of WP_Query arguments.
     * @param object $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    if ('all' == $current_tab && !empty($_REQUEST['selectall'])) {
        $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items);
    }
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls">
			<span class="list-controls">
				<a href="<?php 
    echo esc_url(add_query_arg(array($post_type_name . '-tab' => 'all', 'selectall' => 1), remove_query_arg($removed_args)));
    ?>#posttype-<?php 
    echo $post_type_name;
    ?>" class="select-all"><?php 
    _e('Select All');
    ?></a>
			</span>

			<span class="add-to-menu">
				<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-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 4.0

/**
 * Displays a metabox for a post type menu item.
 *
 * @since 3.0.0
 *
 * @param string $object Not used.
 * @param string $post_type The post type object.
 */
function wp_nav_menu_item_post_type_meta_box($object, $post_type)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $post_type['args']->name;
    // Paginate browsing for large numbers of post objects.
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($post_type['args']->_default_query)) {
        $args = array_merge($args, (array) $post_type['args']->_default_query);
    }
    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    if (!$get_posts->post_count) {
        echo '<p>' . __('No items.') . '</p>';
        return;
    }
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => __('&laquo;'), 'next_text' => __('&raquo;'), 'total' => $num_pages, 'current' => $pagenum));
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
    }
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<input type="search" class="quick-search input-with-default-title" title="<?php 
    esc_attr_e('Search');
    ?>" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    /*
     * If we're dealing with pages, let's put a checkbox for the front
     * page at the top of the list.
     */
    if ('page' == $post_type_name) {
        $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);
            $front_page_obj->front_or_home = true;
            array_unshift($posts, $front_page_obj);
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            array_unshift($posts, (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/')));
        }
    }
    /**
     * Filter the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, $post_type_name,
     * refers to the slug of the current post type.
     *
     * @since 3.2.0
     *
     * @see WP_Query::query()
     *
     * @param array  $posts     The posts for the current post type.
     * @param array  $args      An array of WP_Query arguments.
     * @param object $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    if ('all' == $current_tab && !empty($_REQUEST['selectall'])) {
        $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items);
    }
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls">
			<span class="list-controls">
				<a href="<?php 
    echo esc_url(add_query_arg(array($post_type_name . '-tab' => 'all', 'selectall' => 1), remove_query_arg($removed_args)));
    ?>#posttype-<?php 
    echo $post_type_name;
    ?>" class="select-all"><?php 
    _e('Select All');
    ?></a>
			</span>

			<span class="add-to-menu">
				<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-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 3.8

/**
 * Displays a metabox for a post type menu item.
 *
 * @since 3.0.0
 *
 * @param string $object Not used.
 * @param string $post_type The post type object.
 */
function wp_nav_menu_item_post_type_meta_box($object, $post_type)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $post_type['args']->name;
    // paginate browsing for large numbers of post objects
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($post_type['args']->_default_query)) {
        $args = array_merge($args, (array) $post_type['args']->_default_query);
    }
    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    if (!$get_posts->post_count) {
        echo '<p>' . __('No items.') . '</p>';
        return;
    }
    $post_type_object = get_post_type_object($post_type_name);
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => __('&laquo;'), 'next_text' => __('&raquo;'), 'total' => $num_pages, 'current' => $pagenum));
    if (!$posts) {
        $error = '<li id="error">' . $post_type['args']->labels->not_found . '</li>';
    }
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
    }
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<input type="search" class="quick-search input-with-default-title" title="<?php 
    esc_attr_e('Search');
    ?>" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    // if we're dealing with pages, let's put a checkbox for the front page at the top of the list
    if ('page' == $post_type_name) {
        $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);
            $front_page_obj->front_or_home = true;
            array_unshift($posts, $front_page_obj);
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            array_unshift($posts, (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/')));
        }
    }
    /**
     * Filter the posts displayed in the 'View All' tab of the current
     * post type's menu items meta box.
     *
     * The dynamic portion of the hook name, $post_type_name,
     * refers to the slug of the current post type.
     *
     * @since 3.2.0
     *
     * @see WP_Query::query()
     *
     * @param array  $posts     The posts for the current post type.
     * @param array  $args      An array of WP_Query arguments.
     * @param object $post_type The current post type object for this menu item meta box.
     */
    $posts = apply_filters("nav_menu_items_{$post_type_name}", $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    if ('all' == $current_tab && !empty($_REQUEST['selectall'])) {
        $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items);
    }
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls">
			<span class="list-controls">
				<a href="<?php 
    echo esc_url(add_query_arg(array($post_type_name . '-tab' => 'all', 'selectall' => 1), remove_query_arg($removed_args)));
    ?>#posttype-<?php 
    echo $post_type_name;
    ?>" class="select-all"><?php 
    _e('Select All');
    ?></a>
			</span>

			<span class="add-to-menu">
				<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-post-type-menu-item" id="<?php 
    echo esc_attr('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}

WordPress Version: 3.7

/**
 * Displays a metabox for a post type menu item.
 *
 * @since 3.0.0
 *
 * @param string $object Not used.
 * @param string $post_type The post type object.
 */
function wp_nav_menu_item_post_type_meta_box($object, $post_type)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $post_type['args']->name;
    // paginate browsing for large numbers of post objects
    $per_page = 50;
    $pagenum = (isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged'])) ? absint($_REQUEST['paged']) : 1;
    $offset = (0 < $pagenum) ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if (isset($post_type['args']->_default_query)) {
        $args = array_merge($args, (array) $post_type['args']->_default_query);
    }
    // @todo transient caching of these results with proper invalidation on updating of a post of this type
    $get_posts = new WP_Query();
    $posts = $get_posts->query($args);
    if (!$get_posts->post_count) {
        echo '<p>' . __('No items.') . '</p>';
        return;
    }
    $post_type_object = get_post_type_object($post_type_name);
    $num_pages = $get_posts->max_num_pages;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => __('&laquo;'), 'next_text' => __('&raquo;'), 'total' => $num_pages, 'current' => $pagenum));
    if (!$posts) {
        $error = '<li id="error">' . $post_type['args']->labels->not_found . '</li>';
    }
    $db_fields = false;
    if (is_post_type_hierarchical($post_type_name)) {
        $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    }
    $walker = new Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = $_REQUEST[$post_type_name . '-tab'];
    }
    if (!empty($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $current_tab = 'search';
    }
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo ('most-recent' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-most-recent" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent">
					<?php 
    _e('Most Recent');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('all' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="<?php 
    echo esc_attr($post_type_name);
    ?>-all" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
    }
    ?>#<?php 
    echo $post_type_name;
    ?>-all">
					<?php 
    _e('View All');
    ?>
				</a>
			</li>
			<li <?php 
    echo ('search' == $current_tab) ? ' class="tabs"' : '';
    ?>>
				<a class="nav-tab-link" data-type="tabs-panel-posttype-<?php 
    echo esc_attr($post_type_name);
    ?>-search" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args)));
    }
    ?>#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
					<?php 
    _e('Search');
    ?>
				</a>
			</li>
		</ul><!-- .posttype-tabs -->

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-most-recent" class="tabs-panel <?php 
    echo ('most-recent' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    $recent_args = array_merge($args, array('orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15));
    $most_recent = $get_posts->query($recent_args);
    $args['walker'] = $walker;
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div class="tabs-panel <?php 
    echo ('search' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>" id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>-search">
			<?php 
    if (isset($_REQUEST['quick-search-posttype-' . $post_type_name])) {
        $searched = esc_attr($_REQUEST['quick-search-posttype-' . $post_type_name]);
        $search_results = get_posts(array('s' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC'));
    } else {
        $searched = '';
        $search_results = array();
    }
    ?>
			<p class="quick-search-wrap">
				<input type="search" class="quick-search input-with-default-title" title="<?php 
    esc_attr_e('Search');
    ?>" value="<?php 
    echo $searched;
    ?>" name="quick-search-posttype-<?php 
    echo $post_type_name;
    ?>" />
				<span class="spinner"></span>
				<?php 
    submit_button(__('Search'), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array('id' => 'submit-quick-search-posttype-' . $post_type_name));
    ?>
			</p>

			<ul id="<?php 
    echo $post_type_name;
    ?>-search-checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
			<?php 
    if (!empty($search_results) && !is_wp_error($search_results)) {
        ?>
				<?php 
        $args['walker'] = $walker;
        echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args);
        ?>
			<?php 
    } elseif (is_wp_error($search_results)) {
        ?>
				<li><?php 
        echo $search_results->get_error_message();
        ?></li>
			<?php 
    } elseif (!empty($searched)) {
        ?>
				<li><?php 
        _e('No results found.');
        ?></li>
			<?php 
    }
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="<?php 
    echo $post_type_name;
    ?>-all" class="tabs-panel tabs-panel-view-all <?php 
    echo ('all' == $current_tab) ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>checklist" data-wp-lists="list:<?php 
    echo $post_type_name;
    ?>" class="categorychecklist form-no-clear">
				<?php 
    $args['walker'] = $walker;
    // if we're dealing with pages, let's put a checkbox for the front page at the top of the list
    if ('page' == $post_type_name) {
        $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);
            $front_page_obj->front_or_home = true;
            array_unshift($posts, $front_page_obj);
        } else {
            $_nav_menu_placeholder = (0 > $_nav_menu_placeholder) ? intval($_nav_menu_placeholder) - 1 : -1;
            array_unshift($posts, (object) array('front_or_home' => true, 'ID' => 0, 'object_id' => $_nav_menu_placeholder, 'post_content' => '', 'post_excerpt' => '', 'post_parent' => '', 'post_title' => _x('Home', 'nav menu home label'), 'post_type' => 'nav_menu_item', 'type' => 'custom', 'url' => home_url('/')));
        }
    }
    $posts = apply_filters('nav_menu_items_' . $post_type_name, $posts, $args, $post_type);
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    if ('all' == $current_tab && !empty($_REQUEST['selectall'])) {
        $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items);
    }
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls">
			<span class="list-controls">
				<a href="<?php 
    echo esc_url(add_query_arg(array($post_type_name . '-tab' => 'all', 'selectall' => 1), remove_query_arg($removed_args)));
    ?>#posttype-<?php 
    echo $post_type_name;
    ?>" class="select-all"><?php 
    _e('Select All');
    ?></a>
			</span>

			<span class="add-to-menu">
				<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-post-type-menu-item" id="<?php 
    esc_attr_e('submit-posttype-' . $post_type_name);
    ?>" />
				<span class="spinner"></span>
			</span>
		</p>

	</div><!-- /.posttypediv -->
	<?php 
}