कस्टम पोस्ट प्रकार और टैक्सोनॉमी फिर से लिखना संरचनाओं को मिलाकर?


30

मूल रूप से मैं कस्टम पोस्ट प्रकारों का उपयोग करके एक शब्दावली प्राप्त करना चाहता हूं और कुछ मुद्दों को स्थापित करना है जिस तरह से मैं उन्हें चाहता हूं। मैं इसे इस तरह चाहता हूँ:

मुख्य शब्दकोष URL: http://example.com/glossary/

अक्षर A से शुरू होने वाली शब्दावली : http://example.com/glossary/a/

एकल शब्दावली शब्द का URL: http://example.com/glossary/a/atomic/

मैंने वास्तव में इसे नीचे दिए गए कोड का उपयोग करके हासिल किया है, लेकिन मुझे यकीन है कि यह करने के लिए बहुत ही अजीब तरीका है और मुझे पता है कि यह कहीं न कहीं खराबी है क्योंकि पेज देखते समय गलत टेम्प्लेट कहा जाता है। Http://example.com/glossary/ को छोड़कर , जहां आर्काइव-सुमो-ग्लॉरी-टर्म.php को उम्मीद के मुताबिक कहा जाता है, अन्य दो मेरी थीम में index.php को सक्रिय करते हैं।

यहाँ जाता है ( functions.phpविषय में):

add_action('init', 'create_glossary');
function create_glossary()
{
    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => true
        )
    );

    register_taxonomy
    (
        'sumo-glossary-letter',
        'sumo-glossary-term',
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => false
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ($post->post_type == 'sumo-glossary-term')
    {
        $permalink = str_replace('glossary/', 'glossary/' . $post->post_name[0] . '/', $post_link);
    }
    return $permalink;
}

add_rewrite_rule('^glossary/([^/]*)?$','index.php?glossary-letter=$matches[1]','top');
add_rewrite_rule('^glossary/([^/]*)/([^/]*)?$','index.php?glossary-term=$matches[2]','top');

जवाबों:


30

आप हमेशा उस टेम्पलेट को ओवरराइड कर सकते हैं जिसे template_includeसंबंधित फ़िल्टर के साथ कहा जाएगा , लेकिन यह कस्टम अभिलेखागार के साथ गहरी समस्याओं को छिपा सकता है।

जैसा कि मैंने इसे समझा, आप निम्न संरचना का उपयोग करना चाहते हैं:

  • /glossary/सभी sumo-glossary-termपोस्ट के लिए एक आर्काइव पेज होना चाहिए
  • /glossary/[letter]/वर्गीकरण अवधि के साथ पदों के लिए संग्रहण पृष्ठ होना चाहिए [letter]में sumo-glossary-letterवर्गीकरण
  • /glossary/[letter]/[term-name]/एक व्यक्तिगत sumo-glossary-termपद होना चाहिए

इसका मतलब है कि पहला टेम्पलेट लोड करेगा archive-sumo-glossary-term.php, दूसरा लोड करेगा taxonomy-sumo-glossary-letter.php, और तीसरा लोड करेगा single-sumo-glossary-term.php

मैंने वर्डप्रेस 3.2 में स्पष्ट रूप से टैक्सोनॉमी फिर से लिखने वाले स्लग को सेट करके और पोस्ट टाइप के लिए रीगिट स्लग और आर्काइव स्लग, और कोई अन्य रीराइट नियम नहीं बनाया है। इसके अलावा, मैंने यह सुनिश्चित करने के लिए कि पहले प्राथमिकताएं सही थीं (या उसके बाद का पद प्रकार पंजीकृत किया, अन्यथा प्राथमिकताएं सही हैं (अन्यथा शब्दावल पत्र के पेज 2 के बजाय /glossary/f/page/2शब्दावली शब्द के रूप में चला जाता pageहै f)।

add_action('init', 'create_glossary');
function create_glossary()
{

    register_taxonomy
    (
        'sumo-glossary-letter',
        array(),
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => array(
                'slug' => 'glossary',
            ),
        )
    );

    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary/%sumo-glossary-letter%',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => 'glossary',
            'taxonomies' => array( 'sumo-glossary-letter' ),
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ( false !== strpos( $post_link, '%sumo-glossary-letter%' ) ) {
        $glossary_letter = get_the_terms( $post->ID, 'sumo-glossary-letter' );
        $post_link = str_replace( '%sumo-glossary-letter%', array_pop( $glossary_letter )->slug, $post_link );
    }
    return $post_link;
}

मैं उस कल की कोशिश करता हूं और देखता हूं कि क्या यह चाल चली जाती है और यहां वापस आती है। धन्यवाद!
मैरीसिडेड

ठीक है, कल बिल्कुल नहीं ... यह काम किया, लगभग पूरी तरह से! धन्यवाद! जो काम नहीं कर रहा है वह है /glossary/। मुझे 404 देता है ( archive-sumo-glossary-term.phpसेट अप किया जाता है)। कोई विचार? कहना है कि मैं WP 3.0.1 से चिपका हूं और यह शायद एक संस्करण समस्या है। जब मैं अपग्रेड करने में सक्षम होता हूं, तो इसे फिर से परीक्षण करें। वैसे भी, अधिकांश भाग के लिए यह काम कर रहा है और अभी के लिए मुझे जरूरी नहीं है /glossary/और सिर्फ पत्र ए पर पुनर्निर्देशित करें। फिर से धन्यवाद!
मैरीसिडेड

हे @maryisdead, मेरे पास एक ही मुद्दा था और ठीक उसी समाधान के साथ आया था, लेकिन आपकी सटीक समान समस्या के साथ छोड़ दिया गया था - आपको आर्काइव-ग्लोसरी.फ्लो टेम्पलेट में जाने के लिए / शब्दावली कैसे मिलती है? मुझे सिर्फ इसका उत्तर मिला - उपयोग 'has_archive' => 'glossary', इसके बजाय has_archive => true मैंने देखा कि जनवरी में उसके उत्तर में ऐसा ही है, लेकिन आपके पास अपने मूल कोड में ऐसा नहीं है - क्या आपने उस हिस्से को अपडेट किया है? जैसे ही मैंने यह परिवर्तन किया, मेरे लिए काम करना शुरू कर दिया
जेफ

हे जेफ! हां, उस हिस्से को अपडेट किया। बस फिर से जाँच की, अभी भी काम नहीं कर रहा है। प्रश्न में वर्डप्रेस इंस्टॉलेशन अभी भी अद्यतित नहीं है (3.0.1) इसलिए शायद अभी भी समस्या की जड़ है।
maryisdead

WP 3.2.1 का उपयोग करते हुए यहां भी यही समस्या है। फिर भी कोई हल नहीं?
रिचर्ड बी

0

मैंने व्यक्तिगत रूप से इसका उपयोग नहीं किया है, लेकिन आप जिस चीज़ को देखना चाहते हैं वह है "add_rewrite_rule"

http://codex.wordpress.org/Rewrite_API/add_rewrite_rule

एक बार जब आपने उन्हें बदल दिया है तो पर्मलिंक्स को बचाना न भूलें।


मैं वास्तव में उपयोग करता हूं add_rewrite_rule, बस अपने कोड को नीचे तक स्क्रॉल करता हूं। :-) यह अब तक ठीक काम कर रहा है, यह केवल यह है कि गलत तरीके से इसे करने के तरीके के साथ बुलाया जाता है।
मैरीसिडेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.