web-dev-qa-db-ja.com

WordPress Multisite - グローバルカテゴリ

WPマルチサイトインスタンスを設定する - クライアントは既存のオントロジー/一連のカテゴリを持ち、ブログの全セットにわたってすべてのコンテンツを分類します。また、「ネットワークブログ」レベルで新しいカテゴリを追加して、他のブログと同期することを望んでいます。

これを行う最良の方法は何ですか?

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

メインサイトでカテゴリが added の場合はいつでもこれが実行されます。言及する価値があるいくつかの注意点/ポイント。

  • たくさんの がある場合、この関数はかなり集中的になるかもしれません。
  • 平均して、私たちは5から8クエリ(おそらくもっと)の間のどこかで実行しています ブログごと - この関数はチャンクされる必要があるかもしれません。
  • 新しく追加されたカテゴリのみが「同期」されます。カテゴリの更新や削除はそうではありません(コードを修正する必要があります)。
  • 新しく追加されたカテゴリに親があり、問題のマルチサイトブログ内にその親が見つからない場合、そのカテゴリは親なしで作成されます(この機能がインストールされる前に親カテゴリが作成された場合のみ).
13
TheDeadMedic

ああ、日曜日の先延ばし...

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

  • ネットワーク全体で用語を一括追加することが可能
  • どのサイトが影響を受けるかを選択できます
  • カスタム分類法と連携
  • 削除しない
  • 同期しない

これは私が過去数時間で私がしたことであり、私は今より多くのテストのための時間がありません。とにかく - それは私のために働く! 。)

試してみる。実際に何かをする前に結果を確認できるように実装された 'テスト実行'機能もあります。

更新 - >スクリーンショット:

行動の前に:

Before action

テスト実行後

After test run

上でリンクされたプラグインはユーザーインターフェースを追加しますが、ほとんどすべての重要なことはこの関数で起こります:

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

私は戻ってきて、後で必要に応じてもっと情報を付けてこれを編集します。

それは完全には程遠いです(プラグインヘッドの既知の問題を読んでください)。
どんなフィードバックも大歓迎です!

10
Michal Mau

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などに置き換えます。もちろんテーブルの正確な名前を確かめるためにあなたのデータベースをチェックするべきです、あなたが接頭辞を変えるならば異なるかもしれません。

あなたはプラグインかテーマのどちらからでもこれを実行することができます(私はプラグインをお勧めしますが)。私はある時点でこれをするためにプラグインを公開することに丸まるかもしれません。このアプローチには2つの欠点があります。

  • プラグインが有効になっている子サイトでのみ有効です。親サイトからこれを強制する方法はありません。
  • 選択されたものだけでなく、 all 分類法にも適用されます。

このアプローチは柔軟性があります - 中心的なものだけでなく、あらゆるブログからカテゴリを引き出すように適応させることができます。


更新: これをプラグインにしました。必要に応じてサイト全体で有効にすることができます: MU Central Taxonomies

4
Marcus Downing

はい、これは可能です。私は何年も前にWPMUのためにこのようなプラグインを構築しました(http://natureofmind.org/30/default-categories-for-new-blogs/がサポートされなくなりました)。もっと最新のものは以下の2つのプラグインでしょう: http://wordpress.org/extend/plugins/wpmu-new-blog-defaults/ および http://premium.wpmudev.org/project/new-blog-template

1
dwenaus