워드 프레스 멀티 사이트-글로벌 카테고리


21

WP 멀티 사이트 인스턴스 설정-클라이언트에는 기존 온톨로지 / 카테고리 세트가 있으며 블로그 세트에서 모든 컨텐츠를 분류하려고합니다. 또한 새로운 범주가 '네트워크 블로그'수준에서 추가되고 다른 블로그와 동기화되기를 원합니다.

가장 좋은 방법은 무엇입니까?


범주를 전역 변수에 할당 한 다음 테마를 init로 가져 오는 것으로 추측합니다.
— kaiser

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
이 작업을 수행하는 플러그인이 있습니까? 편집 및 삭제와 함께? 그리고 어떤 분류 및 적용 할 하위 사이트를 선택하기위한 설정 페이지?
— Marcus Downing

실제로 플러그인을 작성하기 위해 시작점으로 코드를 사용했다면 반대 할 것입니까?
— Marcus Downing

아무 문제없이-내 답변은 스택 교환의 라이센스에 해당하며 cc-wiki는 저작자 표시가 필요합니다 :)
— 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를 지원해 주셔서 감사합니다. 내 옆에있는 사람이 실제로이 기능을 유용하게 사용할 수 있다면 기쁠 것입니다.
— 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당신은 당신의 데이터베이스 물론 검사의 당신이 당신의 접두사를 변경 한 경우 다를 수 있습니다 테이블의 정확한 이름의 수 있도록해야한다 등.

플러그인 또는 테마에서 플러그인을 실행할 수 있습니다 (플러그인을 권장하지만). 플러그인을 게시하여 어느 시점 에서이 작업을 수행 할 수 있습니다. 이 방법에는 두 가지 단점이 있습니다.

  • 플러그인이 활성화 된 하위 사이트에서만 활성화됩니다. 상위 사이트에서이를 시행 할 방법이 없습니다.
  • 선택한 분류뿐만 아니라 모든 분류에 적용됩니다 .

이 접근 방식은 유연합니다. 중앙 블로그뿐만 아니라 모든 블로그에서 카테고리를 가져 오도록 조정할 수 있습니다.


업데이트 : 플러그인으로 만들었습니다. 필요한 경우 사이트 전체에서 활성화 할 수 있습니다 .MU Central Taxonomies


이 접근 방식에는 큰 문제가 있습니다. 게시물과 용어의 관계가 올바르지 않을 수 있습니다. term_relationships 테이블에는 게시물 ID 및 용어 ID를 기반으로하는이 관계가 포함됩니다. 그러나 하위 사이트의 게시물은 항상 동일한 ID를 가질 가능성이 있습니다. 1 개의 게시물에 대한 용어를 변경하면 다른 블로그의 다른 게시물에 예기치 않은 영향을 줄 수 있습니다.
— Anh Tran

맞습니다. term_relationships테이블이 포함되어서는 안됩니다. 플러그인에서 오래 전에 발견하고 수정했지만 일치하도록이 답변을 업데이트하지 않았습니다.
— Marcus Downing

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.