函数文档

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.

  • id string
    Meta box 'id' attribute.
  • title string
    Meta box title.
  • callback callable
    Meta box display callback.
  • args object
    Extra 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.

Show 15 moreShow less

Changelog

Version Description
3.0.0 Introduced.