2010-07-17 40 views
8

Tôi đã tạo loại bài đăng tùy chỉnh 'danh mục' và trang có mẫu truy xuất tất cả các bài đăng khớp với loại bài tùy chỉnh đó.Phân cấp loại bài đăng tùy chỉnh Wordpress và đánh dấu menu (current_page_parent)

Vấn đề là khi tôi đi sâu vào các bài thực tế, bài viết dường như ngồi dưới 'blog' trong menu chính nổi bật (hiển thị current_page_parent như là một lớp)

Url permalink là đúng: www.site .com/portfolio/post-slug

Nhưng menu cho rằng cha/mẹ là 'blog'.

Đây rõ ràng là vấn đề phân cấp nhưng tôi không biết phải làm gì để khắc phục sự cố.

Trả lời

10

Dường như đây là sự cố với mã Wordpress cốt lõi; mã tạo ra các lớp trình đơn thêm current_page_parent vào trang Blog của bạn ở mọi nơi ngoại trừ khi xem các mẫu trang tĩnh.

(Điều này đã được thảo luận trong khi đi qua số http://core.trac.wordpress.org/ticket/13543).

Tuy nhiên, bạn có thể thực hiện việc này với một số mã tùy chỉnh bằng cách sử dụng bộ lọc page_css_class. Ví dụ: thêm thứ gì đó dọc theo các dòng này vào hàm functions.php (không phải 100% được kiểm tra):

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

Thay thế 57 bằng ID của trang danh mục đầu tư, tất nhiên. Điều đó sẽ xóa current_page_parent khi in trang blog và thêm current_page_parent vào trang danh mục đầu tư của bạn, khi xem một danh mục đầu tư hoặc xem trang danh mục đầu tư.

+0

+1 Tuyệt vời tìm thấy, vui mừng khi biết nó đang ở trong trac – TheDeadMedic

+1

Tôi đã thực hiện nó với CSS và các lớp cơ thể cho bây giờ. Cảm ơn các chức năng mặc dù. – Craig

+0

+1 đoạn trích tuyệt vời ở đây, đã lưu cho tôi một tấn :) – Xavier

0

Tôi đã tìm hiểu thêm về điều này và tìm cách khác để thực hiện việc này.

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; 

}

Tôi có một số hình thức giúp đỡ bài đăng này và sau đó sửa đổi nó cũng để loại bỏ các lớp "current_page_parent" từ trang blog. https://wordpress.stackexchange.com/questions/3014/highlighting-wp-nav-menu-ancestor-class-w-o-children-in-nav-structure/3034#3034

Trân trọng Vayu

+0

Wups, câu trả lời này được cho là sẽ đến sau câu hỏi trước của tôi dưới đây ... –

3

vé 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

Đây là một giải pháp mà làm việc cho tôi, mà không cần phải xác định loại bài tùy chỉnh của tôi hoặc id menu hoặc id trang trong mã :

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

Đây là phiên bản được tối ưu hóa/mở rộng của các giải pháp được đề xuất trước đây của tôi, được hoàn toàn tự động hoàn toàn. Không cần thêm thuộc tính CSS hoặc menu bổ sung.

Phiên bản này tự động nhận danh sách các loại bài tùy chỉnh và nếu loại bài đăng hiện tại là loại bài đăng tùy chỉnh, thì nó sẽ xóa lớp 'current_page_parent' khỏi tất cả các mục menu.

Ngoài ra, nó sẽ kiểm tra từng mục menu để xem trang đó có chứa mẫu trang như "page- {custom_post_type_slug} .php" không và nếu có, nó sẽ thêm lớp 'current_page_parent'.

Ưu tiên bộ lọc là 1, như một số chủ đề, thay thế current_page_parent/etc. các lớp với một lớp như 'hoạt động' (ví dụ: 'rễ' thực hiện điều này), do đó, bộ lọc này cần thực thi trước tiên.

Cuối cùng, nó sử dụng 3 biến tĩnh vì hàm này được gọi liên tục và những (rõ ràng) vẫn giữ nguyên như nhau thông qua tất cả các cuộc gọi.

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. Chỉ để chỉ ra một thiếu sót trong tất cả các giải pháp không phải CSS mà tôi đã thấy cho đến nay, bao gồm cả của riêng tôi: Điều gì đó không được tính đến là làm nổi bật mục menu cha/tổ tiên của một mục liên kết đến một trang hiển thị các bài đăng hiện tại tùy chỉnh loại bài. Xem xét loại bài đăng "sản phẩm" tùy chỉnh và một menu như:

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

"Sản phẩm" là trang có mẫu "product-product.php" và hiển thị tổng quan về bài đăng của loại 'product'. Nó được đánh dấu do giải pháp được đăng. Tuy nhiên 'Công ty' làm cha mẹ/tổ tiên của nó cũng nên được tô sáng, nhưng không phải. Một cái gì đó để giữ trong tâm trí.

+0

cảm ơn. Điều này đã giải quyết được vấn đề của tôi với bài đăng trên blog nhận được lớp đang hoạt động trong khi xem Loại bài đăng tùy chỉnh – Mattijs

Các vấn đề liên quan