web-dev-qa-db-ja.com

CPTのときにブログのインデックスからcurrent_page_parentナビゲーションクラスを削除

カスタム投稿タイプのアーカイブページとカスタム投稿タイプの投稿をナビゲートするときに、ブログのインデックスメニュー項目からcurrent_page_parentクラスを削除しようとしています(すべてのブログ投稿を表示するカスタムページがあり、メニューにあります)。

私は似たような質問を見つけましたが、それを解決する方法を私は理解することができません。さらに、custom_post_typeをナビゲートするときにcurrent_page_parentがありません(関連していると思います)。

3
Kevin Mamaqi

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 );
9
Milo

現在の答えは素晴らしいですが、ブログのナビゲーション項目のタイトルは "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 );
2
richk