programing

메뉴에 사용자 지정 게시 유형 보관을 추가하는 방법

subpage 2023. 3. 25. 11:06
반응형

메뉴에 사용자 지정 게시 유형 보관을 추가하는 방법

나는 몇 주 동안 이 문제에 대한 적절한 해결책을 찾지 못했다.

워드프레스 테마를 쓰고 있어요.작업이라고 하는 커스텀 투고 타입이 있습니다.메뉴에 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산책이나 추가 수업 없이요

이 코드는 현재 포스트 타입의 슬래그를 내비게이션 아이템과 비교하여 해결하고 그에 따라 클래스를 추가합니다.

GitHub의 코드

언급URL : https://stackoverflow.com/questions/20879401/how-to-add-custom-post-type-archive-to-menu

반응형