कस्टम टैक्सोनॉमी कस्टम पोस्ट प्रकार के लिए विशिष्ट है


29

मैं एक कस्टम टैक्सोनॉमी बनाना चाहता हूं जो पोस्ट प्रकार के समान व्यवहार करता है क्योंकि एक श्रेणी डिफ़ॉल्ट पोस्ट (% /% के% /% पोस्टनाम / संरचना के आधार पर) के आधार पर व्यवहार करती है ताकि कस्टम पोस्ट प्रकार के पोस्ट www.example.com/custom-post-type/custom-taxonomy-name/post-name के रूप में प्रदर्शित किया जाता है। मैं चाहता हूं कि श्रेणी मेटा बॉक्स केवल तभी दिखाई दे जब हम नई डिफ़ॉल्ट पोस्ट जोड़ते हैं, न कि तब जब हम कस्टम में एक नया पोस्ट जोड़ते हैं पोस्ट प्रकार और कस्टम टैक्सोनॉमी बॉक्स केवल तब दिखाई देते हैं जब हम कस्टम पोस्ट प्रकार में एक नया पोस्ट जोड़ते हैं और तब नहीं जब हम नया डिफ़ॉल्ट पोस्ट जोड़ते हैं।

जवाबों:


46

सबसे पहले अगर आप टैक्सोनॉमी मेटाबॉक्स को केवल कस्टम पोस्ट प्रकार को दिखाना चाहते हैं, तो टैक्सोनॉमी को केवल उस कस्टम पोस्ट प्रकार को रजिस्टर करें जैसे कि कस्टम पोस्ट टाइप नाम को रजिस्टर_टैक्सोनॉमी में तर्क के रूप में पास करें। ऐसा करने से टैक्सोनॉमी मेटाबॉक्स केवल कस्टम पोस्ट प्रकार के लिए प्रकट होता है। यदि आप कस्टम पोस्ट प्रकार के लिए श्रेणी मेटाबॉक्स दिखाना नहीं चाहते हैं, तो कस्टम पोस्ट प्रकार दर्ज करते समय शब्द श्रेणी को तर्क के रूप में हटा दें और इसके बजाय इस 'टैक्सोनॉमीज़' => सरणी ('पोस्ट_टैग', 'your_taxonomy_name') जैसे टैक्सोनॉमी स्लग का नाम शामिल करें। । यहाँ कोड है कि मैंने कैसे हासिल किया। मैंने कस्टम पोस्ट टाइप थीम के तहत स्लग theme_categories के साथ एक कस्टम टैक्सोनॉमी दर्ज की है


function themes_taxonomy() {  
    register_taxonomy(  
        'themes_categories',  //The name of the taxonomy. Name should be in slug form (must not contain capital letters or spaces). 
        'themes',        //post type name
        array(  
            'hierarchical' => true,  
            'label' => 'Themes store',  //Display name
            'query_var' => true,
            'rewrite' => array(
                'slug' => 'themes', // This controls the base slug that will display before each term
                'with_front' => false // Don't display the category base before 
            )
        )  
    );  
}  
add_action( 'init', 'themes_taxonomy');

फिर मैं निम्नलिखित फ़ंक्शन द्वारा बनाई गई पर्मलिंक को बदलने के लिए


function filter_post_type_link($link, $post)
{
    if ($post->post_type != 'themes')
        return $link;

    if ($cats = get_the_terms($post->ID, 'themes_categories'))
        $link = str_replace('%themes_categories%', array_pop($cats)->slug, $link);
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

फिर मैंने नीचे के रूप में स्लग थीम के साथ एक कस्टम पोस्ट प्रकार पंजीकृत किया


//Registering Custom Post Type Themes
add_action( 'init', 'register_themepost', 20 );
function register_themepost() {
    $labels = array(
        'name' => _x( 'Themes', 'my_custom_post','custom' ),
        'singular_name' => _x( 'Theme', 'my_custom_post', 'custom' ),
        'add_new' => _x( 'Add New', 'my_custom_post', 'custom' ),
        'add_new_item' => _x( 'Add New ThemePost', 'my_custom_post', 'custom' ),
        'edit_item' => _x( 'Edit ThemePost', 'my_custom_post', 'custom' ),
        'new_item' => _x( 'New ThemePost', 'my_custom_post', 'custom' ),
        'view_item' => _x( 'View ThemePost', 'my_custom_post', 'custom' ),
        'search_items' => _x( 'Search ThemePosts', 'my_custom_post', 'custom' ),
        'not_found' => _x( 'No ThemePosts found', 'my_custom_post', 'custom' ),
        'not_found_in_trash' => _x( 'No ThemePosts found in Trash', 'my_custom_post', 'custom' ),
        'parent_item_colon' => _x( 'Parent ThemePost:', 'my_custom_post', 'custom' ),
        'menu_name' => _x( 'Themes Posts', 'my_custom_post', 'custom' ),
    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'description' => 'Custom Theme Posts',
        'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'revisions', 'post-formats', 'custom-fields' ),
        'taxonomies' => array( 'post_tag','themes_categories'),
        'show_ui' => true,
        'show_in_menu' => true,
        'menu_position' => 5,
        'menu_icon' => get_stylesheet_directory_uri() . '/functions/panel/images/catchinternet-small.png',
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'query_var' => true,
        'can_export' => true,
        'rewrite' => array('slug' => 'themes/%themes_categories%','with_front' => FALSE),
        'public' => true,
        'has_archive' => 'themes',
        'capability_type' => 'post'
    );  
    register_post_type( 'themes', $args );//max 20 charachter cannot contain capital letters and spaces
}  

कस्टम पोस्ट रजिस्टर करते समय आपको कुछ बातें याद रखनी हैं। कस्टम पोस्ट प्रकार स्लग नाम के लिए has_archive पैरामीटर बदलें और दूसरा 'स्लग' => 'custom_post_type_slug /% taxonomy_slug% के रूप में फिर से लिखना स्लग नाम को बदलें

अब जब आप लिखने के बाद के प्रकार पृष्ठ में एक नया पोस्ट प्रकार जोड़ते हैं ... तो आपको http://www.example.com/wordpress/themes/%themes_categories%/post-name/ के रूप में अनुमति दिखाई देगी । यदि इस पद के लिए कस्टम टैक्सोनॉमी का चयन नहीं किया जाता है, तो पर्मलिंक http://www.example.com/wordpress/themes/%themes_categories%/post-name/ रहेगा जो तब खराब अनुरोध दिखाएगा। इसे ठीक करने के लिए हम कस्टम टैक्सोनॉमी में एक डिफ़ॉल्ट शब्द बनाते हैं। (श्रेणियों में समान श्रेणीबद्ध) इसे functions.php में जोड़ें

function default_taxonomy_term( $post_id, $post ) {
    if ( 'publish' === $post->post_status ) {
        $defaults = array(
            'themes_categories' => array( 'other'),   //

            );
        $taxonomies = get_object_taxonomies( $post->post_type );
        foreach ( (array) $taxonomies as $taxonomy ) {
            $terms = wp_get_post_terms( $post_id, $taxonomy );
            if ( empty( $terms ) && array_key_exists( $taxonomy, $defaults ) ) {
                wp_set_object_terms( $post_id, $defaults[$taxonomy], $taxonomy );
            }
        }
    }
}
add_action( 'save_post', 'default_taxonomy_term', 100, 2 );

अब जब कस्टम टैक्सोनॉमी को खाली छोड़ दिया जाता है तो permlaink http://www.example.com/wordpress/themes/other/post-name/ अपने आप बन जाता है ।

अंत में एडमिन सेक्शन में पर्मलिंक सेटिंग में सेव चेंजेस पर क्लिक करके रीराइट को फ्लश करना न भूलें अन्यथा आप 404 एरर में रिडायरेक्ट हो जाएंगे। आशा है कि यह आपकी मदद करता है।


अरे, मुझे एक समस्या थी ... जब हम इको get_the_term_list ($ post-> ID, $ taxonomy, '', ',', '' ') का उपयोग करके टैक्सोनॉमी आर्काइव का लिंक आउटपुट करते हैं; तब लिंक www.example.com/taxonomy-term के रूप में प्रकट होता है, न कि www.example.com/themes/taxonomy-term पर। मुझे लगता है कि हमें इसके लिए एक HTACESS नियम लिखने की आवश्यकता है।
सौरभ गोयल

+1, बढ़िया व्याख्या, इसके बाद कदम दर कदम और यह काम करता है, वर्डप्रेस 3.4.2 पर परीक्षण किया गया
एलेक्स वांग

1
मैं सोच रहा था: क्या आपको कस्टम पोस्ट प्रकार दर्ज करते समय टैक्सोनोमीज़ की सरणी में कस्टम टैक्सोनॉमी जोड़ना होगा? क्योंकि यह वहां भी जोड़े बिना काम कर रहा है (यदि आप पहले से कस्टम पोस्ट प्रकार के लिए एक वर्गीकरण दर्ज करते हैं)। बस उत्सुक।
ट्रेनोआसिस

URL को बदलने के लिए अपने पुनर्लेखन का उपयोग करते हुए CPT UI प्लगइन के साथ इसे आज़माया। सब अच्छा लग रहा है। URL सभी सही हैं और मैं पर्मलिंक को रीसेट कर देता हूं, लेकिन वास्तविक पोस्ट 404 फेंक रहे हैं। :( EDIT: nevermind। मैंने गुजर-बसर की और वर्गीकरण से श्रेणीबद्ध हटा दिया और उचित क्रम में चीजों को सहेजना भी सुनिश्चित किया। काम करने लगते हैं। याह!
गार्निस

1

यानी MY_NEW_CARSSकस्टम पोस्ट प्रकारों के लिए एक कस्टम टैक्सोनॉमी पंजीकृत करें :

$my_taxon_name  = 'MY_NEW_CARSS';
$my_post_types  = array('SUB_CAT_1','SUB_CAT_2','SUB_CAT_3');


//REGISTER CUSTOM TAXONOMY ( http://codex.wordpress.org/Function_Reference/register_taxonomy )
//If you aim to register HIERARCHICAL(Parent-ed) post type, read this warning: https://codex.wordpress.org/Function_Reference/register_post_type#hierarchical
add_action( 'init', 'my_f32' ); function my_f32() { 
    register_taxonomy( $GLOBALS['my_taxon_name'], array(), 
        array( 
            'label'=>$GLOBALS['my_taxon_name'],     'public'=>true, 'show_ui'=>true,  'show_admin_column'=>true,   'query_var'=>true,
            'hierarchical'=>true,   'rewrite'=>array('with_front'=>true,'hierarchical'=>true),  
             ));
}

//REGISTER CUSTOM POST TYPE ( http://codex.wordpress.org/Function_Reference/register_post_type )
add_action( 'init', 'myf_63' );function myf_63() { 

    foreach ($GLOBALS['my_post_types'] as $each_Type)       {
            register_post_type( $each_Type, 
                array( 
                    'label'=>$each_Type,     'labels' => array('name'=>$each_Type.' pagess', 'singular_name'=>$each_Type.' page'),        'public' => true,   'publicly_queryable'=> true,      'show_ui'=>true,      'capability_type' => 'post',      'has_archive' => true,      'query_var'=> true,     'can_export' => true,                   //'exclude_from_search' => false,     'show_in_nav_menus' => true,  'show_in_menu' => 'edit.php?post_type=page',//true,     'menu_position' => 5,
                    'hierarchical' =>true,
                    'supports' =>array( 'page-attributes', 'title', 'editor', 'thumbnail' ), 
                    'rewrite' => array('with_front'=>true, ),     //    'rewrite' => array("ep_mask"=>EP_PERMALINK ...) OR    'permalink_epmask'=>EP_PERMALINK, 
                ));

            register_taxonomy_for_object_type('category',$each_Type);       //standard categories
            register_taxonomy_for_object_type($GLOBALS['my_taxon_name'] ,$each_Type);   //Custom categories
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.