맞춤 게시물 유형, 분류 및 퍼머 링크


62

이것은 나를 미치게합니다. 단순하지만 내가 찾는 것은 간단한 구조를 제공하지 않습니다 (모든 것이 매우 복잡합니다).

맞춤 게시물 유형 product_listing과 맞춤 분류 체계가 있습니다 product_cat(계층 적이며 카테고리와 유사해야 함).

URL이 다음과 같이 표시되기를 원합니다.

mysite.com/products/category1/product-name1 
mysite.com/products/category2/product-name2

그러나 내 삶을 위해, 내가 무엇을하든 404 문제가 두려워지고 있습니다. 페이지는 정상적으로 작동하지만 게시물은 제대로 작동하지만 내 맞춤 게시물이 제대로 작동하지 않습니다. 그들은 다음과 같이 나타납니다.

mysite.com/products/product-name1
mysite.com/products/product-name2

실제로 작동합니다 ! 거기에 내 사용자 정의 분류 체계를보고 싶고 플러스 taxonomy.php로 이동하여 설정 한 템플릿 에 액세스 할 수 있기를 원합니다 .

mysite.com/products/category1/
mysite.com/products/category2/

내 슬러그 중 어느 것도 동일하지 않으며 내가 원하는 것도 아닙니다. 내 functions.php파일 의 게시물 유형과 분류 부분은 다음과 같습니다 .

///// CUSTOM POST TYPES /////

// register the new post type
register_post_type( 'product_listing', array( 
    'labels'                 => array(
        'name'               => __( 'Products' ),
        'singular_name'      => __( 'Product' ),
        'add_new'            => __( 'Add New' ),
        'add_new_item'       => __( 'Create New Product' ),
        'edit'               => __( 'Edit' ),
        'edit_item'          => __( 'Edit Product' ),
        'new_item'           => __( 'New Product' ),
        'view'               => __( 'View Products' ),
        'view_item'          => __( 'View Product' ),
        'search_items'       => __( 'Search Products' ),
        'not_found'          => __( 'No products found' ),
        'not_found_in_trash' => __( 'No products found in trash' ),
        'parent'             => __( 'Parent Product' ),
    ),
    'description'           => __( 'This is where you can create new products on your site.' ),
    'public'                => true,
    'show_ui'               => true,
    'capability_type'       => 'post',
    'publicly_queryable'    => true,
    'exclude_from_search'   => false,
    'menu_position'         => 2,
    'menu_icon'             => get_stylesheet_directory_uri() . '/images/tag_orange.png',
    'hierarchical'          => true,
    '_builtin'              => false, // It's a custom post type, not built in!
    'rewrite'               => array( 'slug' => 'products', 'with_front' => true ),
    'query_var'             => true,
    'supports'              => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
) );


//hook into the init action and call create_book_taxonomies when it fires
add_action( 'init', 'create_product_taxonomies', 0 );
//add_action('admin_init', 'flush_rewrite_rules');

//create two taxonomies, genres and writers for the post type "book"
function create_product_taxonomies() {
    // Add new taxonomy, make it hierarchical (like categories)
    $labels = array(
        'name'              => _x( 'Categories', 'taxonomy general name' ),
        'singular_name'     => _x( 'Category', 'taxonomy singular name' ),
        'search_items'      =>  __( 'Search Categories' ),
        'all_items'         => __( 'All Categories' ),
        'parent_item'       => __( 'Parent Categories' ),
        'parent_item_colon' => __( 'Parent Categories:' ),
        'edit_item'         => __( 'Edit Category' ), 
        'update_item'       => __( 'Update Category' ),
        'add_new_item'      => __( 'Add New Category' ),
        'new_item_name'     => __( 'New Category Name' ),
        'menu_name'         => __( 'Category' ),
    );  

    register_taxonomy( 'product_cat', array( 'product_listing' ), array(
        'hierarchical'  => true,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => true,
        'rewrite'       => array( 'slug' => '%category%', 'with_front' => true ),
    ) );

    // Add new taxonomy, NOT hierarchical (like tags)
    $labels = array(
        'name'                       => _x( 'Scents', 'taxonomy general name' ),
        'singular_name'              => _x( 'Scent', 'taxonomy singular name' ),
        'search_items'               =>  __( 'Search Scents' ),
        'popular_items'              => __( 'Popular Scents' ),
        'all_items'                  => __( 'All Scents' ),
        'parent_item'                => null,
        'parent_item_colon'          => null,
        'edit_item'                  => __( 'Edit Scent' ), 
        'update_item'                => __( 'Update Scent' ),
        'add_new_item'               => __( 'Add New Scent' ),
        'new_item_name'              => __( 'New Scent Name' ),
        'separate_items_with_commas' => __( 'Separate scents with commas' ),
        'add_or_remove_items'        => __( 'Add or remove scents' ),
        'choose_from_most_used'      => __( 'Choose from the most used scents' ),
        'menu_name'                  => __( 'Scents' ),
    ); 

    register_taxonomy( 'scent', 'product_listing', array(
        'hierarchical'  => false,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => array( 'slug' => 'scents' ),
    ) );
}

나는 또한 scents친절한 URL을 이상적으로 갖고 싶지만 이것에 대해 더 개방적이라는 또 다른 맞춤 분류법 을 가지고 있습니다. 가면서 모든 향기 목록에 액세스하고 싶을 수도 mysite.com/products/scents있지만 카테고리별로 다를 필요는 없습니다.

아무도 나를 도울 수 있습니까?

답변:


63

변경 slug에 게시물의 형태 인수에 products/%product_cat%, 및 slug분류 체계의 인수는합니다 products, 다음 재 작성 규칙을 세척하십시오. 이제 워드 프레스가 처리해야합니다 /products/my-product-cat/post-name/!

이제 마지막으로 permalinks를 생성하여 WordPress에 약간의 도움이 필요합니다 (기본적으로 permastruct 태그를 인식하지 못합니다 %product_cat%).

/**
 * Inject term slug into custom post type permastruct.
 * 
 * @link   http://wordpress.stackexchange.com/a/5313/1685
 * 
 * @param  string  $link
 * @param  WP_Post $post 
 * @return array
 */
function wpse_5308_post_type_link( $link, $post ) {
    if ( $post->post_type === 'product_listing' ) {
        if ( $terms = get_the_terms( $post->ID, 'product_cat' ) )
            $link = str_replace( '%product_cat%', current( $terms )->slug, $link );
    }

    return $link;
}

add_filter( 'post_type_link', 'wpse_5308_post_type_link', 10, 2 );

한 가지 주목할 점 은 name으로 주문 된 게시물의 첫 번째 제품 카테고리를 가져옵니다 . 단일 제품에 여러 범주를 할당하는 경우 영구 링크에서 사용할 범주를 결정하는 방법을 쉽게 변경할 수 있습니다.

Lemme는이 문제를 해결하는 방법을 알고 있으며 다른 문제를 해결할 수 있습니다.


오, 겁나 네요! 이 작동했습니다! 드디어! 나는 아무것도 생각하지 않았다! !! SOOOOOO 많이 감사합니다 !!! ............ 이제 분류 URL을 자체적으로 가져 오는 링크 (_permalink와 같은 것)를 어떻게 생성합니까? / products / my-product-cat /
RodeoRamsey

나는 그것이 효과가 있다고 생각합니다 ^^^ ............ 지금은 페이지 매김에 붙어 있습니다. / products / my-product-cat /는 페이지 매김 (사용자 정의 함수 또는 내장)을 사용할 때 중단되는 것처럼 보이지만 / products / my-product-cat / page / 2 /는 404를 반환하고 taxonomy.php 파일을 index.php 파일을 선호합니다. 나는 찾을 수있는 모든 것을 시도했지만 여전히 아무것도 시도하지 않았습니다.
RodeoRamsey

1
단일 제품 재 작성을 다음으로 변경 하시겠습니까 product/cat-name/product-name? (단일성에 주목하십시오) 분류법 페이지 매김에 대한 재 작성 규칙은 단일 제품에 대한 이전 규칙에 의해 잡히기 때문에 트리거되지 않습니다!
TheDeadMedic

나는 그것에 열려 있습니다. 그러나 내 머리를 감싸기 위해 단일 제품 페이지와 '카테고리'페이지를 볼 경우 제품의 URL 경로가 다를 수 있습니까? 따라서 single은 product / cat-name / prod-name 이지만 cats는 products / cat-name / 입니까? 그런 종류의 "인간 친화적 인"URL의 목적을 무너 뜨리지 않습니까? 고객이 wp 대시 보드를 배우는 데 어려움을 겪고 있습니다. 그 차이는 물론 ... pls를 오해하는 경우 알려주세요! 또한 같은, NO 전면 디렉토리에 만족하실 수있는 제품 고양이 / 제품 남 그냥 제품 고양이 / . 작동 할 수 있습니까?
RodeoRamsey 2014

2
당신은 그것을 가지고 - 내가 말하고 싶지만 비록 입니다 아카이브 사이에 명확한 구분 (존재하는 한, "인간 친화적 인" products/)와 단일 항목 ( product/). 그리고 '프론트 디렉토리'를 유지합니다-게시물과 페이지를 명확하게 구분하는 데 도움이되며 성능 문제 (예 : 자세한 다시 쓰기 규칙)가 발생할 수 있습니다.
TheDeadMedic

6

감사합니다 @TheDeadMechanic, 귀하의 답변이 도움이되었지만 부분적으로 만 가능합니다. @RodeoRamsey가 요청한 것과 똑같은 일을하고 싶었지만 중첩 된 카테고리 (예 :)로 mysite.com/products/category1/child-category-1/grandchild-category-1/product-name솔루션이 작동하지 않았습니다.

나는 마침내 작동하는 내 질문에 대한 확장 된 솔루션을 생각해 냈으므로 다른 사람이 중첩 된 범주 / 하위 범주가 필요하면 내 질문에 대한 자세한 솔루션 을 볼 수 있습니다 . 그것이 다른 사람들을 돕기를 바랍니다. 초기 단계에 감사드립니다.


4

나는 wp가 즉시 그 구조를 지원하는지 확실하지 않지만 그렇게하기 위해 자신의 재 작성 규칙을 매우 쉽게 만들 수 있습니다.

이전 답변을 확인하십시오. Author url rewrite .

라인을 변경할 수 있습니다

$newrules['author/([^/]+)/songs/?$'] = 'index.php?post_type=songs&author=$matches[1]';

같은 것에

$newrules['products/([^/]+)/([^/]+)/?$'] = 'index.php?post_type=product_listing&product_cat=$matches[1]&name=$matches[2]';

여기 product_cat 부분은 불필요한 것일 수 있습니다. 필요한지 확실하지 않습니다.

원하는 규칙을 추가 할 수 있으며 내장 규칙보다 우선 순위가 높습니다.


그다지 흥미롭지 않습니다. 오, 커스텀 재 작성 규칙은 저쪽에 있다고 생각합니다. 위의 코드 (및 다른 게시물에서 나머지 코드)를 시도했지만 아무것도 변경되지 않았습니다. 나는 모든 것을 플러시 한 다음 다시 시도했지만 여전히 변경 사항이 없으므로 사용자 정의 게시물 유형 및 분류법에 설정된 모든 다시 쓰기 규칙을 주석 처리하고 아무것도 플러시했습니다.
RodeoRamsey

2

예, 맞춤 게시물 유형에 대한 영구 링크를 설정하기 전에 나를 미치게했습니다. 맞춤 게시물 유형을 처리하는 플러그인을 찾았습니다. 사용하기 매우 쉽습니다. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP는 이것을 핵심 기능으로 추가해야합니다! 사자 별자리


나는 이것을 전에 보았고 "계층 적이 지 않은"분류법이라고 말했기 때문에 그것을 사용하지 않았다. 나는 그것이 계층 구조로 설정된 것을 가지고 있었기 때문에 그것이 효과가 있다고 생각하지 않았지만, 지금까지는 트릭을 수행 한 것 같습니다! 또한 달성하려는 / products / cat-name / prod-name / 구조를 달성하기 위해 노력하고있는 것 같습니다 (다른 답변에 대한 의견 참조). @TheDeadMedic, 이것이 가능한 옵션입니까? 아니면 functions.php 파일의 다시 쓰기를 고수해야합니까?
RodeoRamsey

0

실제로는 매우 쉽습니다. 한 줄만 있으면됩니다. 여기 내 코드가 있습니다

create_product_taxonomies () 함수
{
// 새로운 분류 체계를 추가하고 범주와 같은 계층 구조로 만듭니다.
    $ labels = 배열 ​​(
        'name'=> _x ( '카테고리', 'taxonomy 일반 이름'),
        'singular_name'=> _x ( '카테고리', 'taxonomy 단수 이름'),
        'search_items'=> __ ( '검색 카테고리'),
        'all_items'=> __ ( '모든 카테고리'),
        'parent_item'=> __ ( '부모 범주'),
        'parent_item_colon'=> __ ( '부모 범주 :'),
        'edit_item'=> __ ( '카테고리 편집'),
        'update_item'=> __ ( '업데이트 카테고리'),
        'add_new_item'=> __ ( '새 카테고리 추가'),
        'new_item_name'=> __ ( '새 카테고리 이름'),
        'menu_name'=> __ ( '카테고리'),
    );

    register_taxonomy ( 'product_cat', array ( 'product_listing'), array (
        'hierarchical'=> true,
        'labels'=> $ labels,
        'show_ui'=> true,
        'query_var'=> true,
        'rewrite'=> 배열 ( 'hierarchical'=> true),
    ));

그리고 GenerateWP.com에서 내 리뷰 CPT에 대해 생성 된 분류에 적용되었습니다. 내 자신의 WordPress 사이트 https://www.wpstarters.com 에서 이것을 사용하고 있습니다.

함수 리뷰 _category_taxonomy () {

    $ labels = 배열 ​​(
        'name'=> _x ( '리뷰 카테고리', 'Taxonomy 일반 이름', 'reviews_category'),
        'singular_name'=> _x ( '검토 카테고리', 'Taxonomy 단수 이름', 'reviews_category'),
        'menu_name'=> __ ( '리뷰 카테고리', 'reviews_category'),
        'all_items'=> __ ( '모든 검토 범주', 'reviews_category'),
        'parent_item'=> __ ( '부모 리뷰 카테고리', 'reviews_category'),
        'parent_item_colon'=> __ ( '부모 리뷰 카테고리 :', 'reviews_category'),
        'new_item_name'=> __ ( 'New Review Category Name', 'reviews_category'),
        'add_new_item'=> __ ( '새 리뷰 카테고리 추가', 'reviews_category'),
        'edit_item'=> __ ( '검토 카테고리 편집', 'reviews_category'),
        'update_item'=> __ ( '업데이트 검토 범주', 'reviews_category'),
        'view_item'=> __ ( '리뷰 카테고리보기', 'reviews_category'),
        'separate_items_with_commas'=> __ ( '쉼표가있는 개별 항목', 'reviews_category'),
        'add_or_remove_items'=> __ ( '항목 추가 또는 제거', 'reviews_category'),
        'choose_from_most_used'=> __ ( '가장 많이 사용 된 것을 선택하십시오', 'reviews_category'),
        'popular_items'=> __ ( '인기 리뷰 카테고리', 'reviews_category'),
        'search_items'=> __ ( '검색 항목', 'reviews_category'),
        'not_found'=> __ ( '찾을 수 없음', 'reviews_category'),
        'no_terms'=> __ ( '리뷰 카테고리 없음', 'reviews_category'),
        'items_list'=> __ ( '리뷰 카테고리 목록', 'reviews_category'),
        'items_list_navigation'=> __ ( '검토 카테고리 목록 탐색', 'reviews_category'),
    );
    $ args = 배열 ​​(
        'labels'=> $ labels,
        'hierarchical'=> true,
        'public'=> true,
        'show_ui'=> true,
        'show_admin_column'=> true,
        'show_in_nav_menus'=> true,
        'show_tagcloud'=> 거짓,
        'show_in_rest'=> true,
        'rewrite'=> array ( 'hierarchical'=> true),
    );
    register_taxonomy ( 'reviews_category', array ( 'wps_reviews'), $ args);

}
add_action ( 'init', 'reviews_category_taxonomy', 0);

필요한 것은 'rewrite'=> array ( 'hierarchical'=> true)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.