Bir arşiv sayfasındayken özel yazı türü bilgi sayfasını nasıl bulabilirim?
Örneğin /products/
, archive-products.php
şablonu başlatırsa, posta türü sümüğünü nasıl (pragmatik olarak) alabilirim?
Teşekkürler
Bir arşiv sayfasındayken özel yazı türü bilgi sayfasını nasıl bulabilirim?
Örneğin /products/
, archive-products.php
şablonu başlatırsa, posta türü sümüğünü nasıl (pragmatik olarak) alabilirim?
Teşekkürler
Yanıtlar:
Geçerli yazı türünü almak için kullanın get_post_type()
. Sonra get_post_type_object()
ihtiyacınız olan tüm verileri isteyin , örneğin 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;
}
$posttype = get_query_var('post_type');
... Kapsamlı bir alternatif ekledim.
Ben hangi özel yazı arşivi olduğum almak için archive.php şablonundaki döngü dışında bu kullanıyorum.
Hem @toscho hem de @Rarst'ın önerdiği yöntemlerin bir kombinasyonu:
$post_type = get_queried_object();
echo $post_type->rewrite['slug'];
Güncelleme: @majick, bunun sadece CPT'niz için yeniden yazma sümükünü ayarladıysanız işe yaradığını belirtti. CPT'yi kaydederken slug'ı yeniden yaz seçeneği isteğe bağlıdır ve ayarlanmadıysa varsayılan olarak post_type olarak ayarlanır.
Notice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
Cevaplar kafa karıştırıcı. Ve belki ben de öyleyim ama ana soru şu:
Özel yayın türü alın sümüklüböcek bir için arşiv sayfası
Yazı tipi arşiv açılış sayfasını kastediyorsanız ve is_post_type_archive()
geri döndüğünüzde true
, geçerli görüntüleme arşivine yanıt veren bilgi istemini istersiniz :
/* 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);
- SORU CEVAP SONU -
Açıklama:
Kayıtlı sülüklere güvenemezsiniz . Wordpress de değil. Örneğin, get_post_type_archive_link()
Wordpress çağrıldığında , yüklemeniz için geçerli yeniden yazma kurallarını kontrol ediyor .
Eğer içinde veya dışında döngü, şimdiki arşivi tek direkli olurlarsa olsunlar, tersget_post_type_archive_link()
mekanizma. (Kalıcı bağlantılar etkin.)
hususlar:
Burada belirtildiği gibi, geçerli sorgudaki yazı türleri bir olabilir array
. Aradığınız gönderi türünü filtreleyerek niyetlerinizle daha da fazla ilerleyebilirsiniz, örneğin:
$post_type = get_query_var('post_type');
if(is_array($post_type)) $post_type = reset($post_type);
veya
if(isset($post_types[0])) $post_type = $post_types[0];
Başka bir bakış açısı:
Woocommerce örneği, 'ürünler' posta türü nesnesiyle kaydedilir, ancak gerçekte yeniden yazılmış kural adı (mağaza) kullanır:
/* returns shop */
$responding_name = str_replace('/', '', str_replace(get_home_url(), '', get_post_type_archive_link('product')));
Mark, kullanıyorum
$responding_name
, çünkü hedefler değişebilir. Bir posta arşivi mevcut değil, sadece bir url.
t has_archive
Özel Yazı Tipi kaydedilirken true olarak ayarlanırsa, yazı tipi arşivinin /cptslug/
dahili olarak yeniden yazılacağı belirtilmelidir ?post_type=cptslug
. Yani bu aynı zamanda is_post_type_archive()
doğru döneceği anlamına da gelir .
Ne yazık ki, kayıtlı yeniden yazma sümüğü yazı türünden farklı olduğunda, aslında güvenilir bir şekilde elde edemezsiniz post_type
. Örneğin. posta türünüz myplugin_cars
ve yeniden yazma cars
bilginiz varsa ve bunu almanız gerekiyorsa myplugin_cars
(geçerli sorgulanan nesne özel bir yazı türü değilse hataları önlemek için ) yine de başarısız olacaktır:
$queryobject = get_queried_object();
if (has_property('rewrite',$queryobject)) {
if (isset($queryobject->rewrite['slug'])) {
$posttype = $queryobject->rewrite['slug'];
}
}
Ancak is_post_type_archive
doğru olduğu için bu daha güvenilirdir:
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';}
Ama durun, daha fazlası var ... küçük bir testle çıkıyor, o kadar da basit değil ... ya da sınıflandırmada birden çok yazı türüne sahip bir sınıflandırma arşivi sayfasındaysanız ..? Ya da yazı dışındaki özel bir yazı türüne posta etiketleri atamak mı istiyorsunuz? Yoksa bir yazar arşiv sayfasında mısınız? Tarih arşiv sayfası? ... ve hatta karmaşık olması tax_query
ya meta_query
için WP_Query
?
Tek güvenilir yanıt (olası her arşiv durumu için test yapmadan) sorgudaki gerçek yayınları döngüye sokmaktır ... Hem tekil hem de arşiv sayfalarında çalışmak için geldiğim tam işlev ve isteğe bağlı olarak bir özel sorgu nesnesi (veya tekil gönderiler için posta nesnesi / posta kimliği):
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
}
Bu, güvenilir bir şekilde (bunu söyledim mi?) Birden fazla varsa bir dizi yazı türü veya yalnızca bir tür varsa tek yazı türüne sahip bir dize döndürür. Tek yapmanız gereken:
$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);
Örnek Kullanım (sadece eğlence için):
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;
}
Efekti görmek için koddaki özel gönderi türünü olarak değiştirin ve gönderi küçük resimlerinize post
bir thumbtype-post
sınıf niteliği ekleyin ...
Bu kodu kullanabilirsiniz:
$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;
İhtiyacınız ne olursa olsun $ posttype_slug var kullanın
$queried_object->query_var['post_type'];
çalışması için gerekiyor ...
?post_type=post
boş olduğum için bile . ile karşılaştırget_query_var('post_type');
Bu kodu kullanabilirsiniz ve bu kod benim için çalışıyor,
$ t_slug = get_query_var ('terim');
get_queried_object()
daha az hamlede aynı bilgiye ulaşacaktı.