Menambahkan arsip jenis posting khusus ke menu WordPress


10

Apakah ada cara (selain menambahkan Tautan Khusus) untuk menambahkan arsip jenis kiriman khusus ke menu di WordPress? Jika ditambahkan menggunakan tautan khusus (mis. / Cpt-archive-slug /), WordPress tidak menerapkan kelas suka current-menu-itemke elemen daftar, yang menghadirkan tantangan saat mendesain menu.

Jika tautan khusus berisi seluruh URL (mis. Http://site.com/cpt-archive-slug/ ), kelas-kelas itu ditambahkan. Namun, itu mungkin bukan 'praktik terbaik'.

Jawaban:


5

Oposisi terbaik Anda adalah tautan khusus dengan url lengkap karena arsip jenis pos Kustom berbeda dengan arsip berdasarkan taksonomi (kategori, tag, semua taksonomi khusus) dan arsip berdasarkan tanggal yang memiliki siput arsip sendiri.


6

Saya tahu ini sudah lama tetapi saya juga memiliki masalah ini dan saya menemukan cara yang agak bersih untuk mengatasinya adalah dengan menggunakan menu walker khusus

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

Memiliki item menu tautan khusus dengan URL #post_type_album, Anda dapat menggunakannya seperti ini:

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

Catatan: Ini berasumsi bahwa siput dan nama jenis posting Anda sama.


+1 untuk jawaban kualitas akhir. Ini bagus untuk komunitas!
Brian Fegter

2

Saya telah sedikit memperluas jawaban tungd untuk memberikan lebih banyak kedermawanan dengan pendekatan itu. Implementasi ini memungkinkan penambahan pemetaan acak antara menu 'makro' dan URL Wordpress internal yang hanya diketahui oleh backend.

Saya juga memutuskan untuk menggunakan !sebagai awalan untuk makro ini untuk menghindari bentrok dengan jangkar bernama - ini termasuk overhead untuk menghapus 'http: //' dari URL tautan (karena Wordpress akan berusaha untuk menormalkan tautan-tautan aneh ini) . Jika implementasi itu mengganggu Anda, Anda selalu dapat menghapus preg_replace()panggilan dan menggunakan #awalan tautan seperti sebelumnya.

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

Anda dapat membuat Halaman dan kemudian menerapkan template arsip khusus untuk itu. Saya membuat dan menggunakan arsip- {post-type} .php untuk nama templat seperti yang Anda lakukan untuk arsip default, saya hanya menerapkannya secara manual ke Halaman.

Jika Anda melakukan ini, saya akan merekomendasikan pengaturan CPT Anda ke has_archive = 'false' untuk menghindari tumbukan permalink, terlepas pastikan saja Halaman Anda memiliki bilah permalink yang berbeda dari yang diatur oleh slug arsip CPT Anda.



0

Saya pikir saya harus membuat tipe posting "induk" baru, jadi tipe posting kustom yang ingin saya tampilkan menjadi "anak", dan orangtua tersebut AKAN tercantum dalam menu.

Ini harus menjadi pilihan. Membuat orangtua boneka hanya untuk membuatnya terdaftar di menu terlalu banyak pekerjaan.

Saya ingin cara melakukannya dari templat, atau fungsi, jadi saya tidak harus melakukannya di setiap pengaturan menu untuk setiap situs di instalasi multisite saya.


1
Maksud saya, postingan tipe posting khusus yang ingin saya perlihatkan di menu akan menjadi satu-satunya sub-tipe dari induk yang baru dibuat, dan saya harap ini terdaftar di bawah induk dalam pengaturan menu.
sergio


0

Apa yang saya lakukan daripada menambahkan tautan adalah membuat halaman kosong. Di halaman itu saya menambahkan sesuatu seperti "Konten yang dihasilkan dari cpt-name" di editor sehingga klien saya tahu dari mana semua barang itu berasal.

Kemudian saya menambahkan halaman itu ke menu dan dengan kode berikut ini saya memastikan yang disorot ketika arsip-cpt atau single-cpt berjalan.

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

Ini akan memeriksa judul menu / halaman dan apakah kita benar-benar melihat arsip atau halaman individual dari jenis posting khusus. Jika itu benar itu akan menambah kelas menu-item-saat ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.