2010-07-17 20 views
8

मैंने एक कस्टम पोस्ट प्रकार का 'पोर्टफोलियो' और पृष्ठ टेम्पलेट के साथ बनाया है जो कस्टम पोस्ट प्रकार से मेल खाने वाली सभी पोस्ट पुनर्प्राप्त करता है।वर्डप्रेस कस्टम पोस्ट प्रकार पदानुक्रम और मेनू हाइलाइटिंग (current_page_parent)

समस्या है जब मैं वास्तविक पोस्ट में ड्रिल-डाउन के बाद मुख्य मेनू (एक वर्ग के रूप current_page_parent प्रदर्शित करता है) पर प्रकाश डाला में 'ब्लॉग' के तहत बैठने के लिए लगता है

स्थायी लिंक URL सही है: www.site .com/पोर्टफोलियो/पोस्ट-स्लग

लेकिन मेनू सोचता है कि माता-पिता 'ब्लॉग' है।

यह स्पष्ट रूप से एक पदानुक्रमित मुद्दा है लेकिन मुझे नहीं पता कि इसे ठीक करने के लिए क्या करना है।

उत्तर

10

ऐसा लगता है कि यह कोर वर्डप्रेस कोड के साथ एक मुद्दा है; कोड जो मेनू कक्षाएं उत्पन्न करता है, स्थिर पृष्ठ टेम्पलेट्स को छोड़कर छोड़कर हर जगह अपने ब्लॉग पेज पर current_page_parent जोड़ता है।

(इस पर http://core.trac.wordpress.org/ticket/13543 पर जाने में चर्चा की गई है)।

हालांकि आप पेज_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 की जगह निश्चित रूप से। यह ब्लॉग पेज प्रिंट करते समय current_page_parent को हटा देता है और आपके पोर्टफोलियो पृष्ठ पर current_page_parent जोड़ता है, जब कोई एकल पोर्टफोलियो देखता है या पोर्टफोलियो पृष्ठ को स्वयं देखता है।

+0

+1 उत्कृष्ट खोज, यह Trac – TheDeadMedic

+1

में सुनकर खुशी हुई है मैंने इसे अब सीएसएस और बॉडी क्लास के साथ किया है। हालांकि समारोह के लिए धन्यवाद। – Craig

+0

+1 यहां बहुत छोटा स्निपेट, मुझे एक टन बचाया :) – Xavier

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

Cordially वायु

+0

Wups, यह उत्तर नीचे मेरे पिछले प्रश्न के बाद आना था ... –

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

यहाँ एक समाधान है कि मेरे लिए काम किया, कोड में अपने कस्टम पोस्ट प्रकार या मेनू आईडी या पेज आईडी परिभाषित करने के लिए बिना है :

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

यहां सुझाए गए समाधानों का मेरा अनुकूलित/विस्तारित संस्करण है, जो कि काफी पूर्ण स्वचालित है। कोई अतिरिक्त सीएसएस या मेनू विशेषताओं की आवश्यकता नहीं है।

यह संस्करण गतिशील रूप से कस्टम पोस्ट प्रकारों की एक सूची प्राप्त करता है और यदि वर्तमान पोस्ट प्रकार एक कस्टम पोस्ट प्रकार है, तो यह सभी मेनू आइटमों से 'current_page_parent' वर्ग को हटा देता है।

इसके अलावा यह प्रत्येक मेनू आइटम को यह देखने के लिए जांचता है कि यह पृष्ठ पृष्ठ टेम्पलेट वाले पृष्ठ के लिए है, जैसे "पेज- {custom_post_type_slug} .php", और यदि ऐसा है, तो यह 'current_page_parent' वर्ग जोड़ देगा।

फ़िल्टर प्राथमिकता 1 है, कुछ विषयों के रूप में, current_page_parent/etc को प्रतिस्थापित करें। 'सक्रिय' जैसे वर्ग वाले वर्ग (उदाहरण के लिए 'जड़ों' यह करता है), इसलिए इस फ़िल्टर को पहले निष्पादित करने की आवश्यकता है।

आखिरकार, यह 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); 

पीएस। मैंने अभी तक देखा है कि सभी गैर-सीएसएस समाधानों में एक कमी को इंगित करने के लिए: कुछ भी ध्यान में नहीं लिया गया है जो किसी आइटम से लिंक करने वाले किसी आइटम के मेनू आइटम अभिभावक/पूर्वजों को हाइलाइट कर रहा है जो वर्तमान की पोस्ट प्रदर्शित करता है कस्टम पोस्ट प्रकार।

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

"उत्पाद" एक टेम्पलेट "पृष्ठ-product.php" के साथ एक पृष्ठ है और प्रकार 'उत्पाद' के पदों का अवलोकन से पता चलता: एक कस्टम पोस्ट प्रकार "उत्पाद" और की तरह एक मेनू पर विचार करें। पोस्ट समाधान के कारण इसे हाइलाइट किया गया है। हालांकि 'कंपनी' को अपने माता-पिता/पूर्वजों के रूप में भी हाइलाइट किया जाना चाहिए, लेकिन ऐसा नहीं है। मन में कुछ रखने के लिए।

+0

धन्यवाद। कस्टम पोस्ट प्रकार देखते समय इसने ब्लॉग पोस्ट को एक सक्रिय कक्षा प्राप्त करने के साथ हल किया – Mattijs