获取存档页面的自定义帖子类型


Answers:


18

要获取当前帖子类型,请使用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;
}

1
我认为(未经测试)get_queried_object()将以更少的动作获得相同的信息。
腊斯特

@Rarst也许,但是我认为我建议的代码更容易理解。
福厦

1
Toscho的解决方案是错误的,因为get_post_type返回当前页面的发布类型,并且当您进入存档页面时,此函数总是返回“ page”。我正在努力解决以下问题:当我进入“书籍”的存档页面(4个示例)时,我想要这个:“书籍”。收到后,我会发布它。
eMarine 2013年

1
不幸的是,它并不是那么简单,尽管您会更好$posttype = get_query_var('post_type');……我已经添加了一个全面的替代方案。
majick

我不认为这是整个故事的答案。您应该检查安装重写规则,因为许多过滤器(例如woocommerce商店页面)都在进行更改。请改用Worpdress本身的机制,请在下面的位置查看我的答案。
乔纳斯·隆德曼

6

我在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
patrickzdb 2015年

这仅在为注册的CPT设置了重写段符
时才有效

感谢您抓住那个@majick!我已经更新了帖子以反映您的信息。
杰里(Jerry)

原来那是冰山一角...请检查我对水下部分的新答案:-)
majick

3

答案令人困惑。也许我也是,但标题问题是:

获取自定义后类型蛞蝓存档页

如果您指的是帖子类型的存档登录页面,并且在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。


这很清楚,谢谢。正在寻找这种解决方案。如果问题不是在“仅查找帖子类型名称”,那应该是一个烦恼的答案。
乔纳斯·隆德曼

1

应当注意,如果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_querymeta_queryWP_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-postclass属性添加到您的帖子缩略图中...


0

您可以使用以下代码:

$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;

根据需要使用$ posttype_slug var


它需要$queried_object->query_var['post_type'];这个才能起作用...
majick

否。$ queried_object-> query_var仅包含帖子类型的字符串。它不是对象或数组。看看这张图片:prntscr.com/bd58e1
Guy Ytzhak

好的,但是仅当所查询的对象绝对是自定义帖子类型的对象时,您才会获得不同的对应对象,因此,例如,类别/税/标签/作者存档页面的值为空。即使?post_type=post我变得空虚。与get_query_var('post_type');
majick


-3
if( get_post_type( get_the_ID() ) == 'projects' )
{
  //enter code for this post type
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.