Thêm lưu trữ loại bài đăng tùy chỉnh vào menu WordPress


10

Có cách nào (ngoài việc thêm Liên kết tùy chỉnh) để thêm kho lưu trữ loại bài đăng tùy chỉnh vào menu trong WordPress không? Nếu được thêm bằng liên kết tùy chỉnh (ví dụ / cpt-archive-slug /), WordPress sẽ không áp dụng các lớp như current-menu-itemthành phần danh sách, điều này đưa ra những thách thức khi tạo kiểu cho menu.

Nếu liên kết tùy chỉnh chứa toàn bộ URL (ví dụ: http://site.com/cpt-archive-slug/ ), các lớp đó sẽ được thêm vào. Tuy nhiên, đó có lẽ không phải là một 'cách thực hành tốt nhất'.

Câu trả lời:


5

khả năng hấp dẫn tốt nhất của bạn là liên kết tùy chỉnh với url đầy đủ vì lưu trữ loại bài đăng tùy chỉnh là lưu trữ dựa trên phân loại biểu mẫu khác nhau (danh mục, thẻ, bất kỳ phân loại tùy chỉnh nào) và lưu trữ dựa trên ngày có sên lưu trữ riêng.


6

Tôi biết điều này đã cũ nhưng tôi cũng gặp vấn đề này và tôi đã tìm thấy một cách khá sạch sẽ để xử lý nó là sử dụng một trình đơn menu tùy chỉnh

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

Có một mục menu liên kết tùy chỉnh với URL của #post_type_album, bạn có thể sử dụng nó như thế này:

# 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(),
));

Lưu ý: Điều này giả định rằng sên và tên loại bài đăng của bạn giống nhau.


+1 cho câu trả lời chất lượng muộn. Điều này là tốt cho cộng đồng!
Brian Fegter

2

Tôi đã mở rộng một chút về câu trả lời của tungd để cung cấp sự hào phóng hơn với cách tiếp cận đó. Việc triển khai này cho phép thêm ánh xạ tùy ý giữa các menu 'macro' và URL Wordpress nội bộ mà chỉ phụ trợ mới biết.

Tôi cũng đã quyết định sử dụng !làm tiền tố cho các macro này để tránh chúng xung đột với các neo được đặt tên - điều này bao gồm một chi phí để loại bỏ 'http: //' khỏi URL liên kết (vì Wordpress sẽ cố gắng bình thường hóa các liên kết kỳ lạ này) . Nếu việc triển khai đó làm phiền bạn, bạn luôn có thể xóa preg_replace()cuộc gọi và sử dụng #làm tiền tố liên kết của mình như trước.

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

Bạn có thể tạo Trang và sau đó áp dụng mẫu lưu trữ tùy chỉnh cho nó. Tôi tạo và sử dụng kho lưu trữ- {post-type} .php cho tên mẫu giống như bạn làm cho kho lưu trữ mặc định, tôi chỉ áp dụng thủ công cho Trang.

Nếu bạn làm điều này, tôi khuyên bạn nên đặt CPT của mình thành has_archive = 'false' để tránh va chạm permalink, bất kể chỉ cần đảm bảo Trang của bạn có sên permalink khác với sên lưu trữ CPT của bạn được đặt thành.



0

Tôi nghĩ rằng tôi phải tạo một loại bài đăng "cha mẹ" mới, vì vậy loại bài đăng tùy chỉnh mà tôi muốn hiển thị sẽ trở thành "con" và cha mẹ đó sẽ được liệt kê trong menu.

Đây nên là một lựa chọn. Tạo một cha mẹ giả chỉ để có được nó được liệt kê trong menu là quá nhiều công việc.

Tôi muốn một cách để làm điều đó từ mẫu hoặc các chức năng, vì vậy tôi không phải làm điều đó trong mỗi cài đặt menu cho mỗi trang web trong cài đặt nhiều trang của tôi.


1
Ý tôi là, các bài đăng loại bài tùy chỉnh mà tôi muốn hiển thị trong menu sẽ là loại phụ duy nhất của cha mẹ được tạo mới và tôi hy vọng nó được liệt kê dưới phần cha mẹ trong cài đặt menu.
sergio


0

Những gì tôi làm thay vì thêm liên kết là tạo một trang trống. Trong trang đó tôi thêm một cái gì đó như "Nội dung được tạo từ tên cpt" trong trình chỉnh sửa để khách hàng của tôi biết tất cả nội dung đến từ đâu.

Sau đó, tôi thêm trang đó vào menu và với đoạn mã sau tôi đảm bảo được tô sáng khi archives-cpt hoặc single-cpt đang chạy.

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

Điều này sẽ kiểm tra tiêu đề menu / trang và nếu chúng ta thực sự thấy kho lưu trữ hoặc trang cá nhân của một loại bài đăng tùy chỉnh. Nếu đúng, nó sẽ thêm lớp mục trình đơn hiện tại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.