回答:
これは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 noob。
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を渡す必要があります。
編集:
「Museums We Support」はカスタムメニュータイトルであることを示したので、最も簡単な方法は、カテゴリの名前を「Museums」から「Museums We Support」museums
に変更することです(注:スラッグはそのままにしておくことができます)。ただし、そうすることで、「Museums We Support」がテンプレートのタイトルとして出力される場合は、カテゴリタイトルとして表示されます。それが許容できる場合は、心配する必要はありません。
それ以外の場合は、特定のメニュー項目のタイトルを取得するためにwp_get_nav_menu_items()
(Codex ref)のようなものを使用する必要があります。
wp_get_nav_menu_items()
。カテゴリの名前を変更するか、を使用します。