एक वर्डप्रेस मेनू में कस्टम पोस्ट प्रकार अभिलेखागार जोड़ना


10

वर्डप्रेस में एक मेनू में एक कस्टम पोस्ट प्रकार संग्रह जोड़ने के लिए एक रास्ता (एक कस्टम लिंक जोड़ने के अलावा) है? यदि यह एक कस्टम लिंक (जैसे / cpt-आर्काइव-स्लग /) का उपयोग करके जोड़ा जाता है, तो वर्डप्रेस current-menu-itemसूची तत्व की तरह कक्षाएं लागू नहीं करता है , जो मेनू को स्टाइल करते समय चुनौतियां प्रस्तुत करता है।

यदि कस्टम लिंक में संपूर्ण URL (जैसे http://site.com/cpt-archive-slug/ ) शामिल हैं, तो वे कक्षाएं जोड़ी जाती हैं। हालाँकि, यह शायद एक 'सर्वोत्तम अभ्यास' नहीं है।

जवाबों:


5

आपका सबसे अच्छा विकल्प पूर्ण यूआरएल के साथ कस्टम लिंक है क्योंकि कस्टम पोस्ट प्रकार अभिलेखागार विभिन्न प्रकार के वर्गीकरण स्वायत्तता (श्रेणी, टैग, किसी भी कस्टम वर्गीकरण) और तिथि आधारित अभिलेखागार हैं जो स्वयं संग्रह संग्रह हैं।


6

मुझे पता है कि यह पुराना है, लेकिन मुझे भी यह समस्या है और मुझे कस्टम मेनू वॉकर का उपयोग करने के लिए इसे संभालने के लिए एक साफ तरीका मिला है

class KB_Custom_Menu_Walker extends Walker_Nav_Menu {

  protected static $custom_post_types = array();

  public function start_el(&$output, $item, $depth=0, $args=array(), $id=0) {
    if (isset( self::$custom_post_types[ $item->url ] )) {
      $item->url = get_post_type_archive_link( self::$custom_post_types[$item->url] );
    }
    parent::start_el($output, $item, $depth, $args, $id);
  }

  public static function custom_post_types($type=null) {
    if ($type) {
      self::$custom_post_types[ '#post_type_'.$type ] = $type;
    }
    return self::$custom_post_types;
  }
}

URL के साथ एक कस्टम लिंक मेनू आइटम होने पर #post_type_album, आप इसे इस तरह उपयोग कर सकते हैं:

# Where you defined your custom post type (could be anywhere anyway)
KB_Custom_Menu_Walker::custom_post_types('album');

# And display the menu
wp_nav_menu(array(
  'theme_location' => 'primary-nav',
  'walker' => new KB_Custom_Menu_Walker(),
));

नोट: यह माना जाता है कि आपके पोस्ट प्रकार का स्लग और नाम समान है।


लेट क्वालिटी उत्तर के लिए +1। यह समुदाय के लिए अच्छा है!
ब्रायन फीगर

2

मैंने उस दृष्टिकोण के साथ अधिक उदारता प्रदान करने के लिए टंगड के उत्तर पर थोड़ा विस्तार किया है । यह कार्यान्वयन मेनू 'मैक्रोज़' और आंतरिक वर्डप्रेस URL के बीच मनमानी मैपिंग को जोड़ने की अनुमति देता है, जिसके बारे में केवल बैकएंड ही जानता है।

मैंने !इन मैक्रोज़ के लिए उपसर्ग के रूप में उपयोग करने का फैसला किया है, ताकि नामांकित एंकर के साथ टकराव से बचने के लिए - इसमें लिंक URL से 'http: //' को अलग करने के लिए एक ओवरहेड शामिल है (जैसा कि Wordpress इन अजीब लिंक को सामान्य करने का प्रयास करेगा) । यदि वह कार्यान्वयन आपको परेशान करता है, तो आप हमेशा preg_replace()कॉल को हटा सकते हैं और #पहले की तरह अपने लिंक उपसर्ग के रूप में उपयोग कर सकते हैं ।

class Extendable_Menu_Walker extends Walker_Nav_Menu
{
    protected static $custom_urls = array();

    public static function setupUrls()
    {
        // calls to self::mapPostType($postTypeName) and 
        // self::createMapping($wildcard, $url) go here...
    }

    public function start_el(&$output, $item, $depth=0, $args=array(), $id=0)
    {
        $url = preg_replace('@^https?://@', '', $item->url);
        if (isset( self::$custom_urls[ $url ] )) {
            $item->url = self::$custom_urls[ $url ];
        }
        parent::start_el($output, $item, $depth, $args, $id);
    }

    public static function createMapping($urlKey, $realUrl)
    {
        self::$custom_urls['!' . $urlKey] = $realUrl;
    }

    public static function mapPostType($type)
    {
        self::createMapping('post_type_' . $type, get_post_type_archive_link($type));
    }
}

add_action('init', array('Extendable_Menu_Walker', 'setupUrls'));

1

आप एक पेज बना सकते हैं और फिर उस पर एक कस्टम आर्काइव टेम्पलेट लागू कर सकते हैं। मैं संग्रह का उपयोग और उपयोग करता हूं- {पोस्ट-टाइप}। जैसे ही आप डिफ़ॉल्ट आर्काइव के लिए टेम्प्लेट नाम का उपयोग करते हैं, मैं सिर्फ इसे मैन्युअल रूप से पेज पर लागू करता हूं।

यदि आप ऐसा करते हैं, तो मैं आपके CPT को permalink टक्करों से बचने के लिए has_archive = 'false' पर सेट करने की सलाह दूंगा, भले ही यह सुनिश्चित करें कि आपके पृष्ठ में आपके CPT संग्रह स्लग की तुलना में एक अलग Permalink स्लग सेट है।


1

मैं उसी सटीक समस्या में भाग गया, और इस समाधान को पाया:

// $menu is the menu as a string 
if ( check if youa re on the page you are looking for )
    $menu = str_replace( '<li class="menu-item"><a href="http://bla.com/bloop/">', '<li class="current-menu-item menu-item"><a href="http://bla.com/bloop/">'>, $menu );  

स्रोत: http://www.wptavern.com/forum/plugins-hacks/2169-current-page-custom-post-type-archive.html


0

मुझे लगता है कि मुझे एक नया "माता-पिता" पोस्ट-प्रकार बनाना होगा, इसलिए मैं जिस कस्टम-पोस्ट-प्रकार को दिखाना चाहता हूं वह "बच्चा" बन जाता है, और उस माता-पिता को मेनू में सूचीबद्ध किया जाएगा।

यह एक विकल्प होना चाहिए। मेनू में सूचीबद्ध करने के लिए केवल एक डमी माता-पिता बनाना बहुत अधिक काम है।

मैं इसे टेम्प्लेट, या फ़ंक्शंस से करना चाहता हूं, इसलिए मुझे अपने मल्टीसाइट इंस्टॉलेशन में प्रत्येक साइट के लिए प्रत्येक मेनू सेटिंग्स में ऐसा करने की आवश्यकता नहीं है।


1
मेरा मतलब था, मेनू में मैं जिन कस्टम-पोस्ट-प्रकार के पोस्ट दिखाना चाहता था, वे नए बनाए गए पैरेंट का एकमात्र उप-प्रकार होगा, और मुझे उम्मीद है कि यह मेनू सेटिंग्स में पैरेंट के तहत सूचीबद्ध हो जाएगा।
सर्जियो

0

इसी तरह के मुद्दे की खोज करते समय मुझे यह उत्तर मिला। मैंने कोड को अपने फाइनेंशियन्स.php फ़ाइल में कॉपी किया और यह बॉक्स के ठीक बाहर काम किया :) उम्मीद है कि यह मदद करता है!

कस्टम पोस्ट प्रकार (पृष्ठ) के लिए गतिशील नेविगेशन


0

लिंक जोड़ने के बजाय मैं क्या करता हूं एक खाली पृष्ठ बना रहा है। उस पृष्ठ में मैं संपादक में "cpt-name से उत्पन्न सामग्री" जैसा कुछ जोड़ता हूं, इसलिए मेरे ग्राहक को पता है कि सारा सामान कहां से आ रहा है।

फिर मैं उस पृष्ठ को मेनू में जोड़ता हूं और निम्नलिखित कोड के साथ मैं यह सुनिश्चित करता हूं कि जब हाइलाइट किया गया हो तो अभिलेखागार-सीपीटी या एकल-सीपीटी चल रहा हो।

/**
 * Fix to add Custom post types to nav menu
 * If you custom post is called "concepts"
 * create a new empty page called concepts and add this
 */
 function additional_active_item_classes($classes = array(), $menu_item = false){
    global $wp_query;


    if(in_array('current-menu-item', $menu_item->classes)){
        $classes[] = 'current-menu-item';
    }

    if ( $menu_item->title == 'PAGE TITLE' && is_post_type_archive('cpt-slug') ) {
        $classes[] = 'current-menu-item';
    }

    if ( $menu_item->title == 'PAGE TITLE' && is_singular('cpt-slug') ) {
        $classes[] = 'current-menu-item';
    }


    return $classes;
}
add_filter( 'nav_menu_css_class', 'additional_active_item_classes', 10, 2 );

यह मेनू / पृष्ठ शीर्षक के लिए जाँच करेगा और अगर हम वास्तव में कस्टम पोस्ट प्रकार के संग्रह या अलग-अलग पृष्ठ देख रहे हैं। यदि यह सही है तो यह वर्तमान-मेनू-आइटम वर्ग को जोड़ देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.