वर्डप्रेस मल्टीसाइट - वैश्विक श्रेणियां


21

WP मल्टीसाइट उदाहरण की स्थापना - क्लाइंट के पास एक मौजूदा ऑन्कोलॉजी / श्रेणियों का सेट है जो वे ब्लॉग के सेट में सभी सामग्री को वर्गीकृत करना चाहते हैं। यह भी इच्छा है कि किसी भी नई श्रेणियों को 'नेटवर्क ब्लॉग' स्तर पर जोड़ा जाएगा और अन्य ब्लॉगों के साथ समन्वयित किया जाएगा।

ऐसा करने का सबसे अच्छा तरीका क्या है?


मुझे लगता है कि एक वैश्विक चर को सौंपा श्रेणियों बनाने और फिर विषय init पर आयात करें।
कासर

4
मुझे लगता है कि यह सवाल 3.0 में कई ब्लॉगों पर एक कर का हिस्सा है । हालांकि उस सवाल का अच्छा जवाब नहीं मिला। यह एक दिलचस्प सवाल है, मैं इसके लिए एक इनाम की पेशकश करूंगा।
Jan Fabry

जवाबों:


14
function __add_global_categories( $term_id )
{
    if ( get_current_blog_id() !== BLOG_ID_CURRENT_SITE || ( !$term = get_term( $term_id, 'category' ) ) )
        return $term_id; // bail

    if ( !$term->parent || ( !$parent = get_term( $term->parent, 'category' ) ) )
        $parent = null;

    global $wpdb;

    $blogs = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}'" );
    foreach ( $blogs as $blog ) {
        $wpdb->set_blog_id( $blog );

        if ( $parent && ( $_parent = get_term_by( 'slug', $parent->slug, 'category' ) ) )
            $_parent_ID = $_parent->term_id;
        else
            $_parent_ID = 0;

        wp_insert_term( $term->name, 'category',  array(
            'slug' => $term->slug,
            'parent' => $_parent_ID,
            'description' => $term->description
        ));
    }

    $wpdb->set_blog_id( BLOG_ID_CURRENT_SITE );
}
add_action( 'created_category', '__add_global_categories' );

जब भी मुख्य साइट पर कोई श्रेणी जोड़ी जाएगी तो यह चलेगा । उल्लेख के लायक कुछ चेतावनी / बिंदु;

  • यदि आपके पास बहुत सारे ब्लॉग हैं, तो यह फ़ंक्शन बहुत गहन हो सकता है।
  • औसतन, हम प्रति ब्लॉग 5 से 8 प्रश्नों (संभवतः अधिक) के बीच कहीं भी चल रहे हैं - आपके डेटाबेस की गति के आधार पर, इस फ़ंक्शन को मंथन करने की आवश्यकता हो सकती है।
  • केवल नई जोड़ी गई श्रेणियां 'सिंक' हैं। अपडेट करना और श्रेणियां हटाना नहीं हैं (कोड को संशोधित करने की आवश्यकता होगी)।
  • यदि एक नई जोड़ी गई श्रेणी में माता-पिता हैं, और माता-पिता को प्रश्न में मल्टीसाइट ब्लॉग के भीतर नहीं पाया जा सकता है, तो श्रेणी बिना माता-पिता के साथ बनाई जाएगी (यह केवल तभी होनी चाहिए जब इस फ़ंक्शन को स्थापित करने से पहले मूल श्रेणी बनाई गई थी)।

1
वहाँ है - या वहाँ हो सकता है - एक प्लगइन जो ऐसा करता है? संपादन और विलोपन के साथ? और कौन सी टैक्सोनोमीज़ और कौन सी चाइल्ड साइट्स इसे चुनना है, इसे चुनने के लिए एक सेटिंग पेज?
मार्कस डाउनिंग

वास्तव में, यदि आप एक प्लगइन लिखने के लिए शुरुआती बिंदु के रूप में मैंने आपके कोड का उपयोग किया है, तो क्या आप पर आपत्ति करेंगे?
मार्कस डाउनिंग

कोई बात नहीं - जो भी हो, मेरे उत्तर स्टैक एक्सचेंज के लाइसेंस के तहत आते हैं, सीसी-विकी एट्रिब्यूशन के साथ आवश्यक :)
TheDeadMedic

11

ओह, रविवार की शिथिलता ...

https://github.com/maugly/Network-Terminator

  • पूरे नेटवर्क में शब्द जोड़ने की अनुमति देता है
  • आप यह चुन सकते हैं कि कौन सी साइट प्रभावित होगी
  • कस्टम टैक्सोनॉमी के साथ काम करता है
  • नहीं हटाता
  • सिंक नहीं करता है

यह कुछ ऐसा है जो मैंने पिछले कुछ घंटों में किया है और मेरे पास अब और परीक्षण के लिए समय नहीं है। वैसे भी - यह मेरे लिए काम करता है! ।)

कोशिश तो करो। इसमें 'टेस्ट रन' फीचर भी लागू किया गया है ताकि आप वास्तव में कुछ करने से पहले परिणाम की जांच कर सकें।

अपडेट -> स्क्रीनशॉट:

कार्रवाई से पहले:

कार्रवाई से पहले

टेस्ट रन के बाद:

टेस्ट रन के बाद

ऊपर जुड़ा प्लगइन उपयोगकर्ता इंटरफ़ेस जोड़ता है लेकिन इस फ़ंक्शन में बहुत महत्वपूर्ण सब कुछ होता है:

        <?php function mau_add_network_terms($terms_to_add, $siteids, $testrun = false) {

        // check if this is multisite install
        if ( !is_multisite() )
            return 'This is not a multisite WordPress installation.';

        // very basic input check
        if ( empty($terms_to_add) || empty($siteids) || !is_array($terms_to_add) || !is_array($siteids) )
            return 'Nah, I eat only arrays!';

        if ($testrun) $log = '<p><em>No need to get excited. This is just a test run.</em></p>';
        else $log = '';

        // loop thru blogs
        foreach ($siteids as $blog_id) :

            switch_to_blog( absint($blog_id) );

            $log .= '<h4>'.get_blog_details(  $blog_id  )->blogname.':</h4>';
            $log .= '<ul id="ntlog">';

            // loop thru taxonomies
            foreach ( $terms_to_add as $taxonomy => $terms ) {

                // check if taxonomy exists
                if ( taxonomy_exists($taxonomy) ) {
                    // get taxonomy name
                    $tax_name = get_taxonomy($taxonomy);
                    $tax_name = $tax_name->labels->name;

                    //loop thru terms   
                    foreach ( $terms as $term ) {

                        // check if term exists
                        if ( term_exists($term, $taxonomy) ) {
                            $log .= "<li class='notice' ><em>$term already exists in the $tax_name taxonomy - not added!</em></li>";

                        } else {

                            // if it doesn't exist insert the $term to $taxonomy
                            $term = strip_tags($term);
                            $taxonomy = strip_tags($taxonomy);
                            if (!$testrun)
                                wp_insert_term( $term, $taxonomy );
                            $log .= "<li><b>$term</b> successfully added to the <b>$tax_name</b> taxonomy</li>"; 
                        }
                    }
                } else {
                    // tell our log that taxonomy doesn't exists
                    $log .= "<li class='notice'><em>The $tax_name taxonomy doesn't exist! Skipping...</em></li>"; 
                }
            }

            $log .= '</ul>';    

            // we're done here
            restore_current_blog();

        endforeach;
        if ($testrun) $log .= '<p><em>No need to get excited. This was just the test run.</em></p>';
        return $log;
    } ?>

मैं वापस आऊंगा और इसे बाद में और जानकारी के साथ संपादित करूंगा (यदि आवश्यक हो)।

यह एकदम सही है (प्लगइन हेड में ज्ञात मुद्दों को पढ़ें)।
किसी भी प्रतिक्रिया की सराहना की!


3
मुझे यह पसंद है जब लोग सवालों के जवाब में प्लगइन्स बनाते हैं! आप इनाम के लायक हैं!
Jan Fabry

आपके समर्थन के लिए धन्यवाद @Jan Fabry मुझे खुशी होगी अगर मेरे साथ कोई व्यक्ति वास्तव में इस चीज को उपयोगी पाएगा।
मिशाल मौ


5

TheDeadMedic का जवाब अच्छा लग रहा है, लेकिन मैंने समस्या के बारे में एक अलग तरीका अपना लिया। कई साइटों पर समान शब्दों की नक़ल करने के बजाय, मैंने अन्य साइटों को शर्तों के लिए होम साइट की तालिकाओं का उपयोग करने के लिए बनाया।

add_action('init', 'central_taxonomies');

function central_taxonomies () {
  global $wpdb;

  $wpdb->terms = "wp_terms";
  $wpdb->term_taxonomy = "wp_term_taxonomy";
}

यह तालिका के नाम के wp_2_termsसाथ बदलता है wp_terms, आदि। आपको निश्चित रूप से तालिकाओं के सटीक नाम के बारे में सुनिश्चित करने के लिए अपने डेटाबेस में जांच करनी चाहिए, जो आपके उपसर्ग को बदलने पर भिन्न हो सकती है।

आप इसे एक प्लगइन या एक थीम से चला सकते हैं (हालांकि मैं एक प्लगइन की सलाह देता हूं)। मुझे कुछ बिंदु पर ऐसा करने के लिए एक प्लगइन प्रकाशित करने के लिए दौर मिल सकता है। इस दृष्टिकोण के दो डाउनसाइड हैं:

  • यह केवल उन चाइल्ड साइट्स पर सक्रिय है जिनके पास प्लगइन सक्रिय है। मूल साइट से इसे लागू करने का कोई तरीका नहीं है।
  • यह सभी टैक्सोनॉमी पर लागू होता है , न कि केवल चयनित लोगों पर।

यह दृष्टिकोण लचीला है - इसे किसी भी ब्लॉग से श्रेणियों को खींचने के लिए अनुकूलित किया जा सकता है, न कि केवल केंद्रीय एक पर।


अद्यतन: मैंने इसे एक प्लगइन में बनाया है, जिसे साइट-वाइड सक्रिय किया जा सकता है यदि आपको इसकी आवश्यकता है: एमयू केंद्रीय वर्गीकरण


इस दृष्टिकोण के साथ एक बड़ी समस्या है: पदों और शर्तों के बीच संबंध सही नहीं हो सकते हैं। तालिका term_relationships में यह संबंध पोस्ट आईडी और टर्म आईडी पर आधारित है। लेकिन इस बात की संभावना हमेशा रहती है कि उप-पोस्ट में समान आईडी हो। 1 पद के लिए परिवर्तन करने से किसी अन्य ब्लॉग में किसी अन्य पोस्ट पर अप्रत्याशित प्रभाव पड़ सकता है।
आह त्रान

सही, term_relationshipsतालिका में शामिल नहीं होना चाहिए। मैंने प्लगइन में बहुत पहले स्पॉट किया और तय किया, लेकिन मैच के इस उत्तर को कभी भी अपडेट नहीं किया।
मार्कस डाउनिंग

1

हाँ यह संभव है। मैंने WPMU उम्र के लिए इस तरह से एक प्लगइन का निर्माण किया (http://natureofmind.org/30/default-categories-for-new-blogs/ लेकिन अब समर्थित नहीं) अधिक अद्यतित करने के लिए निम्नलिखित दो प्लगइन्स होंगे: http : //wordpress.org/extend/plugins/wpmu-new-blog-defaults/ और http://premium.wpmudev.org/project/new-blog-template

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