WordPress 메뉴에 사용자 정의 게시물 유형 아카이브 추가


10

WordPress의 메뉴에 사용자 정의 게시물 유형 아카이브를 추가하는 방법 (사용자 정의 링크 추가 외에)이 있습니까? 사용자 정의 링크 (예 : / cpt-archive-slug /)를 사용하여 추가 한 경우 WordPress는 current-menu-item목록 요소 와 같은 클래스를 적용하지 않으므로 메뉴 스타일을 지정할 때 문제가 발생합니다.

맞춤 링크에 전체 URL이 포함 된 경우 (예 : http://site.com/cpt-archive-slug/ ) 해당 클래스가 추가됩니다. 그러나 아마도 '모범 사례'는 아닙니다.

답변:


5

사용자 정의 게시물 유형 아카이브는 다른 양식 분류 기반 아카이브 (카테고리, 태그, 모든 사용자 정의 분류) 및 아카이브 슬러그가있는 날짜 기반 아카이브이므로 전체 옵션을 사용하는 것이 가장 좋습니다.


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의 답변 을 약간 확장했습니다 . 이 구현을 통해 메뉴 '매크로'와 백엔드 만 알고있는 내부 Wordpress URL간에 임의의 매핑을 추가 할 수 있습니다.

나는 또한 !명명 된 앵커와 충돌하는 것을 피하기 위해이 매크로의 접두사 로 사용하기로 결정했습니다 . . 그 구현이 당신을 귀찮게한다면, 항상 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 아카이브 슬러그와 다른 퍼머 링크 슬러그가 있는지 확인하지 않아도 퍼머 링크 충돌을 피하기 위해 CPT를 has_archive = 'false'로 설정하는 것이 좋습니다.



0

새로운 "부모"포스트 유형을 작성해야한다고 생각하므로 표시하려는 사용자 정의 포스트 유형이 "자식"이되고 해당 부모가 메뉴에 나열됩니다.

이것은 옵션이어야합니다. 메뉴에 표시하기 위해 더미 부모를 만드는 것이 너무 많은 작업입니다.

템플릿 또는 기능에서 수행하는 방법을 원하므로 다중 사이트 설치의 각 사이트에 대한 각 메뉴 설정에서 수행하지 않아도됩니다.


1
메뉴에 표시하고 싶은 커스텀 포스트 타입 포스트는 새로 생성 된 부모의 유일한 하위 타입이 될 것이며 메뉴 설정에서 부모 아래에 나열되기를 바랍니다.
sergio


0

링크를 추가하는 대신 빈 페이지를 만드는 것입니다. 이 페이지에서 나는 편집기에서 "cpt-name에서 생성 된 내용"과 같은 것을 추가하여 클라이언트가 모든 자료의 출처를 알 수 있도록합니다.

그런 다음 해당 페이지를 메뉴에 추가하고 다음 코드를 사용하여 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.