답변:
현재 게시물 유형을 얻으려면을 사용하십시오 get_post_type()
. 그런 다음 get_post_type_object()
슬러그와 같이 필요한 모든 데이터를 요청 하십시오.
$post_type = get_post_type();
if ( $post_type )
{
$post_type_data = get_post_type_object( $post_type );
$post_type_slug = $post_type_data->rewrite['slug'];
echo $post_type_slug;
}
$posttype = get_query_var('post_type');
...
나는 어떤 사용자 정의 포스트 아카이브를 얻기 위해 archive.php 템플릿의 루프 외부에서 이것을 사용하고 있습니다.
@toscho와 @Rarst가 권장하는 메소드의 조합입니다.
$post_type = get_queried_object();
echo $post_type->rewrite['slug'];
업데이트 : @majick은 CPT에 다시 쓰기 슬러그를 설정 한 경우에만 작동한다고 지적했습니다. CPT를 등록 할 때 재 작성 슬러그는 선택 사항이며 설정되지 않은 경우 기본값은 post_type입니다.
Notice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
대답이 혼란스러워집니다. 그리고 아마도 Im이지만 헤드 라인 질문은 다음과 같습니다.
보관 페이지에 대한 사용자 정의 게시물 유형 슬러그 가져 오기
만약 당신이 평균 포스트 형 아카이브 랜딩 페이지, 때 is_post_type_archive()
반환 true
, 당신이 responing하는 슬러그하려면 현재 보기 아카이브 :
/* returns /products/ */
$responding_name = str_replace(get_home_url(), '', get_post_type_archive_link(get_query_var('post_type')));
/* continue to get 'products' without slug slashes */
$responding_name = str_replace('/', '', $responding_name);
-질문에 대한 답변의 끝-
설명:
등록 된 슬러그 에 의존 할 수 없습니다 . 워드 프레스도 아닙니다. 예를 들어 get_post_type_archive_link()
Wordpress를 호출 할 때 설치에 대한 현재 다시 쓰기 규칙 을 확인합니다 .
내부 또는 외부 루프의 현재 보관소 또는 단일 게시물에 관계 없이 메커니즘을 되돌get_post_type_archive_link()
립니다. (퍼머 링크가 활성화되었습니다.)
고려 사항 :
여기에서 언급 한 것처럼 현재 쿼리 의 게시물 유형 은 일 수 있습니다 array
. 원하는 게시물 유형을 필터링 하여 강도 를 더 높일 수 있습니다 . 예를 들면 다음과 같습니다.
$post_type = get_query_var('post_type');
if(is_array($post_type)) $post_type = reset($post_type);
또는
if(isset($post_types[0])) $post_type = $post_types[0];
다른 관점 :
Woocommerce 예제는 'products'포스트 유형 오브젝트에 등록되었지만 실제로는 다시 작성된 규칙 이름 (shop)을 사용합니다.
/* returns shop */
$responding_name = str_replace('/', '', str_replace(get_home_url(), '', get_post_type_archive_link('product')));
$responding_name
목표는 다를 수 있으므로 Mark, Im 사용 중입니다. 게시물 아카이브는 존재하지 않으며 URL 만 있습니다.
t이 경우 주목해야한다 has_archive
사용자 정의 포스트 유형을 등록하는 동안 true로 설정되어, 포스트 유형의 아카이브가 /cptslug/
내부적으로 다시 작성됩니다 ?post_type=cptslug
. 따라서 이것은 또한 is_post_type_archive()
true를 반환 한다는 의미 입니다.
불행히도 등록 된 재 작성 슬러그가 게시물 유형과 다른 경우 실제로는 실제로을 얻는 것이 아닙니다 post_type
. 예. 게시물 유형이었고 myplugin_cars
다시 쓰기 슬러그가 cars
있고 myplugin_cars
이것을 가져와야하는 경우 (현재 쿼리 된 객체가 사용자 정의 게시물 유형 이 아닌 경우 오류를 방지하기 위해 ) 여전히 실패합니다.
$queryobject = get_queried_object();
if (has_property('rewrite',$queryobject)) {
if (isset($queryobject->rewrite['slug'])) {
$posttype = $queryobject->rewrite['slug'];
}
}
그러나 is_post_type_archive
이것이 사실 이기 때문에 더 안정적입니다.
if (is_post_type_archive()) {
$posttype = get_query_var('post_type');
// which is basically the same as:
// global $wp_query;
// $posttype = $wp_query->query_vars['post_type'];
}
else ($posttype = 'post';}
그러나 잠깐만 요, 더 많은 것이 있습니다 ... 약간의 테스트로 밝혀졌습니다. 실제로 그렇게 간단하지는 않습니다 ... 분류에 여러 게시물 유형이있는 분류 아카이브 페이지에 있다면 어떻게해야합니까? 또는 게시물 이외의 사용자 정의 게시물 유형에 게시물 태그를 할당 하시겠습니까? 아니면 저자 보관 페이지에 있습니까? 날짜 보관 페이지? ... 또는 복잡한이 tax_query
나 meta_query
위해를 WP_Query
?
가능한 모든 보관 사례를 테스트하지 않고 신뢰할 수있는 유일한 대답은 쿼리에서 실제 게시물을 반복하는 것입니다. 단일 및 보관 페이지 모두에서 작업하고 선택적으로 전달할 수있는 전체 기능은 다음과 같습니다. 맞춤 검색어 개체 (또는 단일 게시물의 게시물 개체 / 게시 ID) :
function get_current_post_types($object=null) {
// if a numeric value passed, assume it is a post ID
if ( ($object) && (is_numeric($object)) ) {$object = get_post($object);}
// if an object is passed, assume to be a post object
if ( ($object) && (is_object($object)) ) {return get_post_type($object);}
// standard single post type checks
if (is_404()) {return '';}
// update: removed this check, handled by is_singular
// if (is_single()) {return 'post';}
if (is_page()) {return 'page';}
if (is_attachment()) {return 'attachment';}
if (is_singular()) {return get_post_type();}
// if a custom query object was not passed, use $wp_query global
if ( (!$object) || (!is_object($object)) ) {
global $wp_query; $object = $wp_query;
}
if (!is_object($object)) {return '';} // should not fail
// if the post_type query var has been explicitly set
// (or implicitly set on the cpt via a has_archive redirect)
// ie. this is true for is_post_type_archive at least
// $vqueriedposttype = get_query_var('post_type'); // $wp_query only
if (property_exists($object,'query_vars')) {
$posttype = $object->query_vars['post_type'];
if ($posttype) {return $posttype;}
}
// handle all other cases by looping posts in query object
$posttypes = array();
if (method_exists($object,'found_posts')) {
if ($object->found_posts > 0) {
$queriedposts = $object->posts;
foreach ($queriedposts as $queriedpost) {
$posttype = $queriedpost->post_type;
if (!in_array($posttype,$posttypes)) {$posttypes[] = $posttype;}
}
if (count($posttypes == 1)) {return $posttypes[0];}
else {return $posttypes;}
}
}
return ''; // nothin to see here
}
이것은 확실하게 (내가 그렇게 말했습니까?) 하나 이상의 유형이있는 경우 게시물 유형의 배열을 반환하거나 하나의 유형이있는 경우 단일 게시물 유형의 문자열을 반환합니다. 당신이해야 할 일은 :
$posttypes = get_current_post_types();
// or pass a post ID
$posttypes = get_current_post_types($postid);
// or pass a post object
$posttypes = get_current_post_types($post);
// or pass a custom query - that has been run
$posttypes = get_current_post_types($query);
사용법 예 (재미있게) :
add_filter('the_posts','myplugin_fading_thumbnails',10,2);
function myplugin_fading_thumbnails($posts,$query) {
if (!is_archive()) {return $posts;}
$cptslug = 'myplugin_slug'; $dosomethingcool = false;
$posttypes = get_current_post_types($query);
if ( (is_array($posttypes)) && (in_array($cptslug,$posttypes)) ) {$dosomethingcool = true;}
elseif ($cptslug == $posttypes) {$dosomethingcool = true;}
if ($dosomethingcool) {
global $fadingthumbnails; $fadingthumbnails = $cptslug;
if (!has_action('wp_footer','myplugin_cpt_script')) {
add_action('wp_footer','myplugin_cpt_script');
}
}
function myplugin_cpt_script() {
global $fadingthumbnails;
echo "<script>var thumbnailclass = 'img.thumbtype-".$fadingthumbnails."';
function fadeoutthumbnails() {jQuery(thumbnailclass).fadeOut(3000,fadeinthumbnails);}
function fadeinthumbnails() {jQuery(thumbnailclass).fadeIn(3000,fadeoutthumbnails);}
jQuery(document).ready(function() {fadeoutthumbnails();});
</script>";
}
return $posts;
}
효과를 확인하려면 코드에서 사용자 정의 게시물 유형을로 변경하고 게시물 미리보기 이미지에 클래스 속성을 post
추가 thumbtype-post
하십시오.
이 코드를 사용할 수 있습니다 :
$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;
필요한 $ posttype_slug var를 사용하십시오.
$queried_object->query_var['post_type'];
작동하려면 ...
?post_type=post
비워도. 비교get_query_var('post_type');
get_queried_object()
적은 정보로 동일한 정보를 얻을 것이라고 생각 합니다.