Answers:
通过过滤可以做到这一点wp_nav_menu_objects
,这是检查哪个项目是当前菜单项的最简单的位置,因为WordPress已经为您添加了这些类。
add_filter( 'wp_nav_menu_objects', 'wpse16243_wp_nav_menu_objects' );
function wpse16243_wp_nav_menu_objects( $sorted_menu_items )
{
foreach ( $sorted_menu_items as $menu_item ) {
if ( $menu_item->current ) {
$GLOBALS['wpse16243_title'] = $menu_item->title;
break;
}
}
return $sorted_menu_items;
}
现在,您可以使用此新的全局变量而不是普通标题。简单的例子:
add_filter( 'single_cat_title', 'wpse16243_single_cat_title' );
function wpse16243_single_cat_title( $cat_title )
{
if ( isset( $GLOBALS['wpse16243_title'] ) ) {
return $GLOBALS['wpse16243_title'];
}
return $cat_title;
}
当然,只有在显示标题之前先显示菜单,此功能才有效。如果需要更早(可能在<title>
元素中?),则应首先呈现菜单,然后再显示。
wpse16243_wp_nav_menu_objects
来检索当前菜单ID。但这不是一致的。在主页和菜单项之间切换并不能始终为我提供正确的菜单项-有点“滞后”。关于如何获取当前菜单ID的任何建议?
wpse16243
?我看到这种奇怪的名称非常普遍,并且想知道它的全部含义。免责声明:Wordpress新手。
WordPress Stack Exchange question number 16243
。如果人们直接复制此代码,则它不会与可能共享相同功能名称的其他插件冲突。
您可以使用wp_get_nav_menu_items()
。这是一个示例function
:
<?php
function my_get_menu_item_name( $loc ) {
global $post;
$locs = get_nav_menu_locations();
$menu = wp_get_nav_menu_object( $locs[$loc] );
if($menu) {
$items = wp_get_nav_menu_items($menu->term_id);
foreach ($items as $k => $v) {
// Check if this menu item links to the current page
if ($items[$k]->object_id == $post->ID) {
$name = $items[$k]->title;
break;
}
}
}
return $name;
}
然后使用您要使用的导航菜单function
的位置名称调用:
<?php
$menu_name = my_get_menu_item_name( 'NAV_MENU_LOCATION_NAME' ); // eg. 'primary'
echo $menu_name;
add_filter( 'wp_nav_menu_objects', 'wpse16243_wp_nav_menu_objects' );
function wpse16243_wp_nav_menu_objects( $sorted_menu_items )
{
foreach ( $sorted_menu_items as $menu_item ) {
if ($menu_item->current ) {
$GLOBALS['currentMenuTitle'] = $menu_item->title;
$GLOBALS['currentMenuID'] = $menu_item->ID;
break;
}
}
return $sorted_menu_items;
}
function get_menu_items_children( $menu_item_id='' )
{
global $wpdb;
// AND meta_key='_menu_item_menu_item_parent'
$myrows = $wpdb->get_results( "SELECT * FROM $wpdb->postmeta JOIN $wpdb->posts ON $wpdb->postmeta.post_id=$wpdb->posts.id WHERE meta_value = '".$menu_item_id."' AND meta_key='_menu_item_menu_item_parent' ORDER BY $wpdb->posts.menu_order ASC" );
foreach ( $myrows as $menu_item ) {
$sc = get_object_vars($menu_item);
$myrowsb = $wpdb->get_results( "SELECT * FROM $wpdb->postmeta WHERE post_id = '".$sc['post_id']."' AND meta_key='_menu_item_object_id' " );
foreach ( $myrowsb as $menu_itemb ) {
$scb = get_object_vars($menu_itemb);
$pmIDs[] = $scb['meta_value'];
}
}
return $pmIDs;
}
我不确定我是否会完全遵循。
“我们支持的博物馆”由帖子标题,页面标题,类别标题等生成(或者,如果您使用的是自定义导航菜单,则可能是自定义标题)。
您打算如何处理此文字?您想在哪里展示它?我假设您正在尝试在“类别索引”页面上显示它(因为您指出的是current-menu-item
)?如果是这样,只需调用<?php single_cat_title(); ?>
以输出类别标题。
如果您需要其他类别信息,则可以使用以下方法:
$cat = get_the_category();
$currentcat = $cat[0];
这使得以下变量可用:
$currentcat=>cat_ID // Category ID
$currentcat=>cat_name // Category Name (Same as Title)
$currentcat=>category_nicename // Category Slug
$currentcat=>category_description // Category Description
$currentcat=>category_count // Category Count (# of Posts w/ this Category)
如果你是某处其他比类别索引页面,则需要到$ CATID传递到这些功能。
编辑:
由于您指出“我们支持的博物馆”是自定义菜单标题,因此最简单的方法是将“类别”从“博物馆” 重命名为“我们支持的博物馆”(注意:您可以将slug museums
保持不变)。但是,这样做将意味着“我们支持的博物馆”将显示为类别标题,无论它在模板中可能输出的其他位置。如果可以接受,那就不用担心。
否则,您将必须使用wp_get_nav_menu_items()
(Codex ref)之类的东西才能获取特定菜单项的标题。
wp_get_nav_menu_items()
。