wordpress वर्डप्रेस कस्टम पोस्ट प्रकार पदानुक्रम और मेनू हाइलाइटिंग(वर्तमान_पृष्ठ_पारेंट)




menu highlight (4)

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

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

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

पर्मलिंक यूआरएल सही है: www.site.com/portfolio/post-slug

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

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


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

यह संस्करण गतिशील रूप से कस्टम पोस्ट प्रकारों की एक सूची प्राप्त करता है और यदि वर्तमान पोस्ट प्रकार एक कस्टम पोस्ट प्रकार है, तो यह सभी मेनू आइटमों से '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

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


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

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

आप हालांकि पृष्ठ का उपयोग कर कुछ कस्टम कोड के साथ इस के आसपास हो सकता है css_class फ़िल्टर उदाहरण के लिए, फ़ंक्शन के लिए इन पंक्तियों में कुछ जोड़ें- 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 जोड़ता है, जब एक पोर्टफोलियो को देखने या पोर्टफोलियो पृष्ठ को देखकर


मैंने कुछ और इस पर चारों ओर देखे और यह करने का एक और तरीका पाया।

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

सौहार्दपूर्ण वायु





custom-post-type