कस्टम पोस्ट प्रकार URL से स्लग हटाएं


48

ऐसा लगता है कि कस्टम पोस्ट प्रकार स्लग यानी हटाने के विषय पर आधारित सभी वेब संसाधन

yourdomain.com/CPT-SLUG/post-name 

अब बहुत पुराने समाधान हैं जो प्रायः पूर्व WP संस्करण 3.5 इंस्टाल को संदर्भित करते हैं। एक आम है:

'rewrite'   => array( 'slug' => false, 'with_front' => false ),  

आपके register_post_type फ़ंक्शन के भीतर। यह अब काम नहीं करता है और भ्रामक है। तो मैं वर्डप्रेस 5 के कगार पर Q3 2018 में समुदाय से पूछता हूं ...

कस्टम पोस्ट टाइप पोस्ट के URL को फिर से लिखने के तर्क से या कहीं और से पोस्ट टाइप स्लग को हटाने के आधुनिक और कुशल तरीके क्या हैं?

अद्यतन: इसे regex के साथ काम करने के लिए मजबूर करने के कई तरीके प्रतीत होते हैं। विशेष रूप से जन बेक का उत्तर आपको कंटेंट निर्माण के लिए लगातार तैयार रहना चाहिए ताकि यह सुनिश्चित किया जा सके कि कोई भी परस्पर विरोधी पृष्ठ / पोस्ट नाम नहीं बनाया गया है। .... हालाँकि मुझे विश्वास है कि यह WP कोर की एक बड़ी कमजोरी है जहाँ इसे हमारे लिए संभाला जाना चाहिए। । CPT या पर्मलिंक के लिए विकल्पों का एक उन्नत सेट बनाते समय विकल्प / हुक के रूप में दोनों। कृपया ट्रैक टिकट का समर्थन करें।

फुटनोट: कृपया इस टीआरसी टिकट को देखने / प्रचार करने के लिए समर्थन करें: https://core.trac.wordpress.org/ticket/3413## विकेट


मुझे लगता है कि मैं अपना सिर खुजला रहा हूं कि आप ऐसा क्यों करना चाहेंगे? उलझन में।
माइकल एक्लंड

3
@MichaelEcklund क्योंकि कोई भी CPT जो सार्वजनिक सामना करने वाले वेब पेज बनाने के लिए उपयोग किया जाता है, उसका URL में एक मजबूर स्लग नाम होता है। वास्तव में बहुत सारे wp devs हैं जो स्लग को सुरक्षित रूप से निकालना चाहते हैं।
बेन रेसिकोट

जवाबों:


60

निम्न कोड काम करेगा, लेकिन आपको बस यह ध्यान रखना है कि यदि आपके कस्टम पोस्ट प्रकार के लिए स्लग पृष्ठ या पोस्ट के स्लग के समान है तो संघर्ष आसानी से हो सकता है ...

सबसे पहले, हम स्लैग को पर्मलिंक से हटा देंगे:

function na_remove_slug( $post_link, $post, $leavename ) {

    if ( 'events' != $post->post_type || 'publish' != $post->post_status ) {
        return $post_link;
    }

    $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

    return $post_link;
}
add_filter( 'post_type_link', 'na_remove_slug', 10, 3 );

बस स्लग को हटाना काफी नहीं है। अभी, आपको एक 404 पेज मिलेगा क्योंकि वर्डप्रेस केवल इस तरह से व्यवहार करने के लिए पोस्ट और पेज की अपेक्षा करता है। आपको निम्नलिखित जोड़ना होगा:

function na_parse_request( $query ) {

    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
        return;
    }

    if ( ! empty( $query->query['name'] ) ) {
        $query->set( 'post_type', array( 'post', 'events', 'page' ) );
    }
}
add_action( 'pre_get_posts', 'na_parse_request' );

बस "घटनाओं" को अपने कस्टम पोस्ट प्रकार में बदलें और आप जाने के लिए अच्छे हैं। आपको अपने पर्मलिंक को ताज़ा करने की आवश्यकता हो सकती है।


धन्यवाद। क्या आपको लगता है कि यह मैन्युअल रूप से पुनर्लेखन बनाने से बेहतर है? मैंने उस समाधान को देखा है और यह आपके द्वारा उल्लिखित संघर्षों को रख सकता है?
बेन रेसिकॉट

1
यह nginx के साथ विफल रहता है क्योंकि स्थिति 2 != count( $query->query )। Nginx के साथ, आपके पास $ क्वेरी-> क्वेरी के रूप में हो सकती है array('page' => '', 'name' => '...', 'q' => '...')। तो @NateAllen, उस स्थिति का अर्थ क्या है?
फेबियो मोंटेफुस्कोलो

3
हमें इससे कुछ बेहतर चाहिए। इसमें निर्मित स्लग को हटाने के लिए समर्थन ताकि हम बाद में परस्पर विरोधी URL न बना सकें। जिस तरह से नियमित पोस्ट और पेज अपने यूआरएल बनाते हैं।
बेन रेसिकॉट

3
क्या यह सिर्फ मेरे लिए है या यह कुछ वर्डप्रेस सशर्त टैग को तोड़ता है जैसे कि is_single () और is_singular ()?
रोब-गॉर्डन

1
यह समाधान दुर्भाग्य से कुछ टूटे हुए लिंक का कारण बना और मेरे ब्लॉग ने पोस्ट दिखाना बंद कर दिया और यह सिर्फ एक सामान्य पृष्ठ था। मैट कीज़ द्वारा नीचे एक बेहतर समाधान देखें।
रेडली सस्टेयर

20

टैक्सोनॉमी पंजीकरण में निम्नलिखित कोड लिखें।

'rewrite' => [
  'slug' => '/',
  'with_front' => false
]

सबसे महत्वपूर्ण बात जो आपको कोड बदलने के बाद करनी होगी

अपने कस्टम पोस्ट टाइप टैक्सोनॉमी डॉक्यूमेंट को बदलने के बाद, सेटिंग> पेरामलिंक पर जाएं और अपनी सेटिंग्स को फिर से सेव करें , वरना आपको 404 पेज नहीं मिलेंगे।

सर्वोत्तम समाधान के लिए यहां देखें: http://www.krazzycodes.com/how-to-remove-custom-post-type-taxonomy-base-from-url-in-wordpress/


यह वास्तव में काम करता है, मुझे नहीं पता कि इससे पहले किसी ने इस पर ध्यान कैसे नहीं दिया। बेशक, यह अन्य पृष्ठों के साथ हस्तक्षेप कर सकता है यदि उनके पास समान पर्मलिंक है, लेकिन यदि यह एक महान समाधान नहीं है।
अलेक्जेंडर Aleksorđević

4
इसकी कोशिश की। यह मेरे कस्टम पोस्ट प्रकार लिंक के लिए वांछित परिणाम देता है। हालाँकि यह सभी POST या PAGE पोस्ट प्रकार स्लग को 'कैच' करता है और उन्हें मेरे कस्टम पोस्ट प्रकार के लिए URL के रूप में हल करने की कोशिश करता है, फिर 40%। (हाँ, मैंने पर्मलिंक्स बचाई हैं)।
मैट कीस

4
यह काम नहीं करता है। 404 तब भी देता है, जब आपने पर्मलिंक्स को अपडेट किया हो।
क्रिस्टीन कूपर

3
फिर से,
पर्मलिंक

1
यह समाधान URL से स्लग को हटाने के लिए काम करता है। लेकिन संग्रह पृष्ठ अब काम नहीं करते।
अन्नपूर्णा

13

मैंने यह पता लगाने की कोशिश की कि बहुत पहले और जो मुझे पता है उससे छोटा जवाब नहीं है । कम से कम पुनर्लेखन तर्क के भीतर से नहीं।

अगर आप की वास्तविक कोड को देखने के लिए लंबे समय स्पष्टीकरण स्पष्ट हो जाता है register_post_typeमें WP-शामिल / post.php लाइन 1454 :

add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );

आप इसे फिर $args->rewrite['slug']से %$post_type%लिखना टैग के लिए उपसर्ग देख सकते हैं । कोई सोच सकता है "चलो बस nullतब तक के लिए सेट करें " जब तक आप कुछ लाइनों को नहीं देखते हैं:

if ( empty( $args->rewrite['slug'] ) )
    $args->rewrite['slug'] = $post_type;

आप देख सकते हैं कि फ़ंक्शन हमेशा एक स्लग मान की अपेक्षा करता है जो खाली नहीं है और अन्यथा पोस्ट प्रकार का उपयोग करता है।


धन्यवाद @JanBeck क्या इसके होने का एक प्रमुख कारण है? इस नियम से कुछ पोस्ट प्रकारों को छोड़ने के लिए इस कोर फ़ाइल को सशर्त के साथ हैक क्यों नहीं किया जाता है?
बेन रैसिकॉट सेप

9
आपको जान बेक का जवाब देना चाहिए। WordPress को पोस्ट अनुरोधों को ठीक से रूट करने के लिए post_type स्लग की आवश्यकता है। यह नियम मूल WP पृष्ठों (जो स्लग के बिना प्रस्तुत करता है) और किसी भी कस्टम परिभाषित पोस्ट प्रकारों के बीच टकराव को रोकता है। यदि आप स्लग को हैक कर लेते हैं तो वर्डप्रेस को "पिकनिक" नामक पृष्ठ और "पिकनिक" नामक एक घटना (कस्टम पोस्ट प्रकार) के बीच का अंतर पता नहीं चलेगा।
dswebsme

3
@dswebsme सहमत हैं, लेकिन ऐसी परिस्थितियां हैं जहां आपको URL को बिल्कुल बदलना होगा। तो इसके अलावा आप मूल रूप से और क्यों नहीं कर सकते, आप इतनी कुशलता से कैसे करते हैं?
बेन राहिकोट

7

के जवाब में अपने पिछले जवाब : आप निश्चित रूप से सेट कर सकते हैं rewriteकरने के लिए पैरामीटर falseजब एक नई पोस्ट प्रकार दर्ज की और संभाल पुनर्लेखन तो जैसे खुद के नियम

<?php
function wpsx203951_custom_init() {

    $post_type = 'event';
    $args = (object) array(
        'public'      => true,
        'label'       => 'Events',
        'rewrite'     => false, // always set this to false
        'has_archive' => true
    );
    register_post_type( $post_type, $args );

    // these are your actual rewrite arguments
    $args->rewrite = array(
        'slug' => 'calendar'
    );

    // everything what follows is from the register_post_type function
    if ( is_admin() || '' != get_option( 'permalink_structure' ) ) {

        if ( ! is_array( $args->rewrite ) )
            $args->rewrite = array();
        if ( empty( $args->rewrite['slug'] ) )
            $args->rewrite['slug'] = $post_type;
        if ( ! isset( $args->rewrite['with_front'] ) )
            $args->rewrite['with_front'] = true;
        if ( ! isset( $args->rewrite['pages'] ) )
            $args->rewrite['pages'] = true;
        if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive )
            $args->rewrite['feeds'] = (bool) $args->has_archive;
        if ( ! isset( $args->rewrite['ep_mask'] ) ) {
            if ( isset( $args->permalink_epmask ) )
                $args->rewrite['ep_mask'] = $args->permalink_epmask;
            else
                $args->rewrite['ep_mask'] = EP_PERMALINK;
        }

        if ( $args->hierarchical )
            add_rewrite_tag( "%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&pagename=" );
        else
            add_rewrite_tag( "%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=" );

        if ( $args->has_archive ) {
            $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive;
            if ( $args->rewrite['with_front'] )
                $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
            else
                $archive_slug = $wp_rewrite->root . $archive_slug;

            add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
            if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) {
                $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
                add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
                add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
            }
            if ( $args->rewrite['pages'] )
                add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' );
        }

        $permastruct_args = $args->rewrite;
        $permastruct_args['feed'] = $permastruct_args['feeds'];
        add_permastruct( $post_type, "%$post_type%", $permastruct_args );
    }
}
add_action( 'init', 'wpsx203951_custom_init' );

आप देख सकते हैं कि add_permastructकॉल में अब स्लग शामिल नहीं है। मैंने दो परिदृश्यों का परीक्षण किया:

  1. जब मैंने स्लग "कैलेंडर" के साथ एक पृष्ठ बनाया तो उस पेज को पोस्ट प्रकार संग्रह द्वारा अधिलेखित कर दिया जाता है जो "कैलेंडर" स्लग का उपयोग करता है।

यहाँ छवि विवरण दर्ज करें

  1. जब मैंने स्लग "माय-ईवेंट" के साथ एक पेज बनाया और स्लग "माय-ईवेंट" के साथ एक इवेंट (सीपीटी), कस्टम पोस्ट प्रकार प्रदर्शित किया जाता है।

यहाँ छवि विवरण दर्ज करें

  1. कोई भी अन्य पृष्ठ काम नहीं करता है। यदि आप ऊपर दिए गए चित्र को देखते हैं तो यह स्पष्ट हो जाता है कि क्यों: कस्टम पोस्ट प्रकार नियम हमेशा एक पृष्ठ स्लग के विरुद्ध मेल खाएगा। क्योंकि वर्डप्रेस के पास यह पहचानने का कोई तरीका नहीं है कि यह एक पेज है या एक कस्टम पोस्ट प्रकार जो मौजूद नहीं है, यह 404 वापस आ जाएगा। यही कारण है कि आपको पृष्ठ या CPT की पहचान करने के लिए एक स्लग की आवश्यकता है। एक संभावित समाधान यह होगा कि त्रुटि को रोकना और इस उत्तर के समान एक पृष्ठ की तलाश करना ।

तो अगर लक्ष्य CPT के लिए स्लग को हटाना है, तो क्या हम CPT को कुछ ऐसा अनोखा नाम दे सकते हैं जो टकराएगा नहीं क्योंकि यह URL वैसे भी कभी नहीं देखा जाएगा? या एक नाम के रूप में एक ही नाम अगर संभव संघर्ष के बाद का नाम है?
बेन रेसिकोट

मैंने अपना उत्तर यह दिखाने के लिए अपडेट किया है कि यह वास्तव में सभी पृष्ठों को तोड़ता है । स्लग के बिना, WP एक पृष्ठ के बजाय सीपीटी की तलाश करेगा और यदि यह नहीं मिलता है, तो एक त्रुटि लौटाएं। तो यह वास्तव में नाम के बाद से संबंधित नहीं है।
जन बेक

1
समझा। ऐसे नियमों को फिर से लिखना चाहिए जो भविष्य के परस्पर विरोधी URL जैसे मूल WP पोस्ट बनाम पृष्ठों पर '-1' जोड़ते हैं। मैंने एक trac टिकट core.trac.wordpress.org/ticket/34136#ticket बनाया है जो आपके विचारों को पसंद करेगा।
बेन रेसिकोट

7

यहां जवाबों के माध्यम से मुझे लगता है कि एक बेहतर समाधान के लिए जगह है जो कुछ चीजों को जोड़ती है जो मैंने ऊपर सीखा है और ऑटो-डिटेक्शन और डुप्लिकेट स्लग की रोकथाम को जोड़ता है।

नोट: सुनिश्चित करें कि आपने नीचे दिए मेरे उदाहरण में अपने स्वयं के CPT नाम के लिए 'custom_post_type' को बदल दिया है। कई घटनाएँ हैं, और उन सभी को पकड़ने का एक आसान तरीका 'ढूंढना / बदलना' है। इस कोड के सभी अपने functions.php या एक plugin में जा सकते हैं।

चरण 1: जब आप पोस्ट को पंजीकृत करते हैं, तब 'राइट' लिखकर अपने कस्टम पोस्ट प्रकार पर फिर से लिखें।

register_post_type( 'custom_post_type',
    array(
        'rewrite' => false
    )
);

चरण 2: मैन्युअल रूप से हमारे कस्टम रीराइट को वर्डप्रेस के नीचे से जोड़कर हमारे कस्टम_पोस्ट_टाइप के लिए फिर से लिखता है

function custom_post_type_rewrites() {
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/embed/?$', 'index.php?custom_post_type=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/trackback/?$', 'index.php?custom_post_type=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '([^/]+)/page/?([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&paged=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)(?:/([0-9]+))?/?$', 'index.php?custom_post_type=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
}
add_action( 'init', 'custom_post_type_rewrites' );

नोट: अपनी आवश्यकताओं के आधार पर, आप उपरोक्त पुनर्लेखनों को संशोधित करना चाहते हैं (ट्रैकबैक फ़ीड को अक्षम कर सकते हैं ?, आदि)। यदि आप चरण 1 में पुनर्लेखन को अक्षम नहीं करते हैं, तो यह 'डिफ़ॉल्ट' प्रकार के पुनर्लेखन का प्रतिनिधित्व करता है

चरण 3: फिर से अपने कस्टम पोस्ट प्रकार 'सुंदर' के लिए पर्मलिंक बनाएं

function custom_post_type_permalinks( $post_link, $post, $leavename ) {
    if ( isset( $post->post_type ) && 'custom_post_type' == $post->post_type ) {
        $post_link = home_url( $post->post_name );
    }

    return $post_link;
}
add_filter( 'post_type_link', 'custom_post_type_permalinks', 10, 3 );

नोट: यदि आप अपने उपयोगकर्ताओं को किसी अन्य पोस्ट प्रकार में एक विरोधाभासी (डुप्लिकेट) पोस्ट बनाने के बारे में चिंतित नहीं हैं, तो आप यहां रुक सकते हैं, ऐसी स्थिति पैदा होगी जहां पेज अनुरोध किए जाने पर उनमें से केवल एक लोड हो सकता है।

चरण 4: डुप्लिकेट पोस्ट स्लग को रोकें

function prevent_slug_duplicates( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
    $check_post_types = array(
        'post',
        'page',
        'custom_post_type'
    );

    if ( ! in_array( $post_type, $check_post_types ) ) {
        return $slug;
    }

    if ( 'custom_post_type' == $post_type ) {
        // Saving a custom_post_type post, check for duplicates in POST or PAGE post types
        $post_match = get_page_by_path( $slug, 'OBJECT', 'post' );
        $page_match = get_page_by_path( $slug, 'OBJECT', 'page' );

        if ( $post_match || $page_match ) {
            $slug .= '-duplicate';
        }
    } else {
        // Saving a POST or PAGE, check for duplicates in custom_post_type post type
        $custom_post_type_match = get_page_by_path( $slug, 'OBJECT', 'custom_post_type' );

        if ( $custom_post_type_match ) {
            $slug .= '-duplicate';
        }
    }

    return $slug;
}
add_filter( 'wp_unique_post_slug', 'prevent_slug_duplicates', 10, 6 );

नोट: यह किसी भी डुप्लिकेट स्लग के अंत में स्ट्रिंग '-duplicate' को जोड़ देगा। यह कोड डुप्लिकेट स्लग को रोक नहीं सकता है यदि वे इस समाधान को लागू करने से पहले से मौजूद हैं। पहले डुप्लिकेट के लिए जांच करना सुनिश्चित करें।

मैं किसी और से वापस सुनना पसंद करूंगा जो इसे देखने के लिए जाता है कि क्या यह उनके लिए भी अच्छा काम करता है।


बस इसका परीक्षण किया और ऐसा लगता है कि यह अभी तक काम कर रहा है।
क्रिस्टीन कूपर

इस दृष्टिकोण के लिए आशान्वित था, लेकिन मेरे सीपीटी पदों पर 404 देता है, यहां तक ​​कि पर्मलिंक्स को फिर से शुरू करने के बाद भी।
गर्किनिस

क्षमा करें, यह आपके लिए गार्कोनिस के काम नहीं आया। मैं थोड़ी देर पहले इस बारे में किसी और के साथ बात कर रहा था और उन्हें अपनी साइट पर भी समस्या हो रही थी। मुझे याद है कि अगर आपके ब्लॉग के पोस्टलिंक उन पर उपसर्ग करते हैं तो यह बात याद आती है। जिस साइट पर मैंने ब्लॉग पोस्ट के लिए इसे विकसित किया है, वह पर्मलिंक संरचना का उपयोग कर रही है: / ब्लॉग /% पोस्टनाम% /। यदि आपके पास अपने ब्लॉग पोस्ट पर उपसर्ग नहीं है, और यह स्वीकार्य है कि आप ऐसा करते हैं, तो इसे आज़माएं और मुझे बताएं कि यह कैसे चलता है!
मैट कुंजी

2
इसने मेरे लिए काम किया। पृष्ठ के अन्य समाधानों के विपरीत, यह सामान्य पृष्ठों या ब्लॉग लेआउट को नहीं तोड़ता है, और अनंत रीडायरेक्ट का कारण नहीं बनता है। यहां तक ​​कि उन cpt पृष्ठों को संपादित करते समय "Permalink" क्षेत्र में यह सही URL दिखाता है। यहाँ बहुत अच्छा समाधान, केवल चेतावनी है कि संग्रह पृष्ठ काम नहीं करता है। "Custom_post_type" की अदला-बदली करने के लिए याद रखें और बाद में अपने पर्मलिंक्स को ताज़ा करें
रेडली सस्टेयर

@MattKeys, डिफ़ॉल्ट पर्मलिंक सेटिंग्स की एक कस्टम संरचना है /%category%/%postname%/। अपना कोड जोड़ते समय, CPT स्लग ठीक दिखता है (हालाँकि अनुगामी स्लैश याद कर रहे हैं) ... और संघर्ष चेकर भी काम करता है। लेकिन वास्तविक पोस्ट 404 पर परिणाम देता है।
गार्कोनिस

1

तुम इतना कठिन कोड की जरूरत नहीं है। बस हल्के प्लगइन का उपयोग करें:

इसमें अनुकूलन योग्य विकल्प हैं।


अब मुझे पता है कि आप नीचे क्यों गए, यह सामान्य पृष्ठ लिंक को हल करने से रोकता है। मैंने इसे नहीं देखा क्योंकि मुझे ताज़ा करने के बावजूद मौजूदा पृष्ठों की कैश प्रतियां प्राप्त हो रही थीं।
वाल्फ

@ क्या आप मुझे इस मुद्दे के बारे में विस्तार से बता सकते हैं?
टोडुआ

मुख्य मेनू से पृष्ठों के लिंक के बाद (जो कस्टम पोस्ट प्रकार नहीं थे) 404 त्रुटियां दीं, जैसे कि पृष्ठ मौजूद नहीं था; बस।
वॉलफ

@ क्या आप मुझे अपने अवसर का कोई उदाहरण दे सकते हैं? (यदि आप चाहते हैं तो आप डोमेन नाम को कवर कर सकते हैं, मुझे बस एक पूर्व उदाहरण की आवश्यकता है) धन्यवाद, मैं इसे अपडेट
करूंगा

1

यहाँ भी यही समस्या थी और लगता है कि वर्डप्रेस साइट पर कोई हलचल नहीं है। मेरी विशेष स्थिति में जहां एकल ब्लॉगपोस्ट के लिए संरचना / ब्लॉग /% पोस्टनाम% / इस समाधान की आवश्यकता थी

https://kellenmace.com/remove-custom-post-type-slug-from-permalinks/

404 के एक समूह में समाप्त हुआ

लेकिन इस अद्भुत दृष्टिकोण के साथ, जो कि ब्लॉगपोस्ट के लिए बैकेंड पर्मलिंक स्ट्रकचर का उपयोग नहीं कर रहा है, यह अंत में आकर्षण की तरह काम करता है। https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/

बहुत बहुत धन्यवाद।


0

और हम उपर्युक्त फ़ंक्शन में कुछ बदलाव कर सकते हैं:

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {
    $query->set( 'post_type', array( 'post', 'events', 'page' ) );
}
}

सेवा:

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {

    global $wpdb;
    $pt = $wpdb->get_var(
        "SELECT post_type FROM `{$wpdb->posts}` " .
        "WHERE post_name = '{$query->query['name']}'"
    );
    $query->set( 'post_type', $pt );
}
}

सही post_type मान सेट करने के लिए।



0

इसे पढ़ने वाले किसी भी व्यक्ति के लिए, जैसे कि मुझे मेरे द्वारा लिखे गए नियमों को जोड़ने का सबसे अच्छा तरीका यह था कि मैंने बच्चे की पोस्ट से परेशान किया था।

मेरा मुख्य मुद्दा यह था कि वर्डप्रेस उन पृष्ठों से रीडायरेक्ट का इलाज करता है जो 2 स्तर (चाइल्ड पोस्ट) हैं जो कि 3 स्तरों के डीप (चाइल्ड पोस्ट का बच्चा) की तुलना में थोड़ा अलग है।

इसका मतलब है कि जब मेरे पास / पोस्ट-टाइप / पोस्ट-नेम / पोस्ट-चाइल्ड है / मैं / पोस्ट-नेम / पोस्ट-चाइल्ड का उपयोग कर सकता हूं और यह मुझे पोस्ट-टाइप के साथ रीडायरेक्ट करेगा लेकिन अगर मेरे पास पोस्ट-टाइप है / पोस्ट-नाम / पोस्ट-चाइल्ड / पोस्ट-ग्रैंडचिल्ड तब मैं पोस्ट-नाम / पोस्ट-चाइल्ड / पोस्ट-ग्रैंडचिल्ड का उपयोग नहीं कर सकता।

पुनर्लेखन नियमों पर नज़र डालें तो ऐसा लगता है कि यह पहले और दूसरे स्तर पर पेगेनमे के अलावा अन्य चीजों के लिए मेल खाता है (मुझे लगता है कि दूसरे स्तर के लगाव से मेल खाता है) और फिर वहाँ कुछ करता है जो आपको उचित पोस्ट पर पुनर्निर्देशित करता है। तीन स्तरों पर यह काम नहीं करता है।

सबसे पहले आपको बच्चों से पोस्ट टाइप लिंक को हटाना होगा। यदि आप नैट एलेन के उत्तर को देखते हैं तो यह तर्क यहाँ होना चाहिए:

$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

यदि मैं बच्चे को सही पर्मालिंक पर ले जाऊं और क्या नहीं, तो यह जांचने के लिए कि मैं अलग-अलग कंडीशंस का मिश्रण इस्तेमाल करता हूं। यह हिस्सा बहुत मुश्किल नहीं है और आपको लोगों के उदाहरण कहीं और मिल जाएंगे।

अगला चरण हालांकि, जहां चीजें दिए गए उत्तर से बदल जाती हैं। मुख्य क्वेरी में चीजों को जोड़ने के बजाय (जो कस्टम पोस्ट और उनके बच्चों के लिए काम करती है लेकिन आगे के बच्चे नहीं हैं) मैंने एक रीराइट किया जो वर्डप्रेस नियमों के निचले हिस्से में चला गया ताकि अगर pagename की जाँच न हो और यह होने वाला था 404 को हिट करें यह देखने के लिए एक अंतिम जांच करेगा कि क्या कस्टम पोस्ट प्रकार के किसी पृष्ठ का एक ही नाम था अन्यथा यह 404 बाहर फेंक देगा।

यहाँ फिर से लिखा गया नियम है जिसे मैंने 'ईवेंट' मानते हुए इस्तेमाल किया था। यह आपके CPT का नाम है

function rewrite_rules_for_removing_post_type_slug()
{
    add_rewrite_rule(
        '(.?.+?)?(:/([0-9]+))?/?$',
        'index.php?event=$matches[1]/$matches[2]&post_type=event',
        'bottom'
    );
}

add_action('init', 'rewrite_rules_for_removing_post_type_slug', 1, 1);

आशा है कि यह किसी और की मदद करता है, मुझे कुछ और नहीं मिला जो कि बाल पदों के बच्चे के साथ करना था और उन लोगों से स्लग को हटाना था।


लगता है regex में एक टाइपो है। के बीच '(:' a '?' को गैर-कैप्चरिंग सबपैटर्न => के रूप में उपयोग करने की आवश्यकता है। । इस टाइपो बिना अभिव्यक्ति एक निर्माण में पोस्ट प्रकार 'पेज' के लिए पाया जा सकता है के रूप में ही किया जाएगा
लिखने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.