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
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
Jawaban:
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;
}
$posttype = get_query_var('post_type');
... Saya telah menambahkan alternatif yang komprehensif.
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.
Notice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
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.
t harus dicatat bahwa jika has_archive
disetel 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_cars
dan slug penulisan ulang cars
Anda dan Anda perlu mendapatkannya myplugin_cars
maka 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_archive
benar 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_query
atau meta_query
untukWP_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-post
atribut kelas ke gambar thumbnail posting Anda ...
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
$queried_object->query_var['post_type'];
ini berfungsi ...
?post_type=post
saya menjadi kosong. dibandingkan denganget_query_var('post_type');
Anda dapat menggunakan kode ini dan kode ini berfungsi untuk saya,
$ t_slug = get_query_var ('term');
get_queried_object()
akan mendapatkan info yang sama dengan sedikit gerakan.