wp_nav_menu_item_taxonomy_meta_box()
概述
wp_nav_menu_item_taxonomy_meta_box() 函数用于在 WordPress 后台导航菜单编辑器中显示分类法菜单项的元框。它处理分类法术语的浏览、分页和选择,支持常用、全部和搜索标签页。
关键要点
- 函数显示一个元框,用于添加分类法(如分类目录)作为导航菜单项。
- 参数包括 $data_object(未使用)和 $box(包含元框参数如 id、title、callback 和 args)。
- 内部实现包括分页处理(每页 50 项)、术语获取(使用 get_terms())、分页链接生成(paginate_links())和 Walker_Nav_Menu_Checklist 的使用。
- 支持三个标签页:常用术语、全部术语和搜索,通过 URL 参数控制当前标签页。
- 函数输出 HTML 结构,包含分类法术语的复选框列表和添加按钮。
代码示例
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;
}
// 更多代码...
}注意事项
- 函数依赖于全局变量 $nav_menu_selected_id 来生成 URL。
- 使用 Walker_Nav_Menu_Checklist 来渲染层次化分类法的术语列表。
- 分页逻辑基于 $_REQUEST 参数,需确保 URL 参数正确传递。
- 函数输出大量 HTML,适用于后台界面,不建议在前端直接调用。
Displays a meta box for a taxonomy menu item.
Parameters
$data_objectstringrequired-
Not used.
$boxarrayrequired-
Taxonomy menu item meta box arguments.
idstringMeta box'id'attribute.titlestringMeta box title.callbackcallableMeta box display callback.argsobjectExtra meta box arguments (the taxonomy object for this meta box).
Source
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 = (int) ceil(
(int) 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>',
/* translators: Hidden accessibility text. */
'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 = new 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 = add_query_arg( $tab_name, 'most-used', 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( "taxonomy-{$taxonomy_name}" ); ?>" class="taxonomydiv">
<ul id="<?php echo esc_attr( "taxonomy-{$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="<?php echo esc_attr( "tabs-panel-{$taxonomy_name}-pop" ); ?>"
href=""
>
labels->most_used ); ?>
</a>
</li>
<li <?php echo ( 'all' === $current_tab ? ' class="tabs"' : '' ); ?>>
<a class="nav-tab-link"
data-type="<?php echo esc_attr( "tabs-panel-{$taxonomy_name}-all" ); ?>"
href=""
>
</a>
</li>
<li <?php echo ( 'search' === $current_tab ? ' class="tabs"' : '' ); ?>>
<a class="nav-tab-link"
data-type="<?php echo esc_attr( "tabs-panel-search-taxonomy-{$taxonomy_name}" ); ?>"
href=""
>
</a>
</li>
</ul><!-- .taxonomy-tabs -->
<div id="<?php echo esc_attr( "tabs-panel-{$taxonomy_name}-pop" ); ?>"
class="tabs-panel "
role="region" aria-label="labels->most_used ); ?>" tabindex="0"
>
<ul id="<?php echo esc_attr( "{$taxonomy_name}checklist-pop" ); ?>"
class="categorychecklist form-no-clear"
>
$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="<?php echo esc_attr( "tabs-panel-{$taxonomy_name}-all" ); ?>"
class="tabs-panel tabs-panel-view-all "
role="region" aria-label="labels->all_items ); ?>" tabindex="0"
>
<div class="add-menu-item-pagelinks">
</div>
<ul id="<?php echo esc_attr( "{$taxonomy_name}checklist" ); ?>"
data-wp-lists=""
class="categorychecklist form-no-clear"
>
</ul>
<div class="add-menu-item-pagelinks">
</div>
</div><!-- /.tabs-panel -->
<div id="<?php echo esc_attr( "tabs-panel-search-taxonomy-{$taxonomy_name}" ); ?>"
class="tabs-panel "
role="region" aria-label="labels->search_items ); ?>" tabindex="0">
$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="<?php echo esc_attr( "quick-search-taxonomy-{$taxonomy_name}" ); ?>" class="screen-reader-text">
</label>
<input type="search"
class="quick-search" value="<?php echo $searched; ?>"
name="<?php echo esc_attr( "quick-search-taxonomy-{$taxonomy_name}" ); ?>"
id=""
/>
<span class="spinner"></span>
"submit-quick-search-taxonomy-{$taxonomy_name}" )
);
?>
</p>
<ul id="<?php echo esc_attr( "{$taxonomy_name}-search-checklist" ); ?>"
data-wp-lists=""
class="categorychecklist form-no-clear"
>
<li>get_error_message(); ?></li>
<li></li>
</ul>
</div><!-- /.tabs-panel -->
<p class="button-controls wp-clearfix" data-items-type="<?php echo esc_attr( "taxonomy-{$taxonomy_name}" ); ?>">
<span class="list-controls hide-if-no-js">
<input type="checkbox"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?>
id="" class="select-all"
/>
<label for="<?php echo esc_attr( $tab_name ); ?>"></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=""
name="add-taxonomy-menu-item" id=""
/>
<span class="spinner"></span>
</span>
</p>
</div><!-- /.taxonomydiv -->
</pre><p class="wporg-dot-link-list"><a href="https://developer.wordpress.org/reference/files/wp-admin/includes/nav-menu.php/">View all references</a> <a href="https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-admin/includes/nav-menu.php#L861">View on Trac</a> <a href="https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-admin/includes/nav-menu.php#L861-L1137">View on GitHub</a></p></section>
<section class="wp-block-wporg-code-reference-related" data-nosnippet="true"><h2 id="related" class="is-toc-heading wp-block-heading has-heading-5-font-size" tabindex="-1" ><a href="#related">Related</a></h2> <section style="margin-top:var(--wp--preset--spacing--20)" class="wp-block-wporg-code-table" id="uses"><figure class="wp-block-table "><table><thead><tr><th scope="col">Uses</th><th scope="col">Description</th></tr></thead><tbody><tr class=""><td><a href="https://developer.wordpress.org/reference/functions/submit_button/">submit_button()</a><code>wp-admin/includes/template.php
Echoes a submit button, with provided text and appropriate class(es).
Walker_Nav_Menu_Checklist::__construct()wp-admin/includes/class-walker-nav-menu-checklist.php
wp_nav_menu_disabled_check()wp-admin/includes/nav-menu.php
Check whether to disable the Menu Locations meta box submit button and inputs.
esc_attr__()wp-includes/l10n.php
Retrieves the translation of $text and escapes it for safe use in an attribute.
esc_attr_e()wp-includes/l10n.php
Displays translated text that has been escaped for safe use in an attribute.
paginate_links()wp-includes/general-template.php
Retrieves paginated links for archive post pages.
remove_query_arg()wp-includes/functions.php
Removes an item or items from a query string.
wp_count_terms()wp-includes/taxonomy.php
Counts how many terms are in taxonomy.
get_terms()wp-includes/taxonomy.php
Retrieves the terms in a given taxonomy or list of taxonomies.
is_taxonomy_hierarchical()wp-includes/taxonomy.php
Determines whether the taxonomy object is hierarchical.
walk_nav_menu_tree()wp-includes/nav-menu-template.php
Retrieves the HTML list content for nav menu items.
__()wp-includes/l10n.php
Retrieves the translation of $text.
_e()wp-includes/l10n.php
Displays translated text.
esc_attr()wp-includes/formatting.php
Escaping for HTML attributes.
esc_url()wp-includes/formatting.php
Checks and cleans a URL.
esc_html()wp-includes/formatting.php
Escaping for HTML blocks.
absint()wp-includes/load.php
Converts a value to non-negative integer.
add_query_arg()wp-includes/functions.php
Retrieves a modified URL query string.
get_taxonomy()wp-includes/taxonomy.php
Retrieves the taxonomy object of $taxonomy.
is_wp_error()wp-includes/load.php
Checks whether the given variable is a WordPress Error.
Changelog
| Version | Description |
|---|---|
| 3.0.0 | Introduced. |