2010-07-17 74 views
8

我已經創建了一個自定義帖子類型的'組合'和頁面與模板,檢索所有帖子匹配該自定義帖子類型。WordPress的自定義帖子類型層次結構和菜單高亮(current_page_parent)

問題是,當我深入到實際崗位,崗位似乎在主菜單高亮(current_page_parent作爲一類顯示器)下的「博客」坐

固定鏈接網址是否正確:www.site .com/portfolio/post-slug

但是菜單認爲父母是'博客'。

這顯然是一個等級問題,但我不知道該如何解決它。

回答

10

看來這是一個核心的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()=='portfolio' || 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]); 
      } 
     } 
     if ($page->ID==57) { 
      $css_class[]='current_page_parent'; 
     } 
    } 
    return $css_class; 
} 
add_filter('page_css_class','my_page_css_class',10,2);

更換57與您的組合頁面的ID,當然。在打印博客頁面時刪除current_page_parent,並在查看單個投資組合或查看投資組合頁面時,將current_page_parent添加到您的投資組合頁面。

+0

+1優秀的發現,很高興聽到它在trac – TheDeadMedic 2010-07-17 15:03:20

+1

現在我已經做了CSS和body類。感謝您的功能。 – Craig 2010-07-18 14:38:11

+0

+1這裏有很大的小片段,救了我一噸:) – Xavier 2011-07-27 15:24:26

0

我做了一些更多的四處尋找這個,並找到了另一種方式做到這一點。

add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2); 
function current_type_nav_class($css_class, $item) { 
$post_type = get_query_var('post_type'); 

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); }); 
} 

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-w-o-children-in-nav-structure/3034#3034

親切 伐由

+0

Wups,這個答案應該是在我之前的問題之後來的... – 2010-12-10 12:30:50

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); 
0

這裏是爲我工作,而無需定義代碼我自定義後類型或菜單ID或頁面ID解決方案:

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

 
function dtbaker_wp_nav_menu_objects($sorted_menu_items, $args){ 
    // this is the code from nav-menu-template.php that we want to stop running 
    // so we try our best to "reverse" this code wp code in this filter. 
    /* 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'; */ 

    // check if the current page is really a blog post. 
    //print_r($wp_query);exit; 
    global $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'){ 
      //yes! 
     }else{ 
      $current_page = false; 
     } 
    }else{ 
     $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]); 
        } 
       } 
      } 
     } 
    } 
    return $sorted_menu_items; 
} 
add_filter('wp_nav_menu_objects','dtbaker_wp_nav_menu_objects',10,2); 
5

這是我先前建議的解決方案的優化/擴展版本,它幾乎完全自動化。不再需要額外的CSS或菜單屬性。

該版本動態獲取自定義帖子類型的列表,並且如果當前帖子類型是自定義帖子類型,則它從所有菜單項中移除「current_page_parent」類。

此外,它會檢查每個菜單項以查看它是否適用於頁面模板類似「page- {custom_post_type_slug} .php」的頁面,如果是,則會添加「current_page_parent」類。

過濾優先級爲1,因爲有些主題,將current_page_parent/etc替換。具有類似'active'的類(例如'roots')這樣做,所以這個過濾器需要首先執行。

最後,它使用了3個靜態變量,因爲該函數被重複調用,並且這些(顯然)通過所有調用保持不變。

function theme_current_type_nav_class($css_class, $item) { 
    static $custom_post_types, $post_type, $filter_func; 

    if (empty($custom_post_types)) 
     $custom_post_types = get_post_types(array('_builtin' => false)); 

    if (empty($post_type)) 
     $post_type = get_post_type(); 

    if ('page' == $item->object && in_array($post_type, $custom_post_types)) { 
     if (empty($filter_func)) 
      $filter_func = create_function('$el', 'return ($el != "current_page_parent");'); 

     $css_class = array_filter($css_class, $filter_func); 

     $template = get_page_template_slug($item->object_id); 
     if (!empty($template) && preg_match("/^page(-[^-]+)*-$post_type/", $template) === 1) 
      array_push($css_class, 'current_page_parent'); 

    } 

    return $css_class; 
} 
add_filter('nav_menu_css_class', 'theme_current_type_nav_class', 1, 2); 

PS。只是指出了迄今爲止我見過的所有非CSS解決方案中的一個缺點,包括我自己的缺點: 未考慮的事項是突出顯示鏈接到顯示當前帖子的頁面的項目的菜單項父/祖先自定義帖子類型。考慮一個自定義後型「產品」和類似的菜單:

Home Company News Contact 
     | 
     \--About Us 
     \--Products 

「產品」是一個模板「頁面product.php」一個頁面,顯示類型「產品」的帖子的概述。由於發佈解決方案而突出顯示。然而,'公司'作爲其父母/祖先也應該被強調,但不是。要記住的事情。

+0

謝謝。這確實解決了我在查看自定義帖子類型時收到Active類的博文的問題 – Mattijs 2015-02-13 05:14:50