web-dev-qa-db-ja.com

共有コンテンツだがメインサイトで「更新可能」

私は先週かなり多くの研究をしてきました、そして私の問題を解決する確かな答えを見つけることができませんでした。だから、私は誰かが私の問題を解決する方法を知っているかどうかを確かめるためにここに来ることにしました。

私はWordPress Multisiteを使って、ユーザーがサイトに登録し、自分たちに提供するコンテンツを自分のものとして再ブランド化できるようにするプロジェクトに取り組んでいます。彼らが他の不動産業者に(有料で)配付し、彼らのロゴと連絡先情報でそれをブランド化することを可能にしたいという不動産業者情報の膨大な量。

そのため、すべてのコンテンツがすでにプリロードされているテンプレートサイトを作成するのは簡単です。 MSが新しいサイトを作成すると、テンプレートを取得し、そのテンプレートを使用して新しいサイトを作成します。

ただし、このコンテンツをすべてのサイトで変更できるようにする必要があります。これらすべてのサイトで「共有」する必要があるページは約50ページあります。変更する必要がある場合は、全面的に変更する必要があります。私はこれを使ってみました

<?php switch_to_blog(1); ?>
Some code that displays the menu of the Main Blog
<?php restore_current_blog(); ?>

しかし、それはすべてをメインサイトにリンクさせるでしょう(それはあなた自身のものとしてブランド化されたコンテンツを持つために支払うという目的を無効にします)。私はあなたがすべてのあなたのサイトに投稿を放送することを可能にするプラグインを見つけました、しかしこれはプリロードされるコンテンツです。

これらすべてのことを言って、私はこのあたりの誰かが以前にこれをしたことがあって、そして問題に関する若干の専門知識を共有しても構わないと思っています。これを見てくれてありがとう!


EDIT#1

私はStackExchangeでここだけでなくWordPressサポートフォーラムを通して私の研究をしました。

ワードプレスサイト間でコンテンツを共有する方法はありますか ::このオプションは私にはうまくいきません - ユーザーに課金する必要があります。彼らの新しいサイトを設定し、彼らに彼らのサイトに彼らのドメイン名を追加するオプションを与える、それがMultisiteが私が行く必要があると私が考える方法である理由です。

再ブログ - WP MSサポートフォーラム ::これが私が最も見つけたものです - コンテンツを再ブログする方法すべてのプラットフォームで私がみんなに投稿を撃つ必要があるなら、それは素晴らしいことです。しかし、これは私がやりたいことではありません。

まさに私が探しているもの ::しかし残念ながら答えはありません。

WordPress Answersで「マルチサイトコンテンツ共有」のバリエーションを検索しましたが、自分のトピックに関するもの(#3以外)は見つかりませんでした(または一般的に探しているもの)。


EDIT#2

それで、昨日もう少し調査をした後、私は ThreeWP Broadcast を見つけました。実際に必要なことはかなり多く行われていますが、最初の数日間の研究では隠れていました。それはあなたが同様にそれらのページへの更新を送るのと同様にすべてのサブサイトを通してページを放送することを可能にします。驚くばかり!それで、新しい質問が起こります。私のクライアントは、エンドユーザーが自分のコンテンツを編集することを望まない(著作権および法的理由)。だから、私は自動的にバックエンドの編集ページの上部にいくつかのJSを追加するいくつかのコードを書いた:

function hidePublishingNow() {
global $blog_id, $wpdb;
$prefix = "ssr_";


if(is_super_admin()) {}
else {



    $page = $_GET['post'];
    $pageFound = false;


    if($page > 0 && isset($blog_id)) {
        $sql = "SELECT * FROM ssr__3wp_broadcast_broadcastdata WHERE blog_id = $blog_id";
        $results = $wpdb->get_results($sql, "ARRAY_A");

        foreach($results as $r) {
            if($r['post_id'] == $page) { $pageFound = true; }
            else {}
        }

        if($pageFound == true) {
            wp_enqueue_script(
                'hide-publishing',
                get_template_directory_uri() . '/js/removePublishing.js',
                array('jquery')
            );
        }
    } else {}
}

add_action( 'admin_head'、 'hidePublishingNow');

基本的に、post.phpが管理パネル内にロードされると、現在編集中のページがBroadcasting経由で接続されているページかどうかを確認します。接続されている場合は、JSがロードされ、そのページのすべての要素が削除されて警告に置き換えられます。エンドユーザーはエディタにコンテンツを表示したり、ページを更新したりすることはできません。

それはうまくいっています。これが私がやらなければならないものであるならば、それは素晴らしいです - それは私がまだ見つけた最も良い解決策です。loveにしたいのは、メインのコントロールを掌握することですwp-admin/edit.php?post_type=pagepage(管理パネルには編集可能なすべてのページが表示されます)そのリストを作成しているときにWPアクションをインターセプトし、そのリストを作成している間に特定のページを削除することは素晴らしいことです。それでもそれが可能であるかどうかを確かめるために研究を続けています。私はただ誰かがアドバイスの言葉を持っている場合、または他の誰かがこの同じ問題に遭遇している場合は先を見越してここで私の進歩を更新したいと思いました。


4
Chris LaFay

メインサイトが更新されたときにサブサイトを更新することができます。重複したコンテンツの投稿IDがメインサイトの同じ投稿と同じであると仮定すると、メインサイト上でのみ実行され、サブサイトごとに更新が保存されるたびにプラグインを作成できます。

add_action('save_post','wase87206_broadcast');

function wase87206_broadcast($post_id) {
  $mainurl = get_option('siteurl');
  $post = get_post($ost_id);
  $blogs = get ids of all valid sub sites
  foreach ($blogs as $blogid) {
    switch_to_blog($blogid);
    $siteurl = get_option('siteurl');
    $post->post_content = str_replace($mainurl,$siteurl,$post->post_content); // fix links
    wp_update_post($post);
  }
  switch_to_blog(1); // set context back to main site
}

NOTE:これはコードのスケルトンにすぎません。以下にコメントしたように、リビジョン、自動保存、または特定の内容を複製したくない場合があります。メインサイトにのみ表示されるべきです。ここで省略されたもう一つの事はポスト削除の取り扱いです。

カテゴリとタグ、およびメタデータを同期するには、同じ種類のコードが必要です。画像を最も簡単に同期させるには、サブサイトのアップロードディレクトリからメインサイトのアップロードディレクトリへのシンボリックリンクを作成します。

このタイプのコードのパフォーマンスを調べて、phpの制限時間、メモリの制限、または保存が完了するまで煩わしい待ち時間にならないようにする必要があります。他のイベントを更新し続けるために、一度にいくつかのブログのみを実行して別のイベントを開始します。

1
Mark Kaplun