アーカイブページを開いているときにカスタム投稿タイプのスラッグを見つけるにはどうすればよいですか。
たとえば、/products/
がarchive-products.php
テンプレートを起動した場合、どのように(実用的には)ポストタイプのスラッグを取得するのですか?
ありがとう
現在の投稿タイプを取得するには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;
}
私はこれをarchive.phpテンプレートのループの外側で使って、どのカスタム投稿アーカイブを使っているのかを取得しています。
@toschoと@Rarstの両方が推奨する方法の組み合わせです。
$post_type = get_queried_object();
echo $post_type->rewrite['slug'];
更新:@majickは、これはあなたがあなたのCPTに書き換えスラグを設定した場合にのみうまくいくと指摘した。スラッグ書き換えはCPTを登録するときはオプションで、設定されていない場合はデフォルトでpost_typeになります。
答えは混乱します。そしておそらくImもそうかもしれませんが、headline問題は次のとおりです。
アーカイブページのカスタム投稿タイプを取得する slug
post type archive landing-pageを意味していて、is_post_type_archive()
がtrue
を返したときは、current Viewing archiveに応答するスラッグが必要です。
/* 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は現在の書き換え規則のインストールをチェックしています。
どこにいても、ループの内側でも外側でも、現在のアーカイブでも単一の投稿でも、reverse _ 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')));
目標は異なる場合があるため、
$responding_name
を使用してマークしてください。投稿アーカイブは存在しません。ただのURLです。
カスタム投稿タイプの登録中にhas_archive
がtrueに設定されている場合、投稿タイプアーカイブ/cptslug/
は内部的に?post_type=cptslug
に書き換えられます。したがって、これはis_post_type_archive()
がtrueを返すことも意味します。
残念ながら、登録された書き換えスラッグが投稿タイプに対して 異なる の場合、実際にはpost_type
を確実に取得することはできません。例えば。あなたの投稿タイプがmyplugin_cars
で書き換えスラグがcars
で、myplugin_cars
を取得する必要がある場合でも、(現在の照会オブジェクトが not カスタム投稿タイプの場合のエラーを防ぐために)失敗します
$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
クラス属性を追加します。
このコードを使うことができます:
$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;
必要に応じて$ posttype_slug varを使用してください。
あなたはこのコードを使うことができ、このコードは私のために働いています、
$ t_slug = get_query_var( 'term');