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') . '">' . __('«') . '</span>', 'next_text' => '<span aria-label="' . esc_attr__('Next page') . '">' . __('»') . '</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
}