Answers:
要获取当前帖子类型,请使用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
答案令人困惑。也许我也是,但标题问题是:
获取自定义后类型蛞蝓为存档页
如果您指的是帖子类型的存档登录页面,并且在is_post_type_archive()
返回时true
,则需要响应当前查看存档的提示:
/* 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);
-回答完-
说明:
你不能依靠注册的子弹。WordPress也不是。例如,当调用get_post_type_archive_link()
WordPress是检查当前重写规则为您安装。
无论您身在何处,无论是在内部循环还是外部循环,当前存档或单个帖子,都可以反转该get_post_type_archive_link()
机制。(启用了永久链接。)
注意事项:
如此处所述,当前查询中的帖子类型可以为array
。你可以去futher与你的内涵与过滤掉你看,例如职位类型:
$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示例已向“产品”帖子类型对象注册,但实际上使用重写的规则名称(商店):
/* returns shop */
$responding_name = str_replace('/', '', str_replace(get_home_url(), '', get_post_type_archive_link('product')));
标记为Im
$responding_name
,因为目标可能会有所不同。发布档案不存在,仅是一个URL。
应当注意,如果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
class属性添加到您的帖子缩略图中...
您可以使用以下代码:
$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');
您可以使用此代码,此代码对我有用,
$ t_slug = get_query_var('term');
get_queried_object()
将以更少的动作获得相同的信息。