Dapatkan siput jenis posting khusus untuk halaman arsip

14

Bagaimana cara menemukan siput jenis pos khusus ketika saya berada di halaman arsip?

Misalnya jika /products/menyalakanarchive-products.php template, bagaimana (secara pragmatis) cara saya mendapatkan siput tipe posting?

Terima kasih

Ben Everard
sumber

Jawaban:

18

Untuk mendapatkan jenis posting saat ini, gunakan get_post_type(). Kemudian tanyakan get_post_type_object()semua data yang Anda butuhkan, misalnya siput:

$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;
}
fuxia
sumber
1
Saya pikir (belum diuji) get_queried_object()akan mendapatkan info yang sama dengan sedikit gerakan.
Rarst
@ Pertama Mungkin, tapi saya pikir kode yang saya sarankan lebih mudah dimengerti.
fuxia
1
Solusi Toscho salah, karena get_post_type mengembalikan jenis posting halaman saat ini, dan, ketika Anda masuk ke halaman arsip, fungsi ini selalu mengembalikan "halaman". Saya sarching untuk menyelesaikan hal yang sama: Ketika saya masuk ke halaman arsip 'buku' (4 contoh), saya ingin ini: 'buku'. Ketika saya mendapatkannya saya akan mempostingnya.
eMarine
1
sayangnya itu tidak sesederhana itu, meskipun Anda akan lebih baik hanya dengan $posttype = get_query_var('post_type');... Saya telah menambahkan alternatif yang komprehensif.
Majick
Saya pikir ini bukan jawaban yang mencakup keseluruhan cerita. Anda harus memeriksa aturan instal penulisan ulang karena banyak filter (seperti halaman toko woocommerce) membuat perubahan. Gunakan mecanisme sendiri sebagai Worpdress , lihat jawaban saya di bawah.
Jonas Lundman
6

Saya menggunakan ini di luar loop pada template archive.php untuk mendapatkan arsip postingan kustom yang saya gunakan.

Ini adalah kombinasi dari metode yang direkomendasikan oleh @toscho dan @Rarst:

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

Pembaruan: @majick menunjukkan bahwa ini hanya berfungsi jika Anda telah mengatur siput penulisan ulang untuk CPT Anda. Menulis ulang slug adalah opsional saat mendaftarkan CPT dan default ke post_type jika tidak disetel.

Jerry
sumber
ketika saya mencoba ini saya dapatkanNotice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
patrickzdb
ini hanya akan berfungsi jika siput penulisan ulang ditetapkan untuk CPT terdaftar, karena merupakan opsional dan default ke post_type
majick
Terima kasih telah menangkap @majick! Saya telah memperbarui posting untuk mencerminkan info Anda.
Jerry
ternyata itu adalah puncak gunung es ... periksa jawaban baru saya untuk bagian bawah air :-)
majick
3

Jawabannya jadi membingungkan. Dan mungkin saya juga tetapi pertanyaan utama adalah:

Dapatkan siput jenis posting khusus untuk halaman arsip

Jika yang Anda maksud adalah halaman arahan arsip jenis posting , dan ketika is_post_type_archive()kembali true, Anda ingin siput yang merespons arsip tampilan saat ini :

/* 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);

- AKHIR JAWABAN PERTANYAAN -

Penjelasan:

Anda tidak dapat bergantung pada siput terdaftar . Wordpress juga tidak. Misalnya, ketika memanggil get_post_type_archive_link()Wordpress sedang memeriksa aturan penulisan ulang saat ini untuk instalasi Anda .

Dimanapun Anda berada, di dalam atau di luar lingkaran, arsip saat ini atau single post, membalikkan tersebutget_post_type_archive_link() mekanisme. (Permalink diaktifkan.)

Pertimbangan:

Seperti yang disebutkan di sini, jenis posting dalam kueri saat ini dapat berupa array. Anda dapat melangkah lebih jauh dengan intensitas Anda dengan memfilter jenis posting yang Anda cari, misalnya:

$post_type = get_query_var('post_type'); 
if(is_array($post_type)) $post_type = reset($post_type);

atau

if(isset($post_types[0])) $post_type = $post_types[0];

Sudut pandang lain:

Contoh Woocommerce, terdaftar dengan objek jenis posting 'produk' tetapi pada kenyataannya menggunakan nama aturan yang ditulis ulang (toko):

/* returns shop */
$responding_name = str_replace('/', '', str_replace(get_home_url(), '', get_post_type_archive_link('product')));

Tandai, saya menggunakan $responding_name, karena tujuannya mungkin berbeda. Arsip posting tidak ada, hanya urlnya.

cavameta
sumber
Ini membuatnya sangat jelas terima kasih. Sedang mencari solusi ini. Jika pertanyaannya tidak mencari "hanya nama jenis posting", ini seharusnya jawaban yang dihapus.
Jonas Lundman
1

t harus dicatat bahwa jika has_archivedisetel ke true saat mendaftarkan Jenis Posting Kustom, arsip tipe posting /cptslug/akan ditulis ulang secara internal ?post_type=cptslug. Jadi ini juga berarti is_post_type_archive()akan mengembalikan true.

Sayangnya, di mana slug penulisan ulang yang terdaftar berbeda dengan jenis posting, Anda sebenarnya tidak dapat diandalkan post_type. misalnya. jika jenis posting Anda myplugin_carsdan slug penulisan ulang carsAnda dan Anda perlu mendapatkannya myplugin_carsmaka bahkan ini (untuk mencegah kesalahan jika objek yang ditanyakan saat ini bukan jenis posting kustom) masih akan gagal:

$queryobject = get_queried_object();
if (has_property('rewrite',$queryobject)) {
    if (isset($queryobject->rewrite['slug'])) {
         $posttype = $queryobject->rewrite['slug'];
     }
 }

Tetapi karena is_post_type_archivebenar ini lebih dapat diandalkan:

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

Tapi tunggu dulu, masih ada lagi ... ternyata dengan sedikit pengujian ternyata tidak sesederhana itu juga ... bagaimana jika Anda berada di halaman arsip taksonomi dengan beberapa jenis posting dalam taksonomi ..? Atau menetapkan tag posting untuk jenis posting khusus selain dari posting? Atau ada di halaman arsip penulis? Halaman arsip tanggal? ... atau bahkan memiliki kompleks tax_queryatau meta_queryuntukWP_Query ?

Satu-satunya jawaban yang dapat diandalkan (tanpa pengujian untuk setiap kasus arsip yang mungkin) adalah untuk mengulang posting yang sebenarnya dalam permintaan ... Ini adalah fungsi lengkap yang saya buat untuk bekerja pada halaman tunggal dan arsip, dan memungkinkan Anda untuk secara opsional melewati sebuah objek kueri khusus (atau objek posting / ID posting untuk posting tunggal):

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
}

Ini akan andal (apakah saya mengatakan itu?) Mengembalikan array tipe posting jika ada lebih dari satu, atau string dengan tipe posting tunggal jika hanya ada satu jenis. Yang perlu Anda lakukan adalah:

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

Contoh Penggunaan (hanya untuk bersenang-senang):

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

Untuk melihat efeknya, ubah jenis posting khusus dalam kode menjadi post, dan tambahkan thumbtype-postatribut kelas ke gambar thumbnail posting Anda ...

majik
sumber
0

Anda dapat menggunakan kode ini:

$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;

gunakan $ posttype_slug var apa pun yang Anda butuhkan

Guy Ytzhak
sumber
perlu agar $queried_object->query_var['post_type'];ini berfungsi ...
Majick
Tidak. $ Queried_object-> query_var hanya berisi string tipe posting. itu bukan objek atau array. lihat gambar ini: prntscr.com/bd58e1
Guy Ytzhak
ok tetapi hanya jika objek kueri pasti merupakan objek jenis pos kustom, Anda akan mendapatkan objek yang sesuai berbeda dan dengan demikian nilai kosong untuk kategori arsip pajak / tag / penulis / contoh misalnya. bahkan untuk ?post_type=postsaya menjadi kosong. dibandingkan denganget_query_var('post_type');
majick
0

Anda dapat menggunakan kode ini dan kode ini berfungsi untuk saya,

 $ t_slug = get_query_var ('term');
Navin Bhudiya
sumber
-3
if( get_post_type( get_the_ID() ) == 'projects' )
{
  //enter code for this post type
}
subair
sumber