Bir arşiv sayfası için özel gönderi türü bilgi alın


15

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:


19

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

1
Bence (test etmemişti) get_queried_object()daha az hamlede aynı bilgiye ulaşacaktı.
Rarst

@Rarst Belki, ama önerdiğim kodun anlaşılması daha kolay olduğunu düşünüyorum.
fuxia

1
Toscho'nun çözümleri yanlıştır, çünkü get_post_type geçerli sayfanın yazı tipini döndürür ve arşiv sayfasına girdiğinizde bu işlev her zaman "sayfa" döndürür. Aynı şeyi çözmek için uğraşıyorum: 'Kitapların' arşiv sayfasına girdiğimde (4 örnek), şunu istiyorum: 'kitaplar'. Onu aldığımda postalayacağım.
eMarine

1
ne yazık ki o kadar basit değil, sadece daha iyi olsanız da $posttype = get_query_var('post_type');... Kapsamlı bir alternatif ekledim.
majick

Bence bu cevap tüm hikayeyi kapsıyor. Yeniden yazma kurallarını, birçok filtre (woocommerce mağaza sayfası gibi) değişiklik yaptığı için kontrol etmelisiniz. Bunun yerine Worpdress kendi mekanizmasını kullanın , cevabımı aşağıda bir yere bakın.
Jonas Lundman

6

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.


Bunu denediğimde aldımNotice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
patrickzdb

bu yalnızca yeniden yazma bilgi kaydı kayıtlı CPT için ayarlanmışsa çalışır, çünkü isteğe bağlıdır ve varsayılan olarak post_type
majick

@ Majick'i yakaladığınız için teşekkürler! Yayını bilgilerinizi yansıtacak şekilde güncelledim.
Jerry

bu buzdağının ucu oldu ... sualtı kısmı için yeni cevabımı kontrol :-)
majick

3

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.


Bu çok net oldu teşekkür ederim. Bu çözümü arıyordu. Eğer soru "sadece yazı tipi ismi" aramıyorsa, bu cevapsız cevap olmalıdır.
Jonas Lundman

1

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_carsve yeniden yazma carsbilginiz 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_archivedoğ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_queryya meta_queryiç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 postbir thumbtype-postsınıf niteliği ekleyin ...


0

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


Bunun $queried_object->query_var['post_type'];çalışması için gerekiyor ...
majick

$ Queried_object-> query_var yalnızca yazı tipi dizesini içerir. nesne veya dizi değil. Şu resme bakın: prntscr.com/bd58e1
Guy Ytzhak

Tamam, ancak yalnızca sorgulanan nesne kesinlikle özel bir yazı tipi nesnesiyse, örneğin kategori / vergi / etiket / yazar arşiv sayfaları için farklı bir karşılık gelen nesne ve dolayısıyla boş bir değer elde edersiniz. ?post_type=postboş olduğum için bile . ile karşılaştırget_query_var('post_type');
majick 06

0

Bu kodu kullanabilirsiniz ve bu kod benim için çalışıyor,

 $ t_slug = get_query_var ('terim');

-3
if( get_post_type( get_the_ID() ) == 'projects' )
{
  //enter code for this post type
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.