WordPress Multisite - danh mục toàn cầu


21

Thiết lập một thể hiện nhiều trang WP - ứng dụng khách có một bản thể / bộ danh mục hiện có mà họ muốn phân loại tất cả nội dung trên toàn bộ các blog. Ngoài ra, mong muốn là mọi danh mục mới sẽ được thêm ở cấp độ 'blog mạng' và được đồng bộ hóa với các blog khác.

Cách tốt nhất để làm điều này là gì?


tôi đoán việc tạo các danh mục được gán cho một biến toàn cục và sau đó nhập vào init theme.
kaiser

4
Tôi nghĩ rằng câu hỏi này giống như Chia sẻ một nguyên tắc phân loại trên nhiều blog trong 3.0 . Câu hỏi đó đã không nhận được một câu trả lời tốt tuy nhiên. Đó là một câu hỏi thú vị, tôi sẽ cung cấp một tiền thưởng cho nó.
Jan Fabry

Câu trả lời:


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' );

Điều này sẽ chạy bất cứ khi nào một thể loại được thêm vào trang web chính. Một vài cảnh báo / điểm đáng nói;

  • Nếu bạn có nhiều blog, chức năng này có thể trở nên khá chuyên sâu.
  • Trung bình, chúng tôi đang chạy bất cứ nơi nào từ 5 đến 8 truy vấn (có thể nhiều hơn) trên mỗi blog - tùy thuộc vào tốc độ cơ sở dữ liệu của bạn, chức năng này có thể cần phải được kiểm tra.
  • Chỉ các danh mục mới được thêm vào là 'được đồng bộ hóa'. Cập nhật và xóa các danh mục không (mã sẽ cần phải được sửa đổi).
  • Nếu một danh mục mới được thêm có cha mẹ và không thể tìm thấy cha mẹ trong blog nhiều trang đang được đề cập, danh mục sẽ được tạo mà không có cha mẹ (điều này chỉ nên xảy ra nếu danh mục chính được tạo trước khi chức năng này được cài đặt).

1
Có - hoặc có thể có - một plugin làm điều này? Cùng với chỉnh sửa và xóa? Và một trang cài đặt để chọn phân loại nào và trang web con nào sẽ áp dụng nó?
Marcus Downing

Trong thực tế, bạn có phản đối nếu tôi sử dụng mã của bạn làm điểm bắt đầu để viết plugin không?
Marcus Downing

Không có vấn đề gì - câu trả lời của tôi thuộc giấy phép trao đổi ngăn xếp, cc-wiki có yêu cầu ghi công :)
TheDeadMedic

11

Ôi, sự chần chừ ngày chủ nhật ...

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

  • Cho phép thêm số lượng lớn các điều khoản trên mạng
  • Bạn có thể chọn những trang web sẽ bị ảnh hưởng
  • Hoạt động với các nguyên tắc phân loại tùy chỉnh
  • Không xóa
  • Không đồng bộ hóa

Đây là điều tôi đã làm trong vài giờ qua và tôi không có thời gian để thử nghiệm thêm bây giờ. Dù sao - nó làm việc cho tôi! .)

Hãy thử một lần. Ngoài ra còn có một tính năng 'chạy thử' được triển khai để bạn có thể kiểm tra kết quả trước khi thực sự làm gì đó.

Cập nhật -> Ảnh chụp màn hình:

Trước khi hành động:

Trước khi hành động

Sau khi chạy thử:

Sau khi chạy thử

Plugin được liên kết ở trên thêm giao diện người dùng nhưng hầu hết mọi thứ quan trọng đều xảy ra trong chức năng này:

        <?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;
    } ?>

Tôi sẽ quay lại và chỉnh sửa nó với nhiều thông tin hơn sau (nếu cần).

Nó là xa hoàn hảo (đọc các vấn đề đã biết trong phần đầu plugin).
Bất kỳ thông tin phản hồi đánh giá cao!


3
Tôi thích nó khi mọi người tạo ra các plugin để trả lời các câu hỏi! Bạn xứng đáng với tiền thưởng!
Jan Fabry

Cảm ơn sự hỗ trợ của bạn @Jan Fabry. Tôi sẽ rất vui nếu ai đó bên cạnh tôi thực sự sẽ thấy điều này hữu ích.
Michal Mau


5

Câu trả lời của TheDeadMedic có vẻ tốt, nhưng cuối cùng tôi đã thực hiện một cách tiếp cận khác cho vấn đề. Thay vì sao chép các điều khoản tương tự trên nhiều trang web, thay vào đó tôi đã khiến các trang web khác sử dụng bảng của trang chủ cho các điều khoản.

add_action('init', 'central_taxonomies');

function central_taxonomies () {
  global $wpdb;

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

Điều này thay thế tên bảng wp_2_termsbằng wp_terms, v.v ... Tất nhiên bạn nên kiểm tra trong cơ sở dữ liệu của mình để đảm bảo tên chính xác của các bảng, có thể khác nếu bạn thay đổi tiền tố.

Bạn có thể chạy nó từ một plugin hoặc một chủ đề (mặc dù tôi khuyên bạn nên một plugin). Tôi có thể làm tròn để xuất bản một plugin để làm điều này tại một số điểm. Có hai nhược điểm của phương pháp này:

  • Nó chỉ hoạt động trên các trang web con có plugin được kích hoạt. Không có cách nào để thực thi điều này từ trang mẹ.
  • Nó áp dụng cho tất cả các nguyên tắc phân loại, không chỉ những người được chọn.

Cách tiếp cận này rất linh hoạt - nó có thể được điều chỉnh để lấy các danh mục từ bất kỳ blog nào, không chỉ là trung tâm.


Cập nhật: Tôi đã biến nó thành một plugin, có thể được kích hoạt trên toàn trang web nếu bạn cần nó là: Phân loại trung tâm MU


Có một vấn đề lớn với cách tiếp cận này: Mối quan hệ giữa các bài viết và các điều khoản có thể không chính xác. Bảng term_relationships chứa mối quan hệ này dựa trên ID bài đăng và ID thuật ngữ. Nhưng luôn có cơ hội rằng các bài đăng trong trang con có cùng ID. Thay đổi điều khoản cho 1 bài viết có thể ảnh hưởng không thể đoán trước trên một bài đăng khác trong một blog khác.
Anh Trần

Đúng, term_relationshipsbảng không nên được bao gồm. Tôi đã phát hiện và sửa nó từ lâu trong plugin, nhưng không bao giờ cập nhật câu trả lời này cho phù hợp.
Marcus Downing

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.