जब मैं एक संग्रह पृष्ठ पर होता हूं तो मुझे कस्टम पोस्ट प्रकार स्लग का पता कैसे चलता है?
उदाहरण के लिए यदि टेम्पलेट /products/
फायर करता archive-products.php
है, तो मैं (व्यावहारिक रूप से) पोस्ट प्रकार का स्लग कैसे प्राप्त करूं?
धन्यवाद
जब मैं एक संग्रह पृष्ठ पर होता हूं तो मुझे कस्टम पोस्ट प्रकार स्लग का पता कैसे चलता है?
उदाहरण के लिए यदि टेम्पलेट /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;
}
$posttype = get_query_var('post_type');
... मैंने एक व्यापक विकल्प जोड़ा है।
मैं इस लूप के बाहर आर्काइव पर प्रयोग कर रहा हूँ। टेम्पलेट पर पाएं कि मैं किस कस्टम पोस्ट संग्रह पर हूँ।
यह उन तरीकों का कॉम्बो है जो @toscho और @Rarst दोनों ने सुझाए हैं:
$post_type = get_queried_object();
echo $post_type->rewrite['slug'];
अपडेट: @ माजिक ने बताया कि यह केवल तभी काम करता है जब आपने अपने सीपीटी के लिए फिर से लिखना शुरू किया हो। CPT दर्ज करते समय रिवर्ट स्लग वैकल्पिक है और यदि सेट नहीं है तो पोस्ट_टाइप करने के लिए डिफॉल्ट करता है।
Notice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
जवाब भ्रमित हो जाते हैं। और शायद Im के रूप में अच्छी तरह से लेकिन शीर्षक सवाल है:
संग्रह पृष्ठ के लिए कस्टम पोस्ट प्रकार स्लग प्राप्त करें
यदि आप पोस्ट टाइप आर्काइव लैंडिंग-पेज का अर्थ रखते हैं , और जब is_post_type_archive()
रिटर्न करते हैं true
, तो आप उस स्लग को चाहते हैं जो वर्तमान व्यूअरिंग आर्काइव का जवाब दे:
/* 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()
वर्डप्रेस कॉलिंग आपके इंस्टॉल के लिए वर्तमान पुनर्लेखन नियमों की जांच कर रहा है ।
आप जहां भी हों, अंदर या बाहर लूप, करंट आर्काइव या सिंगल पोस्ट, तंत्र को उल्टा कर दें 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 उदाहरण, 'उत्पादों' के बाद के प्रकार की वस्तु के साथ पंजीकृत है, लेकिन वास्तव में नियम नाम (दुकान) का फिर से उपयोग करता है:
/* returns shop */
$responding_name = str_replace('/', '', str_replace(get_home_url(), '', get_post_type_archive_link('product')));
मार्क, Im का उपयोग करना
$responding_name
, क्योंकि उद्देश्य भिन्न हो सकते हैं। एक पोस्ट संग्रह मौजूद नहीं है, यह सिर्फ एक यूआरएल है।
t यह ध्यान दिया जाना चाहिए कि यदि has_archive
कस्टम पोस्ट प्रकार को पंजीकृत करते समय सही पर सेट किया गया है, तो पोस्ट प्रकार संग्रह /cptslug/
आंतरिक रूप से फिर से लिखा जाएगा ?post_type=cptslug
। तो इसका मतलब यह भी होगा कि यह is_post_type_archive()
सच है।
दुर्भाग्य से, जहां पंजीकृत पुनर्लेखन स्लग पोस्ट प्रकार के लिए अलग है, आप वास्तव में मज़बूती से प्राप्त नहीं कर रहे हैं post_type
। जैसे। यदि आपके पोस्ट प्रकार था myplugin_cars
और आपका रीराइट स्लग था cars
और तुम हो रही करने की आवश्यकता है myplugin_cars
फिर भी इस (यदि वर्तमान वस्तु पूछे त्रुटियों को रोकने के लिए है नहीं एक कस्टम पोस्ट प्रकार) अभी भी विफल हो जाएगा:
$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
?
एकमात्र विश्वसनीय उत्तर (हर संभव संग्रह मामले के लिए परीक्षण के बिना) क्वेरी में वास्तविक पदों को लूप करना है ... यहां पूर्ण फ़ंक्शन है जो मैं एकवचन और संग्रह दोनों पृष्ठों पर काम करने के लिए आया था, और आपको वैकल्पिक रूप से पास करने की अनुमति देता है कस्टम क्वेरी ऑब्जेक्ट (या पोस्ट ऑब्जेक्ट / विलक्षण पदों के लिए पोस्ट आईडी):
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
}
यह मज़बूती से (क्या मैंने ऐसा कहा था?) एक से अधिक प्रकार के मौजूद होने पर, या केवल एक प्रकार के पोस्ट के साथ एक स्ट्रिंग होने पर पोस्ट प्रकारों की एक सरणी लौटाएं यदि केवल एक ही प्रकार है। आपको बस इतना करना है:
$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 का उपयोग करें जो आपको चाहिए
$queried_object->query_var['post_type'];
लिए काम करने की जरूरत है ...
?post_type=post
मैं खाली हो गया। तुलना करेंget_query_var('post_type');
आप इस कोड का उपयोग कर सकते हैं और यह कोड मेरे लिए काम कर रहा है,
$ t_slug = get_query_var ('शब्द');
get_queried_object()
कम चालों में एक ही जानकारी मिलेगी।