Додавання спеціальних архівів типу публікацій до меню 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 за відповідь на пізню якість. Це добре для громади!
Брайан Фегтер

2

Я трохи розширив відповідь tungd, щоб надати більш широкий підхід із таким підходом. Ця реалізація дозволяє додавати довільні відображення між меню "макроси" та внутрішніми URL-адресами Wordpress, про які знає лише бекенд.

Я також вирішив використовувати !як префікс для цих макросів, щоб уникнути їх зіткнення з названими якорями - це включає накладні витрати, щоб зняти "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

Ви можете створити сторінку, а потім застосувати до неї спеціальний шаблон архіву. Я створюю та використовую archive- {post-type} .php для імені шаблону так само, як і для архіву за замовчуванням, я просто вручну застосую його до сторінки.

Якщо ви це зробите, я рекомендую встановити свій CPT на has_archive = 'false', щоб уникнути зіткнень з постійними посиланнями, незалежно від того, просто переконайтеся, що на вашій сторінці є інший кулик постійної посилання, ніж встановлений для вашого архіву CPT архів.


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

Що я роблю замість того, щоб додавати посилання - це створити порожню сторінку. На цій сторінці я додаю щось подібне до "Вміст, створений із 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 );

Це дозволить перевірити наявність меню / назви сторінки, і чи дійсно ми бачимо архів чи окрему сторінку користувальницького типу публікації. Якщо це правда, він додасть клас поточного меню.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.