कस्टम पोस्ट_टाइप का संग्रह URL प्राप्त करें


26

यह बेवकूफी भरा सवाल लगता है। लेकिन, मैं इसका पता नहीं लगा सकता :(

मुझे घर पर बटन प्रदर्शित करने की आवश्यकता है जो कस्टम पोस्ट_टाइप के आर्काइव URL (आर्काइव- {पोस्ट_टाइप .php) पर जाता है। मैं उसको कैसे करू?


किस प्रकार का बटन, एक नेवी मेनू में, या सिर्फ एक जेनेरिक लिंक जोड़ें? संग्रह URL आमतौर पर yoursite.com/type-slugतब तक होता है जब तक आप स्पष्ट रूप से इसे किसी और चीज़ पर सेट नहीं करते हैं, जैसे। yoursite.com/some-other-url..
t31os

@ t31os: हाँ, अभी, मैंने इसे इस तरह हार्डकोड किया है। लेकिन, जल्द ही @ माइक कोड का उपयोग करके इसे बदल देंगे।
आराध्ययौ

जवाबों:


25

हाय @Silent:

पता चलता है कि वर्डप्रेस 3.1 में एक फ़ंक्शन है जो वास्तव में आप चाहते हैं और इसका नाम है get_post_type_archive_link(); यहां बताया गया है कि आप इसे कैसे कहेंगे (कस्टम पोस्ट प्रकार नाम दिया गया है 'product'):

<a href="<?php echo get_post_type_archive_link('product'); ?>">Products</a>

नीचे मेरा पूर्व उत्तर है इससे पहले कि मुझे पता चला कि वर्डप्रेस वास्तव में इस उपयोग के मामले के लिए एक फ़ंक्शन अंतर्निहित है।

पिछला उत्तर:

जब तक मैंने वर्डप्रेस 3.1 के लिए मुख्य स्रोत कोड में कुछ की अनदेखी नहीं की, मुझे लगता है कि आप एक फ़ंक्शन की तलाश कर रहे हैं, get_archive_link()जिस पर आप इस तरह कॉल कर सकते हैं (एक कस्टम पोस्ट नाम नामित 'product'):

<a href="<?php echo get_archive_link('product'); ?>">Products</a>

और यहाँ स्रोत कोड है जिसे आप अपनी थीम की function.phpफ़ाइल में या .phpएक प्लगइन के लिए एक फ़ाइल में रख सकते हैं जिसे आप लिख रहे हैं:

if (!function_exists('get_archive_link')) {
  function get_archive_link( $post_type ) {
    global $wp_post_types;
    $archive_link = false;
    if (isset($wp_post_types[$post_type])) {
      $wp_post_type = $wp_post_types[$post_type];
      if ($wp_post_type->publicly_queryable)
        if ($wp_post_type->has_archive && $wp_post_type->has_archive!==true)
          $slug = $wp_post_type->has_archive;
        else if (isset($wp_post_type->rewrite['slug']))
          $slug = $wp_post_type->rewrite['slug'];
        else
          $slug = $post_type;
      $archive_link = get_option( 'siteurl' ) . "/{$slug}/";
    }
    return apply_filters( 'archive_link', $archive_link, $post_type );
  }
}

मैं वास्तव में सप्ताहांत में इस सटीक तर्क पर काम कर रहा था, हालांकि मुझे अभी तक 100% यकीन नहीं है कि तर्क का क्रम सभी उपयोग-मामलों में सामान्य रूप से सही है जो कि वर्डप्रेस देख सकता है, हालांकि यह शायद किसी भी विशिष्ट साइट के लिए काम करेगा।

यह भी एक बड़ी बात है कि वर्डप्रेस को टीआरसी के माध्यम से जोड़ा जाना चाहिए जो मुझे लगता है कि मैं आज शाम को करूंगा।


btw, जब आप टीआरसी जमा करते हैं, तो क्या आप कृपया इसे यहां लिंक कर सकते हैं।
आराध्यायु

@ साइलेंट - हां, बिल्कुल।
माइकस्किंकेल

@ माइक - मैंने कुछ ऐसा ही लिखा होता यदि आप .... नहीं होते;) मैं सोच रहा था कि क्या यह @silent के दिमाग में था, लेकिन एक बटन के उल्लेख से मुझे कुछ और ही लगा था ..
t31os

@ t31os - मैं अपने URL राउटिंग प्लगइन के लिए इस सप्ताह के अंत में एक ही तर्क पर काम कर रहा था, इसलिए मैंने एक शुरुआत की थी। :) बटन के रूप में, आप पता करने के लिए एक उत्तर जोड़ सकते हैं?
माइकस्किंकेल

मुझे यकीन नहीं है कि कवर करने के लिए कुछ बचा है, मुझे लगता है कि आपका उपरोक्त फ़ंक्शन कवर करता है जो पूछा गया था ... :)
t31os

12

जब आप पोस्ट प्रकार दर्ज करते हैं, तो आप "has_archive" पैरामीटर के साथ एक स्ट्रिंग को स्लग के रूप में पास कर सकते हैं और सुनिश्चित कर सकते हैं कि आप या तो सही या किसी सरणी में फिर से लिखना चाहते हैं, लेकिन गलत नहीं है और फिर आपका CPT संग्रह URL http://www.YOURDOMAIN.com होगा / has_archive_slug उदाहरण के लिए

यदि आप उदाहरण के लिए अपने register_post_type में सेट करते हैं:

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => 'product',
    'capability_type' => 'post',
    'has_archive' => 'products', 
    'hierarchical' => false,
    'menu_position' => null,
    'supports' => array('title','editor','author','thumbnail','excerpt','comments')
  ); 
 register_post_type('product',$args);

तब आपका एकल url है: http://www.YOURDOMAIN.com/product/postName और आपका संग्रह url है: http://www.YOURDOMAIN.com/products/


3
हुर्रे। मैंने हमेशा सोचा has_archiveथा कि यह एक बूलियन था, लेकिन अब मुझे पता है कि इसे एक तार दिया जा सकता है, इसलिए मेरे विलक्षण कस्टम पोस्ट प्रकार recipeमें एक बहुवचन स्लग हो सकता है/recipes/
एस्ट्रोइटिम

मुझे याद नहीं है कि कब / जब उन्होंने स्विच बनाया या यदि यह हमेशा त्रुटि में था, लेकिन 2017 में 'rewrite'केवल एक बूलियन या सरणी मान स्वीकार करता है। के बजाय 'rewrite' => 'product',आप सूचीबद्ध किया है, यह बजाय होना चाहिए 'rewrite' => array( 'slug' => 'product' ),
माइक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.