サポート » 使い方全般 » マルチサイト上での親サイトでの記事を子サイトへコピー

  • 解決済 tak7910

    (@tak7910)


    お世話になります。

    wordpressでマルチサイトを構築して、社内での情報共有を図るサイトを作成しようとしております。

    wordpress 3.8.1使用
    サーバは現状テスト段階ではheteml利用しております。

    サイトの構成としては、

    親サイト(全てのデータの集約型)…投稿者:マスター管理者及び、投稿カテゴリなどが制限された編集者にてデータをアップ

    子サイト(複数)…親サイトにアップされた記事をタグ・カテゴリーで選別して、その中で条件に合うものを、各子サイトにてコピーしたい。

    現状は、
    http://ja.forums.wordpress.org/topic/15923?replies=8
    を参考にして、

    下記のようなコードを記載して、

    <?php switch_to_blog(1);
    $args = array(
    	'tag' => タグ名,
    	'posts_per_page' => 5,
    );
    $my_query = new WP_Query( $args );
    while ( $my_query->have_posts() ):
    $my_query->the_post();
    ?>
    <li class="heightLine-group1">
    <dl>
    <dt><a href="<?php the_permalink(); ?>" rel="bookmark">
    <?php if(mb_strlen($post->post_title)>34) { $title= mb_substr($post->post_title,0,34) ; echo $title. ・・・ ;
    } else {echo $post->post_title;}?></a></dt>
    <dd><a href="<?php the_permalink(); ?>" rel="bookmark"><?php the_post_thumbnail( array(180) ); ?></a></dd>
    </dl>
    </li>
    <?php
    endwhile;
    wp_reset_postdata();
    restore_current_blog(); ?>

    ということで、親サイトにてアップされたものを子サイトにて引っ張って表示させるということは問題なくできていますが、

    仕組みとして、子サイトはセグメント化されたデータを掲載して、例えばAという子サイトは、Aiという部署に対して開示(その他のグループには非開示)
    Bというサイトは、AIIというグループに開示
    というようにして、開示できるデータをグループ毎に絞りたいので、親サイトにはアクセスをさせたくありません。

    しかし、親サイトのデータを引っ張ってきたものだと、記事の本体は親サイトにあるため、子サイトから詳細へアクセスしようとすると親サイトへのアクセスが必要になります。
    また子サイトで検索等を設置しようとしても実体が子サイトに存在しないため、動かないと思われます。

    となると本来は制限をかけて、利便性は維持したい親サイトの利便性を少し削ったり、複雑なユーザー管理を行わないといけないかなと考えております。

    そのため、可能であれば、親サイトに記事をアップする際に、条件等で判断して、適合する子サイトにも同じ内容でマルチポストを行える、もしくは記事をコピーするようなカスタマイズは可能でしょうか?

    社内での共有用なので、基本的には検索に引っかけてほしくもないのでブロックする方向で考えています。

    下記も参考になるかな?というように見てみましたが、http://ja.forums.wordpress.org/topic/203?replies=4
    頻繁に記事のアップデートを行うため、編集可能という部分も考えて、メール送信的な方法ではなく、管理画面上からの方法が行えるといいなぁと思っております。

    ただ、この記事にも書かれてある通り、スパム的な問題であったり、基本仕様ではないため、なかなかそのものずばりの機能の実装は開発的なものが必要なのかなぁとは思っております。

    もしあればラッキーですし、なければ、妥協点を作ってそこでのカスタマイズを行えればと思います。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • ちょっと考えてみましたが… 考えただけです。

    親ブログの投稿を、子ブログのデータベースにただ突っ込むことだけではなくて、削除や再編集もできるという前提で考えると、両者のテーブル構造を考慮する必要があります。通常なら、親子で違うテーブルは下の 9 つあります。

    • comments
    • commentmeta
    • links
    • options
    • posts
    • postmeta
    • terms
    • term_relationships
    • term_taxonomy

    コメントを全面禁止として、posts テーブルの comment_count フィールドは常に 0 とすると、影響のあるテーブルは、

    • posts
    • postmeta
    • terms
    • term_relationships
    • term_taxonomy

    の 5 つにまで絞れます。Akismet のようなプラグインは、commentmeta を使いますがここでは考慮しません。この中で、terms と term_taxonomy は親子でそっくり同じに作ると、さらに絞れて、

    • posts
    • postmeta
    • term_relationships

    の 3 つになります。この 3 つは、それぞれ投稿 ID を持っていて連動するようになっています。おおもとの posts テーブルに保存される投稿 ID は、auto_increment フィールドなので、ユーザがコントロールできません(データベースに保存されるときに MySQL が決定します)。

    autosave 禁止、revision 禁止、子ブログでの投稿禁止とすると、同じ ID を持てるかもしれませんが、ユーザがコントロールできないのは同じです。投稿 ID が同じという前提は危険なので、やはり、親子の投稿 ID を関連づけるテーブルが 1 つほしいですね。これがあれば、投稿禁止をしなくてすみます。

    この前提でいくと、下のような流れになるのではないでしょうか。

    親ブログの投稿を publish するタイミングにフックして、テーブル接頭辞を変えたクエリを子ブログのテーブルに向けて発行すれば、投稿の保存ができます。新規投稿の場合は、投稿データの保存とタクソノミーデータの保存は、投稿 ID の関係で、2 段階になりますが、子ブログでも同じ操作が必要です。保存直後に、投稿 ID がそれぞれから取得できますから、それを関連付け用のテーブルに保存します。

    ここまでが 1 サイクルです。が、途中でエラーが発生したときに、不整合が残ってしまうと悲惨ですから、親ブログ以外の入力には、MySQLi か PDO ライブラリを使って、明示的にトランザクションを使うのがお勧めです(WordPress 3.9 では、MySQLi が使えるようになりますが、PHP 5.5 のチェックをするとか条件が厳しく、トランザクションも使うようになってません)。

    削除と再編集は、それぞれのタイミングにフックして、関連付け用のテーブルから投稿 ID を取得後、子ブログに向けて同じ操作を実行します。今度はクエリの中のテーブル接頭辞と投稿 ID の書き換えが発生します。

    ここまで書いてきて、正直なところ、もううんざり、という感じです。上では guid の書き換えには触れませんでしたが、本当は、まだ他にもやるべきことがあるかもしれません。プラグインを 1 つ作るつもりで開発する時間があるなら、お勧めします。このとおり実装すると、親ブログで投稿作成、再編集、削除したときにそのまま子ブログに反映させることができますが…

    でも、これって、WordPress でやる必要がありますか? ユーザの管理を考えると、私のお勧めは、Drupal を使うということになりそうです。

    スレッド開始 tak7910

    (@tak7910)

    kjmtsh様

    DBの構造自体も鑑みる必要があるんですね。
    流れは掴めたのですが、ノンプログラマーの僕が実装を試みようとするとだいぶ時間がかかりそうな感じですね。

    ご返信が遅くなり申し訳ございませんでした。

    せっかくなので、この方法は更に深く勉強しつつ試しながら、やってみようと思います。
    また、最後にご指摘いただいた分ももっともだと思います。
    wordpressしか知識がないという点もありましたので、進めてたのですが、Drupalも勉強しつつ、走りだしはWordpressで代案を作りつつ、Drupalに移行ということも考えてみます。

    ありがとうございました。

    以前別サイトの投稿をコピーさせた時はpublish_postにフックして$_POSTの内容を子サイトにぶんなげて、子サイトの方でwp_insert_postで登録していました。

    もちろんセキュリティーや条件を考える必要がありますし、親データを投稿時だけではなく、編集時、削除時、ゴミ箱に送った時等の処理も必要になるので色々面倒だった記憶があります。
    (特にアイキャッチ等のメディアデータを考慮にいれる場合親メディアから子メディアにアップロードしなおして登録する必要があるのが面倒でした)

    参考までにどうぞ。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「マルチサイト上での親サイトでの記事を子サイトへコピー」には新たに返信することはできません。