메뉴에 사용자 지정 게시 유형 보관을 추가하는 방법
나는 몇 주 동안 이 문제에 대한 적절한 해결책을 찾지 못했다.
워드프레스 테마를 쓰고 있어요.작업이라고 하는 커스텀 투고 타입이 있습니다.메뉴에 Works 아카이브를 추가하여 액세스 시 해당 게시물과 함께 강조 표시하고 싶습니다.
다음 링크에서 내 아카이브 및 게시물에 액세스할 수 있습니다.
작업 아카이브:/works/
1개의 포스트로 동작:/works/postname/
내 해결책은 내 이름을 대는 것이었다.archive-works.php템플릿 이름을 가진 템플릿 파일(Work Archive).그런 다음 해당 템플릿을 사용하여 빈 페이지를 만들고 페이지를 메뉴에 추가합니다.그러면 메뉴의 아카이브가 강조 표시되지만 단일 게시물은 강조 표시되지 않습니다.
커스텀 링크와 Javascript로 간단하게 해결할 수 있지만, 더 좋고 깨끗한 방법이 있을 것입니다.
간단한 기능을 수행할 수 있습니다.php:
add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2);
function current_type_nav_class($classes, $item) {
// Get post_type for this post
$post_type = get_query_var('post_type');
// Go to Menus and add a menu class named: {custom-post-type}-menu-item
// This adds a 'current_page_parent' class to the parent menu item
if( in_array( $post_type.'-menu-item', $classes ) )
array_push($classes, 'current_page_parent');
return $classes;
}
이 경우 관리 패널에서 해당 아카이브 메뉴 항목과 함께 클래스 'works-menu-item'을 추가하면 됩니다.
메뉴에 "커스텀 포스트타입 아카이브 링크"를 추가하려면 다음 가이드를 참조하십시오.
파일 기능을 엽니다.php 및 아래에 코드를 입력합니다.
add_action('admin_head-nav-menus.php', 'wpclean_add_metabox_menu_posttype_archive'); function wpclean_add_metabox_menu_posttype_archive() { add_meta_box('wpclean-metabox-nav-menu-posttype', __('Custom Post Type Archives'), 'wpclean_metabox_menu_posttype_archive', 'nav-menus', 'side', 'default'); } function wpclean_metabox_menu_posttype_archive() { $post_types = get_post_types(array('show_in_nav_menus' => true, 'has_archive' => true), 'object'); if ($post_types) : $items = array(); $loop_index = 999999; foreach ($post_types as $post_type) { $item = new stdClass(); $loop_index++; $item->object_id = $loop_index; $item->db_id = 0; $item->object = 'post_type_' . $post_type->query_var; $item->menu_item_parent = 0; $item->type = 'custom'; $item->title = $post_type->labels->name; $item->url = get_post_type_archive_link($post_type->query_var); $item->target = ''; $item->attr_title = ''; $item->classes = array(); $item->xfn = ''; $items[] = $item; } $walker = new Walker_Nav_Menu_Checklist(array()); echo '<div id="posttype-archive" class="posttypediv">'; echo '<div id="tabs-panel-posttype-archive" class="tabs-panel tabs-panel-active">'; echo '<ul id="posttype-archive-checklist" class="categorychecklist form-no-clear">'; echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $items), 0, (object) array('walker' => $walker)); echo '</ul>'; echo '</div>'; echo '</div>'; echo '<p class="button-controls">'; echo '<span class="add-to-menu">'; echo '<input type="submit"' . disabled(1, 0) . ' class="button-secondary submit-add-to-menu right" value="' . __('Add to Menu') . '" name="add-posttype-archive-menu-item" id="submit-posttype-archive" />'; echo '<span class="spinner"></span>'; echo '</span>'; echo '</p>'; endif; }
감사해요.
Rasmussvanejensen의 훌륭한 질문과 thangtran의 답변 덕분에 Wordpress가 코드베이스에 이렇게 좋은 기능을 아직 추가하지 않은 이유를 아직도 모르겠다.
그런데 thangtran이 제공하는 솔루션보다 더 좋은 솔루션이 있다고 생각합니다.상황에 따라서는 고장날 수도 있기 때문입니다.
주 1
Codex에 따르면 register_post_type을 사용하여 추가 가능post_type를 인스톨 합니다.누군가가 'query_var'를 변경해야 하므로 제공된 코드가 끊어질 수 있습니다.
주 2
또, 이 기능은, 다음과 같이 처리되지 않는 경우가 있습니다.current-menu-itemcss 커스터마이즈에 사용되며 메뉴 항목이 활성화되어 있습니다.
주 3
코드의 다른 참고사항으로, 이 코드를 정의할 필요가 없습니다.loop_index,item그리고.items변수입니다.전혀 쓸모없는 것들이죠.
보다 나은 솔루션
이에 대해 보다 강력한 솔루션을 원하는 사용자에게 이 대안을 사용할 것을 권장합니다.
function prefix_add_metabox_menu_posttype_archive(){
add_meta_box( 'prefix_metabox_menu_posttype_archive', __( 'Archives' ), 'prefix_metabox_menu_posttype_archive', 'nav-menus', 'side', 'default' );
}
add_action( 'admin_head-nav-menus.php', 'prefix_add_metabox_menu_posttype_archive' );
function prefix_metabox_menu_posttype_archive(){
$post_types = get_post_types( array( 'show_in_nav_menus' => true, 'has_archive' => true ), 'object' );
if( $post_types ){
foreach( $post_types as $post_type ){
$post_type->classes = array( $post_type->name );
$post_type->type = $post_type->name;
$post_type->object_id = $post_type->name;
$post_type->title = $post_type->labels->name;
$post_type->object = 'cpt_archive';
}
$walker = new Walker_Nav_Menu_Checklist( array() );?>
<div id="cpt-archive" class="posttypediv">
<div id="tabs-panel-cpt-archive" class="tabs-panel tabs-panel-active">
<ul id="ctp-archive-checklist" class="categorychecklist form-no-clear"><?php
echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', $post_types ), 0, (object) array( 'walker' => $walker ) );?>
</ul>
</div>
</div>
<p class="button-controls">
<span class="add-to-menu">
<input type="submit"<?php disabled( $nav_menu_selected_id, 0 ); ?> class="button-secondary submit-add-to-menu" value="<?php esc_attr_e( 'Add to Menu' ); ?>" name="add-ctp-archive-menu-item" id="submit-cpt-archive" />
</span>
</p><?php
}
}
function prefix_cpt_archive_menu_filter( $items, $menu, $args ){
foreach( $items as &$item ){
if( $item->object != 'cpt_archive' ) continue;
$item->url = get_post_type_archive_link( $item->type );
if( get_query_var( 'post_type' ) == $item->type ){
$item->classes []= 'current-menu-item';
$item->current = true;
}
}
return $items;
}
add_filter( 'wp_get_nav_menu_items', 'prefix_cpt_archive_menu_filter', 10, 3 );
[어피아란스]> [메뉴]로 이동합니다.
[화면 옵션]에서 Works의 커스텀 투고 타입이 선택되어 있는 것을 확인합니다.
커스텀 투고 타입의 이름을 클릭하여 전개하고 나서, 「모두 표시」탭을 클릭합니다.
[ All Works ](모든 작업) 옵션이 표시됩니다.옆에 있는 상자를 켜고 [메뉴에 추가]
커스텀 투고 타입의 아카이브가 메뉴 항목으로서 오른쪽 열에 표시됩니다.
기본적으로 라벨은 "All Works"입니다.네비게이션 라벨에 다른 내용을 기입하여 변경할 수 있습니다.
[ Save Menu ](메뉴 저장) 버튼을 클릭하여 변경 내용을 저장합니다.
GitHub에 만 하면 할 수 .functions.php산책이나 추가 수업 없이요
이 코드는 현재 포스트 타입의 슬래그를 내비게이션 아이템과 비교하여 해결하고 그에 따라 클래스를 추가합니다.
언급URL : https://stackoverflow.com/questions/20879401/how-to-add-custom-post-type-archive-to-menu
'programing' 카테고리의 다른 글
| Angularjs를 사용하여 로컬 스토리지에 데이터를 저장하는 방법은 무엇입니까? (0) | 2023.03.25 |
|---|---|
| angularjs에서 inside select box 옵션을 ng-translate하는 방법 (0) | 2023.03.25 |
| jQuery UI 날짜 선택기 - 수집되지 않은 유형 오류: 정의되지 않은 속성 'msie'를 읽을 수 없습니다. (0) | 2023.03.25 |
| angular.json으로 구성을 확장하는 방법이 있습니까? (0) | 2023.03.25 |
| ngResource에 비해 Resangular를 사용하는 이점은 무엇입니까? (0) | 2023.03.25 |