カスタム投稿タイプのアーカイブページとカスタム投稿タイプの投稿をナビゲートするときに、ブログのインデックスメニュー項目からcurrent_page_parentクラスを削除しようとしています(すべてのブログ投稿を表示するカスタムページがあり、メニューにあります)。
私は似たような質問を見つけましたが、それを解決する方法を私は理解することができません。さらに、custom_post_typeをナビゲートするときにcurrent_page_parentがありません(関連していると思います)。
nav_menu_css_class
フィルターを使用して、メニュー項目にクラスを追加または削除することができます。個々のメニュー項目ごとにこのフィルタが適用されます。クラスの配列とメニュー項目オブジェクトが関数に渡され、メニュー項目に持たせたいクラスの配列をreturn
にします。
PHPの array_diff
はクラスを削除するために使用することができ、項目を追加することは$classes[] = 'some-class-name'
を介して配列にクラス名を追加することによって達成することができます。 Conditional Tags
を使用すると、現在表示されているページの種類を確認して、追加または削除する必要があるものを特定できます。
これは現在表示されているページがアーカイブかyour-post-type
型の単一の投稿か、そしてメニュー項目名がBlog
かをチェックする簡単な例です。これらの条件が満たされると、そのメニュー項目のクラスの配列からcurrent_page_parent
クラスが削除されます。必要に応じてこれを追加したり微調整したりできます。
function wpdev_nav_classes( $classes, $item ) {
if( ( is_post_type_archive( 'your-post-type' ) || is_singular( 'your-post-type' ) )
&& $item->title == 'Blog' ){
$classes = array_diff( $classes, array( 'current_page_parent' ) );
}
return $classes;
}
add_filter( 'nav_menu_css_class', 'wpdev_nav_classes', 10, 2 );
現在の答えは素晴らしいですが、ブログのナビゲーション項目のタイトルは "Blog"であると想定しています。ユーザーがWordPressのナビゲーションアイテムを変更したことがある場合、これは問題を引き起こす可能性があります。次のコードは、ナビゲーションアイテムのページIDとWordPressオプションに保存されているブログのページIDを比較するため、汎用的です。
function my_custom_post_type_nav_classes( $classes, $item ) {
$custom_post_type = 'custom-post-type';
if( ( is_post_type_archive( $custom_post_type) || is_singular( $custom_post_type ) )
&& get_post_meta( $item->ID, '_menu_item_object_id', true ) == get_option( 'page_for_posts' ) ){
$classes = array_diff( $classes, array( 'current_page_parent' ) );
}
return $classes;
}
add_filter( 'nav_menu_css_class', 'my_custom_post_type_nav_classes', 10, 2 );