WordPress Multisite - หมวดหมู่ทั่วโลก


21

การตั้งค่าอินสแตนซ์ WP multisite - ไคลเอนต์มี ontology / ชุดหมวดหมู่ที่มีอยู่ที่พวกเขาต้องการจัดหมวดหมู่เนื้อหาทั้งหมดในชุดของบล็อก ความปรารถนาก็คือหมวดหมู่ใหม่ใด ๆ จะถูกเพิ่มในระดับ 'บล็อกเครือข่าย' และซิงค์กับบล็อกอื่น ๆ

วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?


ฉันเดาว่าการกำหนดหมวดหมู่ให้กับตัวแปรโกลบอลจากนั้นอิมพอร์ตบนธีม 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 ข้อความค้นหา (อาจมากกว่า) ต่อบล็อก - ทั้งนี้ขึ้นอยู่กับความเร็วของฐานข้อมูลของคุณฟังก์ชั่นนี้อาจต้องถูกบีบอัด
  • หมวดหมู่ที่เพิ่งเพิ่มใหม่เท่านั้นที่จะ 'ซิงค์' การอัปเดตและการลบหมวดหมู่ไม่ใช่ (ต้องแก้ไขรหัส)
  • หากหมวดหมู่ที่เพิ่งเพิ่มเข้าไปนั้นมี parent และไม่สามารถพบ parent ได้ใน multisite blog ที่เป็นปัญหาหมวดหมู่นั้นจะถูกสร้างขึ้นโดยไม่มี parent (กรณีนี้จะเกิดขึ้นได้ก็ต่อเมื่อมีการสร้างหมวดหมู่ parent ก่อนหน้าที่จะติดตั้ง)

1
มีหรือไม่มีปลั๊กอินที่ทำสิ่งนี้ พร้อมกับการแก้ไขและการลบ? และหน้าการตั้งค่าเพื่อเลือก taxonomies และไซต์ย่อยที่จะใช้กับอะไร
Marcus Downing

ที่จริงแล้วคุณจะคัดค้านถ้าฉันใช้รหัสของคุณเป็นจุดเริ่มต้นในการเขียนปลั๊กอินหรือไม่?
Marcus Downing

ไม่มีปัญหาใด ๆ - คำตอบของฉันตกอยู่ภายใต้ใบอนุญาตแลกเปลี่ยนสแต็ค, cc-wiki พร้อมการระบุแหล่งที่มา :)
TheDeadMedic

11

โอ้การผัดวันประกันพรุ่งในวันอาทิตย์ ...

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

  • แจ้งให้เพิ่มข้อกำหนดจำนวนมากข้ามเครือข่าย
  • คุณสามารถเลือกไซต์ที่จะได้รับผลกระทบ
  • ทำงานร่วมกับ taxonomies ที่กำหนดเอง
  • ไม่ลบ
  • ไม่ซิงค์

นี่คือสิ่งที่ฉันทำในไม่กี่ชั่วโมงที่ผ่านมาและฉันไม่มีเวลาสำหรับการทดสอบเพิ่มเติมในขณะนี้ อย่างไรก็ตาม - มันใช้งานได้สำหรับฉัน! .)

ให้มันลอง. นอกจากนี้ยังมีคุณสมบัติ "ทดสอบการทำงาน" ที่ใช้งานเพื่อให้คุณสามารถตรวจสอบผลลัพธ์ก่อนที่จะทำอะไรบางอย่าง

อัปเดต -> ภาพหน้าจอ:

ก่อนดำเนินการ:

ก่อนลงมือปฏิบัติ

หลังจากทดสอบการทำงาน:

หลังจากทดสอบการทำงาน

ปลั๊กอินที่ลิงก์ด้านบนเพิ่มส่วนต่อประสานกับผู้ใช้ แต่ทุกสิ่งที่สำคัญเกิดขึ้นในฟังก์ชั่นนี้:

        <?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 ฉันจะมีความสุขถ้ามีคนข้างฉันจะพบว่าสิ่งนี้มีประโยชน์
Michal Mau


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ฯลฯ คุณควรตรวจสอบฐานข้อมูลของคุณเพื่อให้แน่ใจว่ามีชื่อที่แน่นอนของตารางซึ่งอาจแตกต่างกันหากคุณเปลี่ยนคำนำหน้า

คุณสามารถเรียกใช้จากปลั๊กอินหรือชุดรูปแบบ (แม้ว่าฉันจะแนะนำปลั๊กอิน) ฉันอาจได้รับการเผยแพร่ปลั๊กอินเพื่อทำเช่นนี้ในบางจุด วิธีการนี้มีข้อเสียสองประการ:

  • มันใช้งานได้เฉพาะบนไซต์ย่อยที่เปิดใช้งานปลั๊กอิน ไม่มีวิธีในการบังคับใช้สิ่งนี้จากไซต์แม่
  • มันใช้กับtaxonomies ทั้งหมดไม่ใช่เฉพาะที่เลือกไว้

วิธีนี้มีความยืดหยุ่นสามารถปรับให้ดึงหมวดหมู่จากบล็อกใด ๆ ก็ได้ไม่ใช่แค่ศูนย์กลาง


อัปเดต:ฉันได้ทำสิ่งนี้ลงในปลั๊กอินซึ่งสามารถเปิดใช้งานได้ทั่วทั้งไซต์หากคุณต้องการเป็น: MU Central Taxonomies


มีปัญหาใหญ่กับวิธีนี้: ความสัมพันธ์ระหว่างการโพสต์และคำอาจไม่ถูกต้อง term_relationships ตารางประกอบด้วยความสัมพันธ์นี้ขึ้นอยู่กับโพสต์ ID และ ID คำ แต่มีโอกาสเสมอที่การโพสต์ในไซต์ย่อยมี ID เดียวกัน การเปลี่ยนคำสำหรับโพสต์ 1 โพสต์อาจส่งผลกระทบต่อการโพสต์อื่นในบล็อกอื่น
Anh Tran

ถูกต้องterm_relationshipsไม่ควรรวมตาราง ฉันเห็นและแก้ไขที่นานมาแล้วในปลั๊กอิน แต่ไม่เคยปรับปรุงคำตอบนี้ให้ตรงกัน
Marcus Downing

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.