WordPress Multisite - genel kategoriler


21

Bir WP multisite örneği kurma - müşteri tüm içeriği bloglar arasında sınıflandırmak istedikleri mevcut bir ontolojiye / kategori grubuna sahiptir. Ayrıca arzu, herhangi bir yeni kategorinin 'ağ blogu' düzeyinde eklenmesi ve diğer bloglarla senkronize edilmesidir.

Bunu yapmanın en iyi yolu nedir?


Sanırım global bir değişkene atanmış kategoriler yapmak ve daha sonra tema init 'e almak.
kaiser

4
Bu sorunun 3.0'daki birden fazla blogda bir taksonomiyi paylaş ile aynı olduğunu düşünüyorum . Ancak bu soruya iyi bir cevap gelmedi. Bu ilginç bir soru, bunun için bir lütuf sunacağım.
Jan Fabry

Yanıtlar:


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

Bu ana siteye bir kategori eklendiğinde çalışacaktır . Bahsetmeye değer birkaç uyarı;

  • Eğer varsa çok bloglar, bu fonksiyon oldukça yoğun alabilirsiniz.
  • Ortalama olarak, blog başına 5 ila 8 sorgu (herhalde daha fazla) arasında çalışıyoruz - veritabanınızın hızına bağlı olarak, bu işlevin parçalanması gerekebilir.
  • Yalnızca yeni eklenen kategoriler 'senkronize edilir'. Kategori güncelleme ve silme işlemi yapılmaz (kodun revize edilmesi gerekir).
  • Yeni eklenen bir kategorinin ebeveyni varsa ve ebeveyn söz konusu çok siteli blogda bulunamazsa, kategori ebeveynsiz olarak oluşturulur (bu, yalnızca ana işlev bu işlev kurulmadan önce oluşturulmuşsa geçerlidir).

1
Bunu yapan bir eklenti var mı - veya olabilir mi? Düzenlemeler ve silme işlemleriyle birlikte mi? Ve hangi taksonomileri ve hangi alt sitelere uygulanacağını seçmek için bir ayarlar sayfası?
Marcus Downing,

Aslında, kodunuzu bir eklenti yazmak için başlangıç ​​noktası olarak kullansaydım itiraz eder miydiniz?
Marcus Downing

Hiç sorun değil - cevaplarım yığın borcunun lisansına giriyor, atfedilen cc-wiki gerekli :)
TheDeadMedic

11

Ah, pazar erteleme ...

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

  • Alows to bulk, ağa terimler ekle
  • Hangi sitelerin etkileneceğini seçebilirsiniz
  • Özel taksonomilerle çalışır
  • Silmez
  • Senkronize etmez

Bu son birkaç saat içinde yaptığım bir şey ve şimdi daha fazla test için zamanım yok. Neyse - benim için çalışıyor! .)

Bir şans ver. Uygulanan bir 'test çalıştırması' özelliği de vardır, böylece bir şey yapmadan önce sonucu kontrol edebilirsiniz.

Güncelleme -> Ekran Görüntüleri:

Eylemden önce:

Eylemden önce

Testten sonra:

Testten sonra

Yukarıda bağlanan eklenti kullanıcı arayüzü ekler, ancak önemli olan hemen hemen her şey bu işlevde olur:

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

Geri döneceğim ve bunu daha sonra daha fazla bilgi ile düzenleyeceğim (gerekirse).

Mükemmel olmaktan uzaktır (eklenti kafasındaki bilinen sorunları okuyun).
Herhangi bir geri bildirim takdir!


3
İnsanların sorulara cevap olarak eklentileri oluşturmasını seviyorum! Ödülünü hakediyorsun!
Jan Fabry

Desteğiniz için teşekkürler @Jan Fabry. Yanımda biri gerçekten bu şeyi yararlı bulursa mutlu olurum.
Michal Mau


5

TheDeadMedic'in cevabı iyi görünüyor, ancak soruna farklı bir yaklaşımla yaklaşdım. Aynı terimleri birçok sitede çoğaltmak yerine, diğer sitelerin ana sitenin tablolarını terimler için kullanmasını sağladım.

add_action('init', 'central_taxonomies');

function central_taxonomies () {
  global $wpdb;

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

Bu tablo adını değiştirir wp_2_termsile wp_termsKendi veritabanında ders kontrolünün emin size öneki değiştirirseniz farklı olabilir tabloların tam adı, yapmak için gereken vb.

Bunu bir eklentiden veya bir temadan çalıştırabilirsiniz (bir eklenti öneririm). Bir noktada bunu yapmak için bir eklenti yayınlamaya başlayabilirim. Bu yaklaşımın iki dezavantajı vardır:

  • Yalnızca eklentinin etkinleştirildiği alt sitelerde etkindir. Bunu ana siteden zorlamanın yolu yok.
  • Sadece seçili olanlar için değil tüm taksonomiler için geçerlidir .

Bu yaklaşım esnektir - yalnızca merkezi olandan değil, herhangi bir blogdan kategorileri çekmek için uyarlanabilir.


Güncelleme: Bunu yapmanız gerektiğinde, site genelinde etkinleştirilebilen bir eklenti haline getirdim: MU Merkezi Taksonomi


Bu yaklaşımda büyük bir sorun var: Görevler ve terimler arasındaki ilişkiler doğru olmayabilir. Term_relationships tablosu, bu kimliği kimliğe ve kimliğe dayalı olarak içerir. Ancak, alt sitelerdeki yayınların aynı kimliğe sahip olma olasılığı her zaman vardır. 1 yayına ilişkin terimlerin değiştirilmesi, başka bir blogdaki başka bir yayında öngörülemeyen bir etki yaratabilir.
Anh Tran

Doğru, term_relationshipstablo dahil edilmemelidir. Bu eklenti içinde çok uzun zaman önce tespit edip düzelttim, ancak eşleşecek bu cevabı hiç güncellemedi.
Marcus Downing

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.