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

时间:2012-10-07 作者:Ben Everard

当我在存档页面上时,如何发现自定义的帖子类型slug?

例如,如果/products/ 激发archive-products.php 模板,我如何(实际地)得到post-type-slug?

谢谢

7 个回复
SO网友:fuxia

要获取当前帖子类型,请使用get_post_type(). 然后询问get_post_type_object() 对于所有需要的数据,例如slug:

$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;
}

SO网友:Jerry

我在档案馆的循环之外使用这个。php模板,以获取我使用的自定义后期存档。

这是@toscho和@Rarst推荐的方法的组合:

$post_type = get_queried_object();
echo $post_type->rewrite[\'slug\'];
更新:@majick指出,只有在为CPT设置了重写段塞时,这才有效。注册CPT时,重写slug是可选的,如果未设置,则默认为post\\U类型。

SO网友:cavameta

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

获取用于archive page

如果你是说post type archive 登录页,以及何时is_post_type_archive() 退货true, 你想让子弹current 查看存档文件:

/* 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);
--回答问题结束--

Explanation:

你不能依赖注册的slug。Wordpress也不是。例如,调用时get_post_type_archive_link() Wordpress正在检查current rewrite rules 为您的install .

无论您身在何处,在循环内部或外部,当前存档或单个帖子,reverse 这个get_post_type_archive_link() 机械装置(已启用永久链接。)

Considerations:

如本文所述,中的职位类型current query 可以是array. 你可以更进一步your intensions 使用筛选出您要查找的帖子类型,例如:

$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];

Another point of view:

Woocommerce示例使用“products”post类型对象注册,但实际上使用重写的规则名称(商店):

/* returns shop */
$responding_name = str_replace(\'/\', \'\', str_replace(get_home_url(), \'\', get_post_type_archive_link(\'product\')));
标记,Im使用$responding_name, 因为目标可能会有所不同。后期存档不存在,它只是一个url。

SO网友:Navin Bhudiya

你可以使用这个代码,这个代码对我有用,

 $t_slug = get_query_var(\'term\');

SO网友:majick

应注意,如果has_archive 注册自定义帖子类型、帖子类型存档时设置为true/cptslug/ 将内部重写为?post_type=cptslug. 所以这也意味着is_post_type_archive() 将返回true。

不幸的是,当注册的重写段塞与post类型不同时,您实际上无法可靠地获得post_type. 如果你的帖子类型是myplugin_cars 你的重写弹头是cars 你需要myplugin_cars 即使这样(如果当前查询的对象不是自定义post类型,为了防止出错),仍然会失败:

$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_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
}
这将是可靠的(我说过吗?)如果存在多个post类型,则返回一个post类型数组;如果只有一种类型,则返回一个具有单个post类型的字符串。您需要做的只是:

$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 将属性设置为帖子缩略图。。。

SO网友:Guy Ytzhak

您可以使用以下代码:

$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;
根据需要使用$posttype\\u slug var

SO网友:subair
if( get_post_type( get_the_ID() ) == \'projects\' )
{
  //enter code for this post type
}
结束

相关推荐

显示Archives.php中的所有自定义帖子类型

我该怎么做?archive.php 只有以下内容:wp_get_archives(\'type=monthly\'); 以及wp_get_archives() 没有显示所有帖子类型的参数。我也认为archive-[post_type].php 不是我要找的,因为我希望所有帖子类型都显示在一个归档页面中。谢谢W

获取存档页面的自定义帖子类型插件 - 小码农CODE - 行之有效找到问题解决它

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

时间:2012-10-07 作者:Ben Everard

当我在存档页面上时,如何发现自定义的帖子类型slug?

例如,如果/products/ 激发archive-products.php 模板,我如何(实际地)得到post-type-slug?

谢谢

7 个回复
SO网友:fuxia

要获取当前帖子类型,请使用get_post_type(). 然后询问get_post_type_object() 对于所有需要的数据,例如slug:

$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;
}

SO网友:Jerry

我在档案馆的循环之外使用这个。php模板,以获取我使用的自定义后期存档。

这是@toscho和@Rarst推荐的方法的组合:

$post_type = get_queried_object();
echo $post_type->rewrite[\'slug\'];
更新:@majick指出,只有在为CPT设置了重写段塞时,这才有效。注册CPT时,重写slug是可选的,如果未设置,则默认为post\\U类型。

SO网友:cavameta

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

获取用于archive page

如果你是说post type archive 登录页,以及何时is_post_type_archive() 退货true, 你想让子弹current 查看存档文件:

/* 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);
--回答问题结束--

Explanation:

你不能依赖注册的slug。Wordpress也不是。例如,调用时get_post_type_archive_link() Wordpress正在检查current rewrite rules 为您的install .

无论您身在何处,在循环内部或外部,当前存档或单个帖子,reverse 这个get_post_type_archive_link() 机械装置(已启用永久链接。)

Considerations:

如本文所述,中的职位类型current query 可以是array. 你可以更进一步your intensions 使用筛选出您要查找的帖子类型,例如:

$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];

Another point of view:

Woocommerce示例使用“products”post类型对象注册,但实际上使用重写的规则名称(商店):

/* returns shop */
$responding_name = str_replace(\'/\', \'\', str_replace(get_home_url(), \'\', get_post_type_archive_link(\'product\')));
标记,Im使用$responding_name, 因为目标可能会有所不同。后期存档不存在,它只是一个url。

SO网友:Navin Bhudiya

你可以使用这个代码,这个代码对我有用,

 $t_slug = get_query_var(\'term\');

SO网友:majick

应注意,如果has_archive 注册自定义帖子类型、帖子类型存档时设置为true/cptslug/ 将内部重写为?post_type=cptslug. 所以这也意味着is_post_type_archive() 将返回true。

不幸的是,当注册的重写段塞与post类型不同时,您实际上无法可靠地获得post_type. 如果你的帖子类型是myplugin_cars 你的重写弹头是cars 你需要myplugin_cars 即使这样(如果当前查询的对象不是自定义post类型,为了防止出错),仍然会失败:

$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_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
}
这将是可靠的(我说过吗?)如果存在多个post类型,则返回一个post类型数组;如果只有一种类型,则返回一个具有单个post类型的字符串。您需要做的只是:

$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 将属性设置为帖子缩略图。。。

SO网友:Guy Ytzhak

您可以使用以下代码:

$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;
根据需要使用$posttype\\u slug var

SO网友:subair
if( get_post_type( get_the_ID() ) == \'projects\' )
{
  //enter code for this post type
}

相关推荐

Display an archives name

我想显示当前存档文件的名称,因此对于下面的url,我可以这样做<h1><?php echo \"answer\" ?></h1> 输出如下内容<h1>News</h1> 或者更好<h1>News: supplierName</h1> http://www.site.com/suppliers/news/?supplierstax=supplierName