WordPressマルチサイト-グローバルカテゴリ


21

WPマルチサイトインスタンスのセットアップ-クライアントには、ブログセット全体のすべてのコンテンツを分類したい既存のオントロジー/カテゴリセットがあります。また、新しいカテゴリが「ネットワークブログ」レベルで追加され、他のブログと同期されることも望まれます。

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


カテゴリをグローバル変数に割り当ててから、テーマの初期化でインポートすると思います。
カイザー

4
この質問は、3.0の複数のブログで1つの分類を共有するのと同じだと思います。しかし、その質問には良い答えが得られませんでした。それは興味深い質問です、私はそれのために賞金を提供します。
ヤンファブリー

回答:


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
これを行うプラグインはありますか?編集や削除と一緒に?そして、どの分類法とどの子サイトを適用するかを選択するための設定ページ?
マーカスダウニング

実際、プラグインを作成するための出発点としてコードを使用した場合、反対しますか?
マーカスダウニング

全く問題なし-帰属と私の答えは、スタック交換のライセンスの下で落ち、CC-ウィキ:)は必要ありません
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のサポートに感謝します。私のそばに誰かが実際にこのことを見つけてくれると嬉しいです。
ミカルマウ


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などに置き換えられます。もちろん、データベースをチェックインして、テーブルの正確な名前を確認する必要があります。これは、プレフィックスを変更すると異なる場合があります。

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

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

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


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


このアプローチには大きな問題があります。投稿と用語の関係が正しくない可能性があります。term_relationshipsテーブルには、投稿IDと期間IDに基づくこの関係が含まれています。ただし、サブサイトの投稿に同じIDが付いている可能性は常にあります。1つの投稿の用語を変更すると、別のブログの別の投稿に予測できない影響を与える可能性があります。
アントラン

正しい、term_relationshipsテーブルを含めるべきではありません。私はプラグインでずっと前にそれを見つけて修正しましたが、一致するようにこの答えを更新しませんでした。
マーカスダウニング

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.