Wordpress 3.3 कस्टम पोस्ट प्रकार /% postname% / permastruct के साथ?


9

इसी तरह के शीर्षक के साथ पहले की पोस्ट है, लेकिन यह वर्डप्रेस 3.3 में नहीं दिखता है, और यह महत्वपूर्ण है क्योंकि 3.3 दिलचस्प रूप से विज्ञापित करता है: "एक प्रदर्शन दंड के बिना पोस्टनाम पर्मलिंक संरचना का उपयोग करें"

वर्डप्रेस 3.2 और इससे पहले की समस्या यह थी कि पहले यह पृष्ठ नाम और फिर 404 दिखता था। यह पहले मनमाने पोस्ट प्रकारों की जांच नहीं करता था। दूसरी ओर 3.3 को पोस्ट प्रकार, फिर पृष्ठ और अंत में 404 (जैसा कि यह इस सुविधा को विज्ञापित करता है) देखना चाहिए । इसका मतलब है कि स्लग के बिना कस्टम पोस्ट प्रकार सरल होना चाहिए , अगर वे post_type=postकहीं हार्ड कोड नहीं थे ।

मैं एक 3.3 विशिष्ट समाधान अभी तक नहीं मिल सकता है।

प्रश्न : मैं किसी भी कस्टम पोस्ट प्रकार "xyz" के लिए पेरालिंक स्ट्रक्चर "/% पोस्टनाम% /" कैसे परिभाषित कर सकता हूं?

धन्यवाद।


मुझे एक सवाल नहीं दिखता - आप वास्तव में क्या पूछ रहे हैं?
ट्रेविस नॉर्थकटt

स्पष्टता के लिए, आप एक नए कस्टम पोस्ट प्रकार को परिभाषित करना चाहते हैं जो /% पोस्टनाम% / के पारलिंक संरचना का उपयोग करता है? क्या आप पोस्ट करने की योजना बना रहे हैं, यह भी इसी क्रमांक का उपयोग करता है, या क्या उनका कोई उपसर्ग होगा?
सुंदरबॉम्प

यह देखने के लिए कि क्या कोई उत्तर देता है। मैंने उपर्युक्त दृष्टिकोणों की भी कोशिश की है, बस फिर से लिखने के लिए स्लग को '' / 'पर सेट किया जाए, जो पेज परमिटलिंक को भी तोड़ता है। Le sigh ...

जवाबों:


2

यह WP 3.3 में आसानी से नहीं किया जाता है जब तक कि आप रीराइट नियमों को सही स्थान पर रखने के लिए ट्रिक नहीं करते हैं और wp_rewrite सोचते हैं कि वर्बोज़ नियमों का उपयोग फ्रंट एंड में किया जा रहा है। नीचे का वर्ग काम करता है।

class Test_Post_Type {
    const POST_TYPE = 'test';

    public static function init() {
        global $wp_rewrite;

        $post_type_obj = register_post_type( self::POST_TYPE, array(
            'labels' => array(
                'name' => __( 'Tests' ),
                'singular_name' => __( 'Test' ),
                'add_new' => __( 'Add New' ),
                'add_new_item' => __( 'Add New Test' ),
                'edit_item' => __( 'Edit Test' ),
                'new_item' => __( 'New Test' ),
                'all_items' => __( 'All Tests' ),
                'view_item' => __( 'View Test' ),
                'search_items' => __( 'Search Tests' ),
                'not_found' => __( 'No Tests found' ),
                'not_found_in_trash' => __( 'No Tests found in Trash' ),
                'menu_name' => __( 'Tests' )
            ),
            'publicly_queryable' => true,
            'exclude_from_search' => true,
            'hierarchical' => false,
            'public' => true,
            'rewrite' => false,
            'has_archive' => true,
            'supports' => array( 'title', 'editor', 'thumbnail', 'test_source' ),
            'taxonomies' => array( 'category', 'post_tag' ),
        ) );

        $post_type_obj = get_post_type_object(self::POST_TYPE);

        //register the rewrite tag for permalink building
        $wp_rewrite->add_rewrite_tag( '%' . $post_type_obj->query_var . '%', '([^/]+)', $post_type_obj->query_var . '=' );

        //we have to add the permastruct here in order to build the permalink, otherwise we'll need to filter the post_type link
        add_permastruct(self::POST_TYPE, '%' . $post_type_obj->query_var . '%/', false );

        //add a filter to remove the permastructs generated above
        add_filter(self::POST_TYPE . '_rewrite_rules', array(__CLASS__, '_remove_default_rules')); 

        //now we add a filter to put the generated rewrite rules in the correct spot
        add_action('generate_rewrite_rules', array(__CLASS__, '_filter_rewrite_rules'));

        if(!is_admin()) {
            //we need verbose_page_rules to be on on the front end in order for pages to be process properly
            $wp_rewrite->use_verbose_page_rules = true;
        }
    }

    /**
     * Filter to remove the rules for this post type when they're automatically generated due to the permastruct registration
     * @param type $rules
     * @return type 
     */
    public static function _remove_default_rules($rules) {
        return array();
    }

    /**
     * Filters the rules at the end to add back the ones for this post type at the bottom
     * @param WP_Rewrite $wp_rewrite 
     */
    public static function _filter_rewrite_rules($wp_rewrite) {
        $post_type_obj = get_post_type_object(self::POST_TYPE);
        $my_rules = $wp_rewrite->generate_rewrite_rules('%' . $post_type_obj->query_var . '%', EP_NONE);
        $wp_rewrite->rules += $my_rules;
    }

}

add_action( 'init', array( 'Test_Post_Type', 'init' ) );

कॉपी इस कोड को मुझे थीम में पेस्ट किया गया, नियमों को फिर से लिखना। एक नया पोस्ट जोड़ा, पोस्ट देखा (यूआरएल सही है), एक 404 मिला ... WP 3.3.1 पर। किसी भी विचार क्यों यह मेरे लिए काम नहीं करेगा? (कोड btw के लिए धन्यवाद!)
रोब वर्मियर

EP_NONE -> EP_PERMALINK टिप्पणी पृष्ठ काम करने के लिए, और उसके बाद कई पोस्ट प्रकार /% postname% / के साथ काम करने के लिए / आपको parse_query फ़िल्टर का उपयोग भी करना होगा। मेरा जवाब ऊपर देखिए।
सायंटिक

रोब, क्या आपने एक नया पद जोड़ा या एक नया 'परीक्षण' पद जोड़ा? यह इस मूल प्रश्न में स्पष्ट नहीं था कि क्या पोस्टों को भी /% post_name% / के क्रमपरिवर्तन की आवश्यकता है। अगर ऐसा है तो नया पोस्ट टाइप भी क्यों बनाया जाए? इसके अलावा, यदि आपके नाम में एक से अधिक पोस्ट प्रकार एक ही प्रकार के पारास्ट्रक्चर हैं, तो आपके नाम के साथ संभावित समस्याएँ होंगी।
सुंदरबॉम्प

1

पवित्र कार की चाबी!

मुझे लगता है कि यह काम करता है । यह लगभग काम करता है, यह सुपर सरल है, केवल एक पंक्ति:

global $wp_rewrite;
$args = array(
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'query_var' => true,
    'rewrite' => array('slug' => 'anything'),
    'capability_type' => 'post',
    'has_archive' => true,
    'hierarchical' => false,
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail')
);
register_post_type('my_custom_post_type', $args);

$wp_rewrite->add_permastruct('my_custom_post_type', "%my_custom_post_type%");

PS यदि आप इसे घर पर आज़माते हैं, तो इस एक पंक्ति को जोड़ने के बाद "सेटिंग" पर जाएँ -> "Permalinks" और Save Changes, यह permalinks को ताज़ा करता है।

मैं WP register_post_type()स्रोत कोड पढ़ रहा था और एक पंक्ति पाया:

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

कहने की जरूरत नहीं है, लेकिन स्लग के बिना मैंने निष्कर्ष निकाला कि यह काम करना चाहिए, और यह किया । यहां तक ​​कि संपादक में शीर्षक के नीचे पर्मलिंक संपादन सही ढंग से काम करता है!

अपडेट: यह पृष्ठ क्रमांक को तोड़ता है, ड्राइंग बोर्ड पर वापस ...


मैंने भी इसी तरह की कोशिश की, इसी तरह के परिणाम के साथ। बहुत अच्छा होगा अगर यह काम करेगा। शायद एक विचार के साथ कोई और?
रॉब वर्मेयर

@RobVermeer ने ध्यान दिया कि लाइन के बिना (केवल डिफ़ॉल्ट स्लग के साथ), वर्डप्रेस पहले ही url पर रीडायरेक्ट करने में सक्षम है। उदाहरण के लिए "कुछ-पोस्ट" "कुछ भी / कुछ-पोस्ट" पर पुनर्निर्देशित करता है। कोडस्पेक में, कहीं न कहीं कोड में सीपीटी के लिए एक समर्थन के बिना स्लग है यह सिर्फ पुनर्निर्देशित करने के लिए चूक है। चेहरा हथेली
Ciantic

1

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

यहाँ मेरा जवाब है, जो वर्तमान संरचना में भी दिखता है, और पोस्टबैक पर सरणी के प्रकार बनाता है। इसमें एक दोष यह भी है कि, यदि दो पोस्ट प्रकार में एक ही स्लग है और दोनों /% पोस्टनाम% / हैं तो यह दोनों दिखाता है।

class MyCustomPostType {
    /**
     * Register post type
     **/
    public static function register_post_type() {
        global $wp_rewrite;

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

        register_post_type('my_custom_post_type', $args);

        // Enables the pages to work simultaneously
        $wp_rewrite->use_verbose_page_rules = true;
        add_filter("rewrite_rules_array", array(__CLASS__, 'rewrite_rules_array'));
        add_action("parse_query", array(__CLASS__, 'parse_query'));
        add_filter("post_type_link", array(__CLASS__, 'post_type_link'), 1, 4);
    }

    public static function post_type_link($link, $post, $leavename=false, $sample=false) {
        if ($sample && ($begin = strpos($link, "?my_custom_post_type=")) !== false) {
            return substr($link, 0, $begin-1) . "/%my_custom_post_type%/";
        }
        return str_replace("?my_custom_post_type=", "", $link) . "/";
    }

    public static function parse_query($query) {
        global $wp, $wp_rewrite;

        // Is this query for /%post_name%/? Is it main request query?
        if (isset($query->query['name'])
            && substr($wp->matched_rule, 0, 7) == "([^/]+)"
            && isset($query->query)
            && isset($wp->query_vars)
            && $query->query == $wp->query_vars)
        {
            //echo '<p><h1>hit!</h1></p>';
            if (!($post_types = get_query_var("post_type"))) {
                if ($wp_rewrite->permalink_structure == "/%postname%/")
                    $post_types = array("post");
                else
                    $post_types = array();
            }

            if (is_array($post_types))
                $post_types[] = "my_custom_post_type";

            set_query_var("post_type", $post_types);
            //set_query_var("posts_per_page", 1);
        }
    }

    public static function rewrite_rules_array($array) {
        global $wp_rewrite;
        // Same rules as in /%post_name%/
        return array_merge($array, $wp_rewrite->generate_rewrite_rules("/%postname%/", EP_PERMALINK));
    }
}


add_action('init', array("MyCustomPostType", "register_post_type"));

क्या यह संभव है कि कुछ विशिष्ट प्रकार के पदानुक्रमित मिलें। मैंने खुद इसकी कोशिश की, लेकिन कुछ भी काम नहीं लगता ... यह सोचता है कि पद माता-पिता / बच्चे के साथ एक लगाव है / ... और अगर मैं माता-पिता / बच्चे / पोते / को करता हूं तो उसे 404 मिलता है।
रोब वर्मेयर

1

मैंने एक समाधान बनाया और मैं इसके साथ एक समस्या नहीं ढूंढ सका। कृपया कोशिश करें और मुझे बताएं कि क्या आपको कोई समस्या है

add_action('init', 'firmasite_resimlitarif_cpt', 0);
function firmasite_resimlitarif_cpt() 
{

// Yemek Tarifi

  $args = array(
    'public' => true,
    'show_in_menu' => true, 
    'permalink_epmask' => EP_NONE,
    'rewrite' => array('slug'=>'/','with_front'=>false),
    'has_archive' => false,
    'supports' => array('title','editor','thumbnail')
  ); 
  register_post_type('yemek',$args);

}


// http://wordpress.stackexchange.com/questions/37650/wordpress-3-3-custom-post-type-with-postname-permastruct
add_action("parse_query", 'firmasite_resimlitarif_parse_query');
function firmasite_resimlitarif_parse_query($query) {
    global $wp, $wp_rewrite;


    // Is this query for /%post_name%/? Is it main request query?
    if (isset($query->query['name'])
        && substr($wp->matched_rule, 0, 7) == "([^/]+)"
        && isset($query->query)
        && isset($wp->query_vars)
        && $query->query == $wp->query_vars)
    {
        if (!($post_types = get_query_var("post_type"))) {
            if ($wp_rewrite->permalink_structure == "/%postname%/")
                $post_types = array("post");
            else
                $post_types = array();
        }

        if (is_array($post_types)){ 
            $post_types[] = 'yemek';
            $post_types[] = 'page';
        }


        set_query_var("post_type", $post_types);
    } 
}

अपने पोस्ट प्रकार के नाम के साथ 'यमक' बदलें।


0

इस लिंक को आपके प्रश्न का उत्तर देना चाहिए:

http://ottopress.com/2011/how-the-postname-permalinks-in-wordpress-3-3-work/


नहीं, ऐसा नहीं है, यह केवल यह बताता है कि यह SQL के संदर्भ में कैसे काम करता है। लेकिन कस्टम पोस्ट प्रकारों का कोई उल्लेख नहीं है, जो समस्या है।
Ciantic

0

सबसे साफ जवाब मैं इसके लिए आ सकता हूं (मैं एक प्लगइन का निर्माण कर रहा हूं जो वास्तव में किसी भी प्रमुख स्लग के बिना एक कस्टम पोस्ट प्रकार की आवश्यकता है) एक कस्टम पोस्ट प्रकार का उपयोग करने के बजाय एक कस्टम पेज टेम्पलेट का उपयोग करना है।

ऐसा करने से, आपके "कस्टम पोस्ट प्रकार" में पृष्ठ पर या पोस्ट पर्मलिंक्स पर कदम रखने के बारे में चिंता किए बिना / जैसे भी हो सकते हैं।

ऐसा करने के लिए, मैंने निम्नलिखित कार्य किया:

  • मेरे प्लगइन के अंदर एक कस्टम पेज टेम्पलेट जोड़ना
  • पेज टेम्प्लेट सेट करना ताकि यह पृष्ठ संपादक में चुना जा सके
  • कस्टम मेटा बॉक्स बनाना जो केवल मेरे पेज टेम्पलेट के लिए दिखाई देते हैं

इसने मुझे इसकी अनुमति दी:

  • WP_Query का उपयोग करके पेज टेम्प्लेट का उपयोग करने वाले पृष्ठों की एक सूची खींचें

  • मेरा कस्टम डेटा संग्रहीत करने के लिए add_meta_boxes में हुक करके विशेष प्रसंस्करण जोड़ें

  • पृष्ठ प्रदर्शित करके उन लोगों को मेरा कस्टम टेम्प्लेट जोड़ें, जो पृष्ठ_attributes_dropdown_pages_args, theme_page_templates, wp_insert_post_data, और template_include फ़िल्टर करके प्रदर्शित करते हैं, एक प्लगइन पर टेम्पलेट जोड़ने पर इस पोस्ट को देखें

नीचे की ओर

बेशक, जबकि यह पृष्ठ या पोस्ट लिंक पर स्टंप नहीं करता है, इसमें स्पष्ट डाउनसाइड की एक जोड़ी है।

कोई संग्रह नहीं आपके पास एक संग्रह नहीं होगा (यदि आप ऐसा चाहते हैं), हालांकि जिसे आपके कस्टम टेम्पलेट का उपयोग करके सभी पृष्ठों का संग्रह बनाने के लिए एक अन्य पृष्ठ टेम्पलेट बनाकर हल किया जा सकता है।

पृष्ठों के तहत प्रबंधित आपको उस व्यवस्थापक में अच्छा बाएं हाथ नेविगेशन नहीं मिलता है जो सभी पोस्ट प्रकार को एक साथ समूहित करता है।

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


यह कहा जा रहा है, मैं कुछ ऐसा चाहता था जिससे उपयोगकर्ता आश्चर्यचकित न हों कि उन्होंने एक नया कस्टम पृष्ठ क्यों बनाया और पाया कि वे या तो अब सामान्य पृष्ठों तक नहीं पहुँच सकते हैं या नए कस्टम पेज के कारण उनकी साइट पर एक मौजूदा पृष्ठ गायब हो गया है।

मुझे पता है कि यह एक वास्तविक समाधान नहीं है , लेकिन यह एक ऐसा विकल्प है जिसने मेरी जरूरतों के लिए बहुत अच्छा काम किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.