WordPress menüsüne özel yazı tipi arşivleri ekleme


10

WordPress'teki bir menüye özel bir yazı tipi arşivi eklemenin bir yolu (Özel Bağlantı eklemenin yanı sıra) var mı? Özel bir bağlantı (örn. / Cpt-archive-slug /) kullanılarak eklenirse, WordPress current-menu-itemliste öğesine benzer sınıflar uygulamaz ve bu da menüyü şekillendirirken zorluklar sunar.

Özel bağlantı URL'nin tamamını içeriyorsa (örneğin, http://site.com/cpt-archive-slug/ ), bu sınıflar eklenir. Ancak, bu muhtemelen 'en iyi uygulama' değildir.

Yanıtlar:


5

Özel yazı türleri arşivleri farklı form sınıflandırmasına dayalı arşivler (kategoriler, etiketler, herhangi bir özel sınıflandırma) ve kendi arşiv bilgi içeren tarihe dayalı arşivler olduğu için en iyi karşılığınız tam URL ile özel bağlantıdır.


6

Bu eski olduğunu biliyorum ama ben de bu sorunu var ve ben idare etmek için oldukça temiz bir yol buldum bir özel menü yürüteç kullanmak olduğunu

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'sine sahip özel bir bağlantı menü öğesine sahip olarak #post_type_album, bunu şu şekilde kullanabilirsiniz:

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

Not: Bu, yazı türünüzün bilgi ve adının aynı olduğunu varsayar.


Geç kaliteli cevap için +1. Bu topluluk için iyi!
Brian Fegter

2

Bu yaklaşımla daha fazla jeneriklik sağlamak için tungd'un cevabını biraz genişlettim . Bu uygulama, 'makrolar' menüsü ile yalnızca arka ucun bildiği dahili Wordpress URL'leri arasında rastgele eşlemeler eklenmesine izin verir.

Ayrıca !adlandırılmış çapa ile çakışmasını önlemek için bu makrolar için önek olarak kullanmaya karar verdim - bu bağlantı URL'sinden 'http: //' çıkarmak için bir ek yük içerir (Wordpress bu garip bağlantıları normalleştirmek çalışacağız gibi) . Bu uygulama sizi rahatsız ediyorsa, her zaman preg_replace()aramayı kaldırabilir ve önceki #gibi bağlantı öneki olarak kullanabilirsiniz .

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

Bir Sayfa oluşturabilir ve daha sonra bu sayfaya özel bir arşiv şablonu uygulayabilirsiniz. Şablon adını varsayılan arşiv için yaptığınız gibi arşiv- {post-type} .php oluşturup kullanıyorum, sadece sayfaya manuel olarak uyguluyorum.

Bunu yaparsanız, kalıcı bağlantı çakışmalarını önlemek için CPT'nizi has_archive = 'false' olarak ayarlamanızı öneririm.



0

Sanırım yeni bir "üst" yazım türü oluşturmak zorundayım, bu yüzden göstermek istediğim özel yazım türü "alt" olur ve bu üst öğe menüde listelenir.

Bu bir seçenek olmalı. Sadece menüde listelenmesi için bir kukla ebeveyn oluşturmak çok fazla iş.

Bunu şablondan veya işlevlerden yapmanın bir yolunu istiyorum, bu yüzden çoklu site kurulumumdaki her site için her menü ayarında bunu yapmak zorunda değilim.


1
Demek istediğim, menüde göstermek istediğim özel yazı tipi yazılar, yeni oluşturulan ebeveynin tek alt türü olacak ve umarım menü ayarlarında ebeveynin altında listelenir.
sergio


0

Bağlantı eklemek yerine yaptığım şey boş bir sayfa oluşturmaktır. Bu sayfaya editörüme "cpt-name'den oluşturulan içerik" gibi bir şey ekledim, böylece müvekkilim her şeyin nereden geldiğini biliyor.

Sonra bu sayfayı menüye eklerim ve aşağıdaki kodla arşivler-cpt veya single-cpt çalışırken vurgulandığından emin olurum.

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

Bu, menü / sayfa başlığını kontrol eder ve özel bir yazı türünün arşivini veya tek tek sayfasını gerçekten görüyor muyuz. Doğruysa, geçerli menü öğesi sınıfını ekler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.