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


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_termswp_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.