संग्रह पृष्ठ के लिए कस्टम पोस्ट प्रकार स्लग प्राप्त करें


15

जब मैं एक संग्रह पृष्ठ पर होता हूं तो मुझे कस्टम पोस्ट प्रकार स्लग का पता कैसे चलता है?

उदाहरण के लिए यदि टेम्पलेट /products/फायर करता archive-products.phpहै, तो मैं (व्यावहारिक रूप से) पोस्ट प्रकार का स्लग कैसे प्राप्त करूं?

धन्यवाद

जवाबों:


19

वर्तमान पोस्ट प्रकार का उपयोग करने के लिए 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;
}

1
मुझे लगता है कि (परीक्षण नहीं किया गया था) get_queried_object()कम चालों में एक ही जानकारी मिलेगी।
रार्स्ट ऑक्ट

@ रिस्ट शायद, लेकिन मुझे लगता है कि मेरे द्वारा सुझाए गए कोड को समझना आसान है।
FUXIA

1
Toscho का समाधान गलत है, क्योंकि get_post_type वर्तमान पृष्ठ का पोस्ट प्रकार लौटाता है, और, जब आप संग्रह पृष्ठ में होते हैं, तो यह फ़ंक्शन "पृष्ठ" पर वापस जाता है। मैं उसी को हल करने के लिए व्यंग कर रहा हूं: जब मैं 'पुस्तकों' (4 उदाहरण) के संग्रह पृष्ठ में हूं, तो मुझे यह चाहिए: 'किताबें'। जब मुझे यह मिल जाएगा तो मैं इसे पोस्ट कर दूंगा।
eMarine

1
दुर्भाग्य से यह इतना आसान नहीं है, हालांकि आप बस के साथ बेहतर होंगे $posttype = get_query_var('post_type');... मैंने एक व्यापक विकल्प जोड़ा है।
मेजिक

मुझे लगता है कि यह उत्तर पूरी कहानी को कवर करता है। आपको इंस्टॉल रीराइट नियमों की जांच करनी चाहिए क्योंकि कई फिल्टर (जैसे वूकोमर्स शॉप पेज) बदलाव कर रहे हैं। इसके बजाय वॉर्पड्रेस के स्वयं के मैकैनिज्म का उपयोग करें , नीचे मेरा जवाब देखें।
जोनास लुंडमैन

6

मैं इस लूप के बाहर आर्काइव पर प्रयोग कर रहा हूँ। टेम्पलेट पर पाएं कि मैं किस कस्टम पोस्ट संग्रह पर हूँ।

यह उन तरीकों का कॉम्बो है जो @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
patrickzdb

यह तभी काम करेगा जब रजिस्टर्ड सीपीटी के लिए फिर से लिखी गई स्लग सेट हो, क्योंकि यह वैकल्पिक है और पोस्ट_टाइप के लिए डिफॉल्ट करता है
माजिक

उस @ माजिक को पकड़ने के लिए धन्यवाद! मैंने आपकी जानकारी को दर्शाने के लिए पोस्ट अपडेट की है।
जेरी

पता चलता है कि हिमशैल की नोक थी ... पानी के नीचे के हिस्से के लिए मेरे नए उत्तर की जाँच करें :-)
माजिक

3

जवाब भ्रमित हो जाते हैं। और शायद 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, क्योंकि उद्देश्य भिन्न हो सकते हैं। एक पोस्ट संग्रह मौजूद नहीं है, यह सिर्फ एक यूआरएल है।


इसने आपको बहुत स्पष्ट धन्यवाद दिया। इस समाधान की तलाश में था। यदि प्रश्न "केवल पोस्ट प्रकार के नाम" की तलाश में नहीं था, तो यह एक उत्तर दिया जाना चाहिए।
जोनास लुंडमैन

1

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अपनी पोस्ट थंबनेल छवियों में एक वर्ग विशेषता जोड़ें ...


0

आप इस कोड का उपयोग कर सकते हैं:

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

$ posttype_slug var का उपयोग करें जो आपको चाहिए


इसके $queried_object->query_var['post_type'];लिए काम करने की जरूरत है ...
माजिक

$ $ Queried_object-> query_var containe केवल पोस्ट प्रकार का स्ट्रिंग। यह वस्तु या सरणी नहीं है। इस चित्र को देखें: prntscr.com/bd58e1
गाइ यत्ज़क

ठीक है, लेकिन केवल अगर क्वेराइड ऑब्जेक्ट निश्चित रूप से एक कस्टम पोस्ट प्रकार ऑब्जेक्ट है, तो आपको एक अलग संगत ऑब्जेक्ट मिलेगा और इस प्रकार श्रेणी / कर / टैग / लेखक संग्रह पृष्ठों के लिए रिक्त मान उदाहरण के लिए। यहां तक ​​कि ?post_type=postमैं खाली हो गया। तुलना करेंget_query_var('post_type');
मैजिक

0

आप इस कोड का उपयोग कर सकते हैं और यह कोड मेरे लिए काम कर रहा है,

 $ t_slug = get_query_var ('शब्द');

-3
if( get_post_type( get_the_ID() ) == 'projects' )
{
  //enter code for this post type
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.