반응형
재작성이 있는 동일한 슬러그를 사용하는 사용자 지정 게시물 유형 및 분류법
WordPress rewrite 규칙으로 작업하는 것은 이번이 처음이니 참고해 주시기 바랍니다.문제는 제가 포트폴리오에 추가하는 모든 항목이 여러 개의 카테고리를 가지고 있다는 것입니다.포트폴리오 게시물을 표시할 때 url에서 카테고리를 삭제하고 싶습니다.
site.com/portfolio
-> 작품
site.com/portfolio/category/
-> 작품
site.com/portfolio/category/post-added-to-portfolio/
-> 효과는 있지만 저는 원하지 않습니다.
site.com/portfolio/post-added-to-portfolio/
-> 작동하지 않지만 작동해야 합니다.
/* Post Type: Portfolio */
$labels = array(
"name" => __( "Portfolio", "" ),
"singular_name" => __( "Portfolio", "" ),
);
$args = array(
"label" => __( "Portfolio", "" ),
"labels" => $labels,
"description" => "",
"public" => true,
"publicly_queryable" => true,
"show_ui" => true,
"show_in_rest" => false,
"rest_base" => "",
"has_archive" => "portfolio",
"show_in_menu" => true,
"exclude_from_search" => false,
"capability_type" => "post",
"map_meta_cap" => true,
"hierarchical" => true,
"rewrite" => array( "slug" => "portfolio", "with_front" => true ),
"query_var" => true,
"supports" => array( "title", "editor" ),
"taxonomies" => array( "services" ),
);
register_post_type( "portfolio", $args );
/* Taxonomy: Services */
$labels = array(
"name" => __( "Services", "" ),
"singular_name" => __( "Service", "" ),
);
$args = array(
"label" => __( "Services", "" ),
"labels" => $labels,
"public" => true,
"hierarchical" => true,
"label" => "Services",
"show_ui" => true,
"show_in_menu" => true,
"show_in_nav_menus" => true,
"query_var" => true,
"rewrite" => array( 'slug' => 'portfolio', 'with_front' => true, ),
"show_admin_column" => false,
"show_in_rest" => false,
"rest_base" => "",
"show_in_quick_edit" => false,
);
register_taxonomy( "services", array( "portfolio" ), $args );
// handle redirects for taxonomy
add_action('generate_rewrite_rules', 'generate_taxonomy_rewrite_rules');
function generate_taxonomy_rewrite_rules( $wp_rewrite ) {
$rules = array();
$post_types = get_post_types( array( 'name' => 'portfolio', 'public' => true, '_builtin' => false ), 'objects' );
$taxonomies = get_taxonomies( array( 'name' => 'services', 'public' => true, '_builtin' => false ), 'objects' );
foreach ( $post_types as $post_type ) {
$post_type_name = $post_type->name;
$post_type_slug = $post_type->rewrite['slug'];
foreach ( $taxonomies as $taxonomy ) {
if ( $taxonomy->object_type[0] == $post_type_name ) {
$terms = get_categories( array( 'type' => $post_type_name, 'taxonomy' => $taxonomy->name, 'hide_empty' => 0 ) );
foreach ( $terms as $term ) {
$rules[$post_type_slug . '/' . $term->slug . '/?$'] = 'index.php?' . $term->taxonomy . '=' . $term->slug;
$rules[$post_type_slug . '/' . $term->slug . '/page/?([0-9]{1,})/?$'] = 'index.php?' . $term->taxonomy . '=' . $term->slug . '&paged=' . $wp_rewrite->preg_index( 1 );
}
}
}
}
$wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
저는 일주일 동안 이 문제를 해결했습니다.저는 포스트 타입을 그대로 유지했습니다.교체했습니다.generate_rewrite_rules
다음과 같은 기능을 합니다.
add_filter('request', 'setTermRequest', 1, 1 );
function setTermRequest($query){
$tax_name = 'services';
if( $query['attachment'] ) :
$include_children = true;
$name = $query['attachment'];
else:
$include_children = false;
$name = $query['name'];
endif;
$term = get_term_by('slug', $name, $tax_name); // get the current term to make sure it exists
if (isset($name) && $term && !is_wp_error($term)): // check it here
if( $include_children ) {
unset($query['attachment']);
$parent = $term->parent;
while( $parent ) {
$parent_term = get_term( $parent, $tax_name);
$name = $parent_term->slug . '/' . $name;
$parent = $parent_term->parent;
}
} else { unset($query['name']); }
switch( $tax_name ):
case 'category':{
$query['category_name'] = $name; // for categories
break;
}
case 'post_tag':{
$query['tag'] = $name; // for post tags
break;
}
default:{
$query[$tax_name] = $name; // for another taxonomies
break;
}
endswitch;
endif;
return $query;
}
add_filter( 'term_link', 'writeTermPerm', 10, 3 );
function writeTermPerm( $url, $term, $taxonomy ){
$taxonomy_name = 'services';
$taxonomy_slug = 'services';
if ( strpos($url, $taxonomy_slug) === FALSE || $taxonomy != $taxonomy_name ) return $url;
$url = str_replace('/'.$taxonomy_slug, '/portfolio', $url);
return $url;
}
그 후 url 구조를 수정한 후 나는 분류 체계 서비스에 다음 코드를 추가했습니다.시스템 전체를 하나의 파일로 제어하기 위해 php 문서.
locate_template( 'archive-portfolio.php', true );
언급URL : https://stackoverflow.com/questions/49807692/custom-post-type-and-taxonomy-using-same-slug-with-rewrite
반응형
'programing' 카테고리의 다른 글
pdo가 와일드카드로 준비한 문 (0) | 2023.09.18 |
---|---|
AJAX를 통해 비디오를 읽은 후 blob을 (0) | 2023.09.18 |
C의 동적 배열 — malloc과 realoc에 대한 제 이해가 맞습니까? (0) | 2023.09.18 |
약한 자아는 어디로 가는 거지? (0) | 2023.09.18 |
Oracle SQL: 열 이름이 지정된 테이블 이름을 어떻게 찾습니까? (0) | 2023.09.18 |