एक प्लगइन के कस्टम पोस्ट प्रकार के Redeclare / बदलें स्लग


28

क्या प्लगइन के मौजूदा कस्टम पोस्ट प्रकार (केवल प्लगइन को संपादित किए बिना) के स्लग को फिर से बनाना / बदलना संभव है?

यही है, अगर प्लगइन एक्स स्लग / अनडूकेस्टॉस्ट / के साथ एक कस्टम पोस्ट प्रकार बनाता है, तो क्या फ़ंक्शंस.php (या ऐसा ही कुछ) के लिए एक फिल्टर जोड़ना संभव है जो स्लग को / ब्रेड / में बदलता है?


मैंने सिर्फ 20 की प्राथमिकता के साथ इनिट को हुक करके और फिर उसी पोस्ट प्रकार के लिए register_post_type को कॉल करके इस समस्या को हल किया। किसी को पता है कि क्या यह मेरे लिए किसी भी मुसीबत का कारण बन रहा है?
डस्टिन

जवाबों:


24

हां, यह संभव है, लेकिन यदि rewrite => array('slug' => 'post_type')पैरामीटर पैरामीटर का उपयोग करके एक कस्टम पोस्ट प्रकार बना रहा है , तो यह संभावना नहीं है कि आप स्लग को बदलने में सक्षम होने जा रहे हैं ।

जब भी कस्टम पोस्ट प्रकार बनाए जाते हैं, URL फिर से लिखना डेटाबेस को लिखा जाता है। जिसके आधार पर कार्रवाई कस्टम पोस्ट प्रकार (जैसे init एक्शन) के निर्माण को ट्रिगर करती है , वर्डप्रेस रीराइट नियमों को फ्लश करेगा और कस्टम पोस्ट प्रकार के स्लग को पुनर्स्थापित करेगा चाहे आप जो भी बदलाव करने का प्रयास करें।

उस ने कहा, आप कस्टम पोस्ट प्रकारों के लिए कस्टम स्लग प्रदान कर सकते हैं। निम्न उदाहरण मानता है कि आपके पास एक कस्टम पोस्ट प्रकार है moviesऔर आप /movies/स्लग को बदलने का प्रयास कर रहे हैं /films/

पूर्ण होने के लिए, यहाँ moviesकस्टम फ़ंक्शन का उपयोग कस्टम पोस्ट प्रकार को परिभाषित करने के लिए किया जाता है । प्लगइन है कि आप संदर्भित कर रहे हैं कुछ इस तरह से किया जाना चाहिए:

function movies_register_post_type() {

    register_post_type(
        'movies',
        array(
            'labels' => array(
                'name' => __('Movies'),
                'singular_name' => __('Movie')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array(
                'slug' => 'movies'
            )
        )
    );

} // end example_register_post_type
add_action('init', 'movies_register_post_type');

आप मौजूदा पोस्ट प्रकार के आधार पर अपने स्वयं के कस्टम नियम प्रदान करके विकल्प तालिका को संशोधित कर सकते हैं।

असल में, हम यह करेंगे:

  • नियमों का मौजूदा सेट लें और फिर अपने स्वयं के कस्टम स्लग के साथ अपना लिखें
  • नए नियम को कस्टम पोस्ट प्रकार के स्लग की तुलना में उच्च प्राथमिकता दें

यहां बताया गया है कि आप यह कैसे कर सकते हैं:

function add_custom_rewrite_rule() {

    // First, try to load up the rewrite rules. We do this just in case
    // the default permalink structure is being used.
    if( ($current_rules = get_option('rewrite_rules')) ) {

        // Next, iterate through each custom rule adding a new rule
        // that replaces 'movies' with 'films' and give it a higher
        // priority than the existing rule.
        foreach($current_rules as $key => $val) {
            if(strpos($key, 'movies') !== false) {
                add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top');   
            } // end if
        } // end foreach

    } // end if/else

    // ...and we flush the rules
    flush_rewrite_rules();

} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');

अब, आपके पास अपनी फिल्मों तक पहुंचने के दो तरीके होंगे:

  • /movies/Back-To-The-Future
  • /films/Back-To-The-Future

ध्यान दें कि मैं hooking की सलाह नहीं देते add_custom_rewrite_ruleमें initके रूप में यह बहुत जल्दी-जल्दी सक्रिय होगा कार्रवाई। यह सिर्फ एक उदाहरण है। फ़ंक्शन को लागू करने के लिए एक बेहतर स्थान थीम सक्रियण, प्लगइन सक्रिय, शायद save_post कार्रवाई, आदि पर निर्भर करेगा कि आपको क्या करने की आवश्यकता है, इसके आधार पर आपको केवल एक बार या कुछ ही समय में आग लगाने की आवश्यकता हो सकती है।

इस बिंदु पर, आप ' /movies/स्लग ' का उपयोग करने के लिए कस्टम पोस्ट प्रकार के लिए पर्मलिंक्स को अपडेट करने पर विचार कर सकते हैं । उदाहरण के लिए, यदि आप नेविगेट करते हैं /films/, तो आपको अपनी सभी फिल्मों की एक सूची दिखाई देगी, लेकिन शीर्षक पर मँडरा करने से पता चलेगा कि /movies/स्लग अभी भी उपयोग किया जा रहा है।

एक कदम आगे जाने के लिए, आप तकनीकी रूप /movies/से अपने /films/समकक्ष के लिए पुनर्निर्देशित करने के लिए सभी लिंक को पकड़ने के लिए 301 पुनर्निर्देशित कर सकते हैं , लेकिन यह सब इस बात पर निर्भर करता है कि आप क्या करने का प्रयास कर रहे हैं।


खूबसूरती से काम किया! क्या आप मुझे पर्मलिंक्स को अपडेट करने के लिए सही दिशा में ले जा सकते हैं?
एडबरी

1
अपने विषय के आधार पर, आप इसे टेम्पलेट स्तर पर कर सकते हैं। जब आप 'the_title ()' के लिए कॉल देखते हैं, तो आप इसे $ शीर्षक = get_the_title () के साथ बदल सकते हैं, फिर स्ट्रिंग को '/ फिल्मों /' को $ शीर्षक में '/ फिल्मों /' के साथ बदल सकते हैं।
टॉम

क्या होगा यदि आप जिस स्लग को बदलना चाहते हैं, वह गतिशील रूप से वर्तमान पोस्ट के मेटा मान द्वारा बनाया गया है? मुझे फ़ंक्शन $postमें उपयोग करने में सक्षम होने की आवश्यकता है , add_custom_rewrite_rule()लेकिन यह WP व्यवस्थापक में त्रुटियों को कह रहा है कि 'गैर-वस्तु की संपत्ति प्राप्त करने की कोशिश कर रहा है'। मेटा मूल्य प्राप्त करने के लिए मैं $ पोस्ट कैसे प्राप्त कर सकता हूं?
ली

6

इस कोड ने मेरे बाल विषय के लिए अच्छा काम किया। "कार्यक्रम" स्लग को "स्थान" में बदलने की आवश्यकता है।

/*
CHANGE SLUGS OF CUSTOM POST TYPES
*/

function change_post_types_slug( $args, $post_type ) {

   /*item post type slug*/   
   if ( 'program' === $post_type ) {
      $args['rewrite']['slug'] = 'place';
   }

   return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );

/*
CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages
*/

function change_taxonomies_slug( $args, $taxonomy ) {

   /*item category*/
   if ( 'program-category' === $taxonomy ) {
      $args['rewrite']['slug'] = 'locations';
   }

   return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );

यह पूरी तरह से काम करता है, मैंने इसका उपयोग सापेक्ष नियम को जोड़ने वाले टैग के लिए भी किया है, सेटिंग्स पेज> पर्मलिंक से एक बचत को निष्पादित करके पर्मलिंक्स को अपडेट करना आवश्यक है। धन्यवाद!
लोरेंजो मैगॉन

अन्य आर्गों को भी बदलने के लिए पूरी तरह से काम करता है, मुझे सेट करने की आवश्यकता है $args['has_archive'] = falseऔर यह काम किया।
मात्र विकास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.