การเพิ่มคลังเก็บประเภทโพสต์ที่กำหนดเองในเมนู WordPress


10

มีวิธี (นอกเหนือจากการเพิ่มลิงค์ที่กำหนดเอง) เพื่อเพิ่มการเก็บถาวรชนิดโพสต์ที่กำหนดเองไปยังเมนูใน WordPress หรือไม่? หากมันถูกเพิ่มเข้ามาโดยใช้ลิงก์ที่กำหนดเอง (เช่น / cpt-archive-slug /) WordPress จะไม่ใช้คลาสเช่นเดียวcurrent-menu-itemกับองค์ประกอบของรายการซึ่งแสดงความท้าทายเมื่อจัดแต่งเมนู

หากลิงก์ที่กำหนดเองมี URL ทั้งหมด (เช่นhttp://site.com/cpt-archive-slug/ ) คลาสเหล่านั้นจะถูกเพิ่ม อย่างไรก็ตามนั่นอาจไม่ใช่วิธีปฏิบัติที่ดีที่สุด

คำตอบ:


5

ส่วนที่ดีที่สุดของคุณคือลิงค์ที่กำหนดเองพร้อม URL แบบเต็มเนื่องจากไฟล์เก็บถาวรชนิดโพสต์ที่กำหนดเองเป็นรูปแบบที่แตกต่างกันไปตามหมวดหมู่อนุกรมวิธาน (หมวดหมู่, แท็ก, อนุกรมวิธานใด ๆ ) และวันที่เก็บถาวร


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 สำหรับคำตอบคุณภาพล่าช้า นี่เป็นสิ่งที่ดีสำหรับชุมชน!
Brian Fegter

2

ฉันได้ขยายคำตอบของ tungd ไปเล็กน้อยเพื่อให้แนวทางที่ชัดเจนยิ่งขึ้น การใช้งานนี้ช่วยให้สามารถเพิ่มการแมปตามอำเภอใจระหว่างเมนู 'มาโคร' และ URL เวิร์ดเพรสภายในที่เฉพาะแบ็คเอนด์เท่านั้นที่รู้

ฉันยังได้ตัดสินใจที่จะใช้!เป็นคำนำหน้าสำหรับมาโครเหล่านี้เพื่อหลีกเลี่ยงการชนกับแองเคอร์ที่มีชื่อ - ซึ่งรวมถึงค่าใช้จ่ายในการถอด 'http: //' จาก URL ลิงก์ (เนื่องจาก 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

คุณสามารถสร้างหน้าและใช้เทมเพลตเก็บถาวรแบบกำหนดเองได้ ฉันสร้างและใช้ไฟล์เก็บถาวร - {post-type} .php สำหรับชื่อเทมเพลตเช่นเดียวกับที่คุณทำกับไฟล์เก็บถาวรเริ่มต้นฉันใช้มันกับหน้าเท่านั้น

หากคุณทำเช่นนี้ฉันขอแนะนำให้ตั้งค่า CPT ของคุณเป็น has_archive = 'false' เพื่อหลีกเลี่ยงการชนแบบแทรกซึม


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
ฉันหมายถึงโพสต์ประเภทโพสต์ที่กำหนดเองที่ฉันต้องการแสดงในเมนูจะเป็นประเภทย่อยของผู้ปกครองที่สร้างขึ้นใหม่และฉันหวังว่ามันจะได้รับการจดทะเบียนภายใต้ผู้ปกครองในการตั้งค่าเมนู
sergio

0

ฉันพบคำตอบนี้เมื่อค้นหาปัญหาที่คล้ายกัน ฉันเพิ่งคัดลอกรหัสไปยังไฟล์ finctions.php ของฉันและทำงานได้ทันทีที่ออกจากกล่อง :) หวังว่าจะช่วยได้!

การนำทางแบบไดนามิกสำหรับประเภทโพสต์ที่กำหนดเอง (หน้า)


0

สิ่งที่ฉันทำแทนที่จะเพิ่มลิงค์คือการสร้างหน้าว่าง ในหน้านั้นฉันเพิ่มบางอย่างเช่น "เนื้อหาที่สร้างขึ้นจากชื่อ cpt" ในเครื่องมือแก้ไขเพื่อให้ลูกค้าของฉันรู้ว่าสิ่งของมาจากที่ใด

จากนั้นฉันจะเพิ่มหน้านั้นในเมนูและด้วยรหัสต่อไปนี้ฉันมั่นใจว่ามีการเน้นเมื่อ archives-cpt หรือ single-cpt กำลังทำงาน

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

การทำเช่นนี้จะตรวจสอบชื่อเมนู / หน้าและหากเราเห็นการเก็บถาวรหรือหน้าแต่ละหน้าของประเภทโพสต์ที่กำหนดเอง ถ้าเป็นจริงมันจะเพิ่มคลาสเมนูรายการปัจจุบัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.