wp_nav_menu_item_taxonomy_meta_box() WP 3.0.0

Виводить на екран метабокс із вибором термінів таксономії (для меню).

Використовується в акордеоні для вибору пунктів меню “Рубрик”, “Міток” та інших таксономій.

Працює на основі:
get_taxonomy() ,
get_terms() ,
walk_nav_menu_tree()

Хуків немає.

Повертає

null. Нічого.

Використання

wp_nav_menu_item_taxonomy_meta_box( $object, $box );
$object
(рядок) (обов’язковий)
Не використовується.
$box
(масив) (обов’язковий)

Taxonomy menu item meta box arguments.

  • $id (рядок)
    ID метабоксу.

  • $title (рядок)
    Заголовок метабоксу.

  • $callback (рядок)
    Функція, яка виводить вміст метабоксу.

  • $args (об’єкт)
    Додаткові аргументи метабоксу (об’єкт таксономії цього метабоксу).

Приклади

0

#1 Відобразимо в метабоксі “Рубрики” всі терміни та приховаємо пагінацію

Функція не має фільтра, за допомогою якого можна було б змінити аргументи запиту “Всі рубрики”. Кількість запитуваних термінів 50 (прописано в змінній) і на основі цього числа будується пагінація. Щоб вирішити задачу, скористаємося фільтром функції get_terms() , якою запитуються рубрики.

add_filter( 'get_terms_args', 'view_all_category_in_metabox_menu', 10, 2);

/**
 * @param array $args
 * @param string[] $taxonomies
 *
 * @return array
 */
function view_all_category_in_metabox_menu( $args, $taxonomies ) {
	$screen = get_current_screen();

	// Це сторінка з редагуванням меню
	if ( $screen && $screen->base === 'nav-menus' ) {

		// Це потрібний нам запит
		if ( $taxonomies === [ 'category' ] && $args['number'] === 50 ) {
			$args['number'] = 0;

			// Прихуємо блок із пагінацією
			add_action( 'admin_footer', function () {
				?>
				<style>
					#tabs-panel-category-all .add-menu-item-pagelinks {
						display: none;
					}
				</style>
				<?php
			} );
		}
	}

	return $args;
}

нотатки

  • Global. int|Рядок. $nav_menu_selected_id

список змін

З версії 3.0.0Введено.

Код wp_nav_menu_item_taxonomy_meta_box() WP 6.0.2

<?php
function wp_nav_menu_item_taxonomy_meta_box( $data_object, $box ) {
	global $nav_menu_selected_id;

	$taxonomy_name = $box['args']->name;
	$taxonomy = get_taxonomy( $taxonomy_name );
	$tab_name = $taxonomy_name. '-tab';

	// Paginate browsing for large numbers of 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 (
		'taxonomy' => $taxonomy_name,
		'child_of' => 0,
		'exclude' => '',
		'hide_empty' => false,
		'hierarchical' => 1,
		'include' => '',
		'number' => $per_page,
		'offset' => $offset,
		'order' => 'ASC',
		'orderby' => 'name',
		'pad_counts' => false,
	);

	$ terms = get_terms ($ args);

	if ( ! $terms || is_wp_error( $terms ) ) {
		echo '<p>'. __( 'No items.') . '</p>';
		return;
	}

	$num_pages = ceil(
		wp_count_terms(
			array_merge(
				$args,
				array(
					'number' => '',
					'offset' => '',
				)
			)
		) / $per_page
	);

	$page_links = paginate_links(
		array(
			'base' => add_query_arg(
				array(
					$tab_name => 'all',
					'paged' => '%#%',
					'item-type' => 'taxonomy',
					'item-object' => $taxonomy_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_taxonomy_hierarchical( $taxonomy_name ) ) {
		$ db_fields = array (
			'parent' => 'parent',
			'id' => 'term_id',
		);
	}

	$walker = новий Walker_Nav_Menu_Checklist( $db_fields );

	$current_tab = 'most-used';

	if ( isset( $_REQUEST[ $tab_name ] ) && in_array( $_REQUEST[ $tab_name ], array( 'all', 'most-used', 'search' ), true ) ) {
		$current_tab = $_REQUEST[$tab_name];
	}

	if ( ! empty( $_REQUEST[ 'quick-search-taxonomy-' . $taxonomy_name ] ) ) {
		$current_tab = 'search';
	}

	$ removed_args = array(
		'action',
		'customlink-tab',
		'edit-menu-item',
		'menu-item',
		'page-tab',
		'_wpnonce',
	);

	$most_used_url = '';
	$view_all_url = '';
	$search_url = '';
	if ( $nav_menu_selected_id ) {
		$most_used_url = esc_url( add_query_arg( $tab_name, 'most-used', 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="taxonomy-<?php echo $taxonomy_name; ?>" class="taxonomydiv">
		<ul id="taxonomy-<?php echo $taxonomy_name; ?>-tabs" class="taxonomy-tabs add-menu-item-tabs">
			<li <?php echo ( 'most-used' === $current_tab ? ' class="tabs"' : '' ); ?>>
				<a class="nav-tab-link" data-type="tabs-panel-<?php echo esc_attr( $taxonomy_name ); ?>-pop" href="<?php echo $most_used_url; ?>#tabs- panel-<?php echo $taxonomy_name; ?>-pop">
					<?php echo esc_html( $taxonomy->labels->most_used ); ?>
				</a>
			</li>
			<li <?php echo ( 'all' === $current_tab ? ' class="tabs"' : '' ); ?>>
				<a class="nav-tab-link" data-type="tabs-panel-<?php echo esc_attr( $taxonomy_name ); ?>-all" href="<?php echo $view_all_url; ?>#tabs- panel-<?php echo $taxonomy_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-search-taxonomy-<?php echo esc_attr( $taxonomy_name ); ?>" href="<?php echo $search_url; ?># tabs-panel-search-taxonomy-<?php echo $taxonomy_name; ?>">
					<?php _e( 'Search'); ?>
				</a>
			</li>
		</ul><!-- .taxonomy-tabs -->

		<div id="tabs-panel-<?php echo $taxonomy_name; ?>-pop" class="tabs-panel <?php echo ( 'most-used' === $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive'); ?>" role="region" aria-label="<?php echo $taxonomy->labels->most_used; ?>"
			<ul id="<?php echo $taxonomy_name; ?>checklist-pop" class="categorychecklist form-no-clear" >
				<?php
				$popular_terms = get_terms(
					array(
						'taxonomy' => $taxonomy_name,
						'orderby' => 'count',
						'order' => 'DESC',
						'number' => 10,
						'hierarchical' => false,
					)
				);
				$args['walker'] = $walker;
				echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', $popular_terms ), 0, (object) $args );
				?>
			</ul>
		</div><!-- /.tabs-panel -->

		<div id="tabs-panel-<?php echo $taxonomy_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 if (! empty( $page_links ) ) : ?>
				<div class="add-menu-item-pagelinks">
					<?php echo $page_links; ?>
				</div>
			<?php endif; ?>
			<ul id="<?php echo $taxonomy_name; ?>checklist" data-wp-lists="list:<?php echo $taxonomy_name; ?>" class="categorychecklist form-no-clear">
				<?php
				$args['walker'] = $walker;
				echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', $terms ), 0, (object) $args );
				?>
			</ul>
			<?php if (! empty( $page_links ) ) : ?>
				<div class="add-menu-item-pagelinks">
					<?php echo $page_links; ?>
				</div>
			<?php endif; ?>
		</div><!-- /.tabs-panel -->

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

			<ul id="<?php echo $taxonomy_name; ?>-search-checklist" data-wp-lists="list:<?php echo $taxonomy_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 endif; ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<p class="button-controls wp-clearfix" data-items-type="taxonomy-<?php echo esc_attr( $taxonomy_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-taxonomy-menu-item" id="<?php echo esc_attr( 'submit-taxonomy-' . $taxonomy_name ); ?>" />
				<span class="spinner"></span>
			</span>
		</p>

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

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

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