10

「ポートフォリオ」のカスタム投稿タイプと、そのカスタム投稿タイプに一致するすべての投稿を取得するテンプレートを含むページを作成しました。

問題は、実際の投稿にドリルダウンすると、メインメニューの強調表示で投稿が「ブログ」の下にあるように見えることです (current_page_parent をクラスとして表示します)。

パーマリンクの URL は正しいです: www.site.com/portfolio/post-slug

しかし、メニューは親が「ブログ」であると考えています。

これは明らかに階層的な問題ですが、修正するために何をすべきかわかりません。

4

6 に答える 6

13

これは、Wordpress のコア コードに問題があるようです。メニュー クラスを生成するコードは、静的なページ テンプレートを表示している場合を除いて、すべてのブログ ページに current_page_parent を追加します。

(これはhttp://core.trac.wordpress.org/ticket/13543で議論されています)。

ただし、page_css_class フィルターを使用したカスタム コードでこれを回避できます。たとえば、次の行に沿って functions.php に何かを追加します (100% テストされていません)。

function my_page_css_class($css_class, $page) {
    if (get_post_type()=='ポートフォリオ' || is_page(57)) {
        if ($page->ID == get_option('page_for_posts')) {
            foreach ($css_class as $k=>$v) {
                if ($v=='current_page_parent') unset($css_class[$k]);
            }
        }
        もし ($page->ID==57) {
            $css_class[]='current_page_parent';
        }
    }
    $css_class を返します。
}
add_filter('page_css_class','my_page_css_class',10,2);

もちろん、57 をポートフォリオ ページの ID に置き換えます。これにより、ブログ ページを印刷するときに current_page_parent が削除され、単一のポートフォリオを表示するとき、またはポートフォリオ ページ自体を表示するときに、 current_page_parent がポートフォリオ ページに追加されます。

于 2010-07-17T03:50:00.367 に答える
3

WP チケット: http://core.trac.wordpress.org/ticket/16382

function fix_blog_menu_css_class( $classes, $item ) {
    if ( is_tax( 'my-cat-tax' ) || is_singular( 'my-post-type' ) || is_post_type_archive( 'my-post-type' ) ) {
        if ( $item->object_id == get_option('page_for_posts') ) {
            $key = array_search( 'current_page_parent', $classes );
            if ( false !== $key )
                unset( $classes[ $key ] );
        }
    }

    return $classes;
}
add_filter( 'nav_menu_css_class', 'fix_blog_menu_css_class', 10, 2 );
于 2013-02-15T19:15:36.433 に答える
1

私はこれをもう少し調べて、これを行う別の方法を見つけました。

add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2);
function current_type_nav_class($css_class, $item)
{
    if (get_post_type() === 'portfolio') {
        $current_value = 'current_page_parent'; 
        $css_class = array_filter($css_class, function ($element) use ($current_value) {
            return ($element != $current_value);
        });
    }

    $post_type = get_query_var('post_type');
    if ($item->attr_title !== '' && $item->attr_title === $post_type) {     
        array_push($css_class, 'current_page_parent');
    };

    return $css_class;
}

この投稿からいくつかの助けを得て、ブログページから「current_page_parent」クラスも削除するように修正しました。 https://wordpress.stackexchange.com/questions/3014/highlighting-wp-nav-menu-ancestor-class-wo-children-in-nav-structure/3034#3034

心からヴァーユ

于 2010-12-10T12:28:36.730 に答える
0

これは、コードでカスタム投稿タイプ、メニューID、またはページIDを定義する必要なく、私にとってうまくいった解決策です:

http://dtbaker.net/web-development/how-to-stop-wordpress-automatically-highlighting-the-blog-page-in-the-menu/

関数 dtbaker_wp_nav_menu_objects($sorted_menu_items, $args){
    // これは実行を停止したい nav-menu-template.php のコードです
    // そのため、このフィルターでこのコード wp コードを「逆」にするために最善を尽くします。
    /* if ( ! empty( $home_page_id ) && 'post_type' == $menu_item->type && empty( $wp_query->is_page ) && $home_page_id == $menu_item->object_id )
            $classes[] = 'current_page_parent'; */

    // 現在のページが本当にブログ投稿かどうかを確認します。
    //print_r($wp_query);終了;
    グローバル $wp_query;
    if(!empty($wp_query->queried_object_id)){
        $current_page = get_post($wp_query->queried_object_id);
        if($current_page && $current_page->post_type=='post'){
            //はい!
        }そうしないと{
            $current_page = false;
        }
    }そうしないと{
        $current_page = false;
    }


    $home_page_id = (int) get_option( 'page_for_posts' );
    foreach($sorted_menu_items as $id => $menu_item){
        if ( ! empty( $home_page_id ) && 'post_type' == $menu_item->type && empty( $wp_query->is_page ) && $home_page_id == $menu_item->object_id ){
            if(!$current_page){
                foreach($sorted_menu_items[$id]->classes as $classid=>$classname){
                    if($classname=='current_page_parent'){
                        unset($sorted_menu_items[$id]->classes[$classid]);
                    }
                }
            }
        }
    }
    $sorted_menu_items を返します。
}
add_filter('wp_nav_menu_objects','dtbaker_wp_nav_menu_objects',10,2);
于 2013-03-24T03:09:23.230 に答える