アーカイブページのカスタム投稿タイプのスラッグを取得する


14

アーカイブページにいるときにカスタム投稿タイプのスラッグを見つけるにはどうすればよいですか?

たとえば/products/archive-products.phpテンプレートを起動する場合、どのように(実用的に)投稿タイプのスラッグを取得しますか?

ありがとう

回答:


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たぶん、しかし、私が提案したコードは理解しやすいと思います。
FUXIA

1
get_post_typeは現在のページの投稿タイプを返すため、Toschoのソリューションは間違っています。アーカイブページを開くと、この関数は常に「ページ」を返します。私は同じことを解決しようと努力しています:「本」のアーカイブページ(4つの例)にいるとき、「本」が欲しいです。入手したら投稿します。
eMarine

1
残念なことに、それほど単純ではありませんが、単に$posttype = get_query_var('post_type');...の方が良いでしょう。
majick

これはすべての話をカバーする答えだとは思いません。多くのフィルター(woocommerce shopページなど)が変更を行っているため、インストール書き換えルールを確認する必要があります。代わりWorpdress独自のメカニズムを使用して、以下のどこかで私の回答を参照してください。
ジョナスランドマン

6

archive.phpテンプレートのループの外側でこれを使用して、どのカスタム投稿アーカイブを取得しているかを確認しています。

@toschoと@Rarstの両方が推奨するメソッドの組み合わせです。

$post_type = get_queried_object();
echo $post_type->rewrite['slug'];

更新:@majickは、CPTの書き換えスラッグを設定した場合にのみ機能することを指摘しました。Rewrite slugはCPTの登録時にはオプションであり、設定されていない場合はデフォルトでpost_typeになります。


私はこれをしようとしたとき、私は得たNotice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
patrickzdb

これは、書き換えスラグが登録済みのCPTに設定されている場合にのみ機能します。これはオプションであり、デフォルトはpost_type
majick

@majickを見つけてくれてありがとう!あなたの情報を反映するために投稿を更新しました。
ジェリー

それは氷山の一角だったことが判明した...水中の部分についての私の新しい答えを確認してください:-)
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。あなたが探している投稿タイプを除外して、あなたの意図をさらに進めることができます、例えば:

$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」投稿タイプオブジェクトに登録されていますが、実際には書き換えられたルール名(ショップ)を使用します。

/* 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_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
}

これは、複数の投稿タイプが存在する場合、投稿タイプの配列を確実に返します(1つしか存在しない場合、単一の投稿タイプの文字列を返します)。あなたがする必要があるのは:

$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します...


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

0

このコードを使用することができ、このコードは私のために働いています、

 $ t_slug = get_query_var( 'term');

-3
if( get_post_type( get_the_ID() ) == 'projects' )
{
  //enter code for this post type
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.