एक कस्टम टैक्सोनॉमी में एक शब्द सम्मिलित करना


9

इस कस्टम टैक्सोनॉमी को बनाया है जो सिंगल पोस्ट पर लेआउट को नियंत्रित करेगा, मूल रूप से मैं दो विकल्प जोड़ना चाहता हूं, लेआउट 1 और लेआउट 2।

// Register Custom Taxonomy
function custom_taxonomy() {

    $labels = array(
        'name'                       => _x( 'Layout', 'Taxonomy General Name', 'text_domain' ),
        'singular_name'              => _x( 'Layout', 'Taxonomy Singular Name', 'text_domain' ),
        'menu_name'                  => __( 'Taxonomy', 'text_domain' ),
        'all_items'                  => __( 'All Items', 'text_domain' ),
        'parent_item'                => __( 'Parent Item', 'text_domain' ),
        'parent_item_colon'          => __( 'Parent Item:', 'text_domain' ),
        'new_item_name'              => __( 'New Item Name', 'text_domain' ),
        'add_new_item'               => __( 'Add New Item', 'text_domain' ),
        'edit_item'                  => __( 'Edit Item', 'text_domain' ),
        'update_item'                => __( 'Update Item', 'text_domain' ),
        'separate_items_with_commas' => __( 'Separate items with commas', 'text_domain' ),
        'search_items'               => __( 'Search Items', 'text_domain' ),
        'add_or_remove_items'        => __( 'Add or remove items', 'text_domain' ),
        'choose_from_most_used'      => __( 'Choose from the most used items', 'text_domain' ),
        'not_found'                  => __( 'Not Found', 'text_domain' ),
    );
    $capabilities = array(
        'manage_terms' => 'foobar',
        'edit_terms'   => 'foobar',
        'delete_terms' => 'foobar',
        'assign_terms' => 'foobar' 
    );
    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => false,
        'show_in_nav_menus'          => false,
        'show_tagcloud'              => false,
        'capabilities'               => $capabilities,
    );
    register_taxonomy( 'Layout', array( 'post' ), $args );

}

// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );

शर्तों को संपादित करने से रोकने के लिए क्षमताएं अमान्य मानों पर सेट हैं, लेकिन मैं wp_insert_term काम नहीं कर सकता।

मेरे कस्टम टैक्सोनॉमी में दो शर्तें जोड़ना इतना कठिन नहीं हो सकता है, है ना?

किसी शब्द को सम्मिलित करने के लिए इसका उपयोग करना काम नहीं करता है, हालाँकि यदि मैंने अपना कस्टम टैक्सोनॉमी नाम बदलकर 'श्रेणी' कर दिया है, तो WP डिफ़ॉल्ट यह ठीक काम करता है। क्या देता है?

function example_insert_category() {
    $parent_term = term_exists( 'layout' ); // array is returned if taxonomy is given
$parent_term_id = $parent_term['term_id']; // get numeric term id
    wp_insert_term(
        'Example Category',
        'layout',
        array(
          'description' => 'This is an example category created with wp_insert_term.',
          'slug'        => 'example-category'
        )
    );
}
add_action( 'after_setup_theme', 'example_insert_category' );

जैसा कि वादा किया गया था, मैंने कोड को प्लगइन में पोस्ट किया। आशा है कि यह मदद करता है :-)
Pieter Goosen

जवाबों:


12

EDIT 2

जैसा कि वादा किया गया है, यहां प्लगइन का कोड है।

यह एक ज्ञात तथ्य है कि कस्टम टैक्सोनॉमी और कस्टम पोस्ट प्रकार एक प्लगइन में जाने चाहिए, और आपके विषय में नहीं । मैंने अपने प्लगइन से भागों को छीन लिया है।

यह काम किस प्रकार करता है

प्लगइन के माध्यम से टैक्सोनॉमी सामान्य के रूप में पंजीकृत है। इस संबंध में किसी भी जानकारी के लिए, आप जाकर देख सकते हैं register_taxonomy। जिस हिस्से को मुझे उजागर करने की आवश्यकता थी और जो इस प्रश्न के लिए प्रासंगिक है, वह यह है कि नई शर्तें कैसे डालें।

के माध्यम से शब्दों को सम्मिलित करने के लिए wp_insert_termsत्वरित और आसान हैं, लेकिन यह कोड लोडिंग समय को भी चोट पहुंचा सकता है यदि सही तरीके से उपयोग नहीं किया जाता है। विचार उस फ़ंक्शन को एक बार चलाने के लिए है, और फिर कभी नहीं, लगभग पहले रन के बाद इसे हटाने की तरह।

इसे पूरा करने के लिए, आप अपने फ़ंक्शन को हुक करने जा रहे हैं register_activation_hook। यह हुक एक बार चलता है, अर्थात जब प्लगइन सक्रिय हो जाता है, तो यह पेज रिफ्रेश पर फिर से नहीं चलेगा। केवल एक बार फिर से आग लग जाएगी जब प्लगइन निष्क्रिय हो जाता है और फिर से सक्रिय होता है

इसलिए आपको सबसे पहले अपनी टैक्सोनॉमी को पंजीकृत करने की आवश्यकता है क्योंकि आप ऐसे टैक्सोनॉमी की शर्तें नहीं बता सकते जो मौजूद नहीं है। एक बार आपकी टैक्सोनॉमी पंजीकृत हो जाने के बाद, आप अपनी शर्तें सम्मिलित कर सकते हैं। याद रखें, यह क्रिया केवल एक बार होगी, और वह तब जब प्लगइन सक्रिय हो। यदि आपको शर्तें जोड़ने की आवश्यकता है, तो आपको प्लगइन को निष्क्रिय करना होगा और इसे फिर से सक्रिय करना होगा

आप पहले यह भी जाँचना चाहते हैं कि कोई शब्द बनाने और डालने की कोशिश करने से पहले मौजूद है या नहीं।

यहाँ प्लगइन कोड है

<?php
/**
Plugin Name: Create terms
Plugin URI: http://wordpress.stackexchange.com/q/163541/31545
Description: Create terms
Version: 1.0
Author: Pieter Goosen
License: GPLv2 or later
*/
class Test_Terms {

    function __construct() {
        register_activation_hook( __FILE__,array( $this,'activate' ) );
        add_action( 'init', array( $this, 'create_cpts_and_taxonomies' ) );
    } 

    function activate() {
        $this->create_cpts_and_taxonomies();
        $this->register_new_terms();
    }

    function create_cpts_and_taxonomies() {

        $args = array( 
            'hierarchical'                      => true,  
            'labels' => array(
                'name'                          => _x('Test Tax', 'taxonomy general name' ),
                'singular_name'                 => _x('Test Tax', 'taxonomy singular name'),
                'search_items'                  => __('Search Test Tax'),
                'popular_items'                 => __('Popular Test Tax'),
                'all_items'                     => __('All Test Tax'),
                'edit_item'                     => __('Edit Test Tax'),
                'edit_item'                     => __('Edit Test Tax'),
                'update_item'                   => __('Update Test Tax'),
                'add_new_item'                  => __('Add New Test Tax'),
                'new_item_name'                 => __('New Test Tax Name'),
                'separate_items_with_commas'    => __('Seperate Test Tax with Commas'),
                'add_or_remove_items'           => __('Add or Remove Test Tax'),
                'choose_from_most_used'         => __('Choose from Most Used Test Tax')
            ),  
            'query_var'                         => true,  
            'rewrite'                           => array('slug' =>'test-tax')        
        );
        register_taxonomy( 'test_tax', array( 'post' ), $args );
    }

    function register_new_terms() {
        $this->taxonomy = 'test_tax';
        $this->terms = array (
            '0' => array (
                'name'          => 'Tester 1',
                'slug'          => 'tester-1',
                'description'   => 'This is a test term one',
            ),
            '1' => array (
                'name'          => 'Tester 2',
                'slug'          => 'tester-2',
                'description'   => 'This is a test term two',
            ),
        );  

        foreach ( $this->terms as $term_key=>$term) {
                wp_insert_term(
                    $term['name'],
                    $this->taxonomy, 
                    array(
                        'description'   => $term['description'],
                        'slug'          => $term['slug'],
                    )
                );
            unset( $term ); 
        }

    }
}
$Test_Terms = new Test_Terms();

EDIT 1

शब्द डालने में आपकी समस्या आपके हुक की है। after_setup_themeपहले चलाता है init, जिसका अर्थ है कि आप एक वर्गीकरण के लिए एक शब्द डालने की कोशिश कर रहे हैं जो अभी तक पंजीकृत नहीं है।

मेरा सुझाव है कि आप अपने wp_insert_termकार्य को अपने init फ़ंक्शन के अंदर ले जाएं , बस नीचेregister_taxonomy

यह भी सलाह दी जाती है कि अगर term_existsडालने से पहले कोई शब्द मौजूद है (तो ) की जाँच करें

उदाहरण:

// Register Custom Taxonomy
function custom_taxonomy() {

   //CODE TO REGISTER TAXONOMY

   if( !term_exists( 'Example Category', 'layout' ) ) {
       wp_insert_term(
           'Example Category',
           'layout',
           array(
             'description' => 'This is an example category created with wp_insert_term.',
             'slug'        => 'example-category'
           )
       );
   }
}

// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );

कृपया ध्यान दें, यह अप्रयुक्त है

मूल ANSWER

कस्टम टैक्सोनॉमी नामों (और कस्टम पोस्ट टाइप नामों) को नियमों के एक बहुत विशिष्ट सेट का पालन करने की आवश्यकता होती है, अन्यथा आप उन नुकसानों का सामना करेंगे, जिनके लिए कोई काम नहीं है।

कस्टम टैक्सोनॉमी (और कस्टम पोस्ट प्रकार) के नाम चुनते समय यहां एक गाइड लाइन दी गई है

  1. कस्टम टैक्सोनॉमी नामों और कस्टम पोस्ट प्रकार नामों में निम्नलिखित की अनुमति नहीं है

    • बड़े अक्षर या ऊँट

    • अंडरस्कोर ( _) को छोड़कर किसी भी प्रकार का विशेष चरित्र

    • रिक्त स्थान

    • वर्गीकरण के लिए 32 से अधिक वर्ण और पोस्ट प्रकार के लिए 20

    • किसी भी आरक्षित नाम , और कृपया ध्यान दें, यह किसी भी कस्टम नामकरण सम्मेलन के लिए जाता है , न कि केवल कर नाम के नाम।

  2. यदि एक वर्गीकरण नाम में एक से अधिक शब्द हैं, तो उन्हें अंडरस्कोर द्वारा अलग करना होगा, न कि हाइफ़न ( -)। मुझे चुनौती दी गई है कि हाइफ़न, टैक्सोनॉमी नामों के लिए URL में एसईओ के लिए जाने का तरीका है। यह सच है, यही कारण है कि आपके URL को तदनुसार समायोजित करने के लिए नियम फिर से लिखे गए हैं। URL एसईओ उद्देश्यों के लिए कभी भी टैक्सोनॉमी नाम या पोस्ट प्रकार के नाम न बदलें

साथ ही, आपको उस अजीब क्षमताओं को दूर करना चाहिए। यह एक समस्या भी पैदा कर सकता है

यदि यह आपकी समस्या को हल नहीं करता है, तो कृपया उस कोड को जोड़ें जिसका आप उपयोग करते हैं wp_insert_term

संदर्भ:


स्रोत को देखने के बाद मैं थोड़ा स्तब्ध हो जाता हूं, क्योंकि तर्क पर सेट होने $taxonomyपर पैरामीटर बिल्कुल भी साफ नहीं होता query_varहै true। वास्तव में काफी अविश्वसनीय है। और अन्यथा यह स्वच्छता के माध्यम से हो जाता है sanitize_title_with_dashes(), जो सभी जगह शगुन के स्थान पर सामानों को बदल देगा। जो अविश्वसनीय है, क्योंकि उनका उपयोग नहीं किया जाना चाहिए।
निकोलई

इस तथ्य के अलावा, आप शुरुआत में भी, कहीं भी, जैसे भी नंबर का उपयोग कर सकते हैं, हालांकि आप हर जगह पढ़ सकते हैं कि ऐसा नहीं किया जाना चाहिए। हालांकि संख्या के खिलाफ एक निश्चित कारण नहीं मिल सका। डैश के विपरीत, कम से कम एक बयान था »इसके अलावा, यदि पोस्ट प्रकार में डैश शामिल हैं, तो आप कस्टम पोस्ट प्रकार के व्यवस्थापक पृष्ठ पर कॉलम नहीं जोड़ पाएंगे ('प्रबंधन_ <कस्टम पोस्ट प्रकार का नाम> _posts_colorts' कार्रवाई) के कोडेक्स पेज पर register_post_type()
निकोलई

1
वर्डप्रेस में इसकी खामियां हैं, सहमत होना चाहिए। कुछ वास्तविक अपराध हैं :-)। मुझे लगता है कि डैश सबसे अधिक चर्चा वाले विषय में से एक है और नामों में भी इसका सबसे अधिक उपयोग किया जाता है। जब आप टेम्पलेट पदानुक्रम को देखना शुरू करते हैं तो इसकी विफलता काफी स्पष्ट होती है। एक डैश द्वारा अलग किए गए मेरे-टैक्सोनॉमी जैसे दो शब्दों के साथ एक टैक्सोनॉमी बनाएं, और एक टैक्सोनॉमी टेम्पलेट टैक्सोनॉमी-माय-टैक्सोनॉमी बनाएं। एफपीपी और आप विफलता देखेंगे। मैंने नंबर की चीज़ को कहीं पढ़ा है, फिर से उसे फिर से जाँचने की ज़रूरत है। यह एक सुरक्षित सूची है जिसे मैं हमेशा सुरक्षित रहने के लिए उपयोग करता हूं, और इसने पूरी तरह से काम किया है। आपकी सभी जानकारी के लिए धन्यवाद, सराहना की
Pieter Goosen

1
जैसा कि मैंने किया है, लेकिन सिर्फ इसलिए कि मैंने शुरुआत से इसे सही तरीके से सीखा। जैसा कि मैंने वर्डप्रेस डेवलपमेंट और यहां के स्मार्ट और अनुभवी लोगों से सबसे अधिक सीखा है। इसलिए बहुत सारी गलतियाँ हैं जो मैंने वास्तव में कभी नहीं कीं।
निकोलई

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