web-dev-qa-db-ja.com

マルチサイト:ネットワークサイトのリンクを含むグローバルメニュー

一つのメニューを作成できますか

  1. ネットワーク内のすべてのページに表示され、

  2. ネットワーク内に存在するすべてのサイトとページが含まれていますか?

私は次のような構造について話しています。

  • メインサイト

    • サンプルページ1
    • サンプルページ2

    • ネットワークサイトA

      • サンプルページA1
      • サンプルページA2
    • ネットワークサイトB

      • サンプルページB1

このようなメニューを作成することは可能ですか?

1
okiedokey

get_sites() は、マルチサイトネットワーク内のサイトのリストを取得します。その後、 switch_to_blog() [*]、 get_posts() / get_pages() 、および restore_current_blog()を使用できます。 [*]さまざまなサイトからページを取得します。

サーバーの負荷を軽減するために、 update_site_option() を使用して結果をサイト全体のオプションとして保存することを強くお勧めします。 wp_cron() にジョブを追加してオプションを定期的に更新するか、 save_post (または1つ以上の適切な new_to_publishdraft_to_publishなどのステータス遷移 フックを保存して、保存されているメニューリストを更新します。サイトオプションにメニューリストを保持することの追加の利点は、 get_site_option() を使用してネットワーク内の任意のサイトからメニューリストにアクセスできることです。


[*]-マルチサイトが最初に登場したとき、用語はasiteofblogs;後でanetworkofsites、ただし、古い方法はswitch_to_blog()restore_current_blog()などの関数名に引き続き表示されます。

1
Pat J

マルチサイトサイトリストショートコードプラグインはどうですか。私はそれをテキストウィジェットの中で使っていて、それが私がしていたメニューを作りました。 http://wordpress.org/plugins/multi-site-site-list-shortcode/

0
Aaron

get_blog_list()と呼ばれる関数がありました。これは、ネットワークにたくさんのサイトがある場合、リソースが大量に消費される可能性があるため、現在は非推奨です。カスタムクエリを使用して、WPデータベース内のwp_blogsテーブルにクエリを実行するのが、リソースをあまり必要としない方法です。

あなたのテーマのfunctions.phpファイルに次のコードを追加してください。

/**
 * Build a list of all websites in a network
 */
function wp_list_sites( $expires = 7200 ) {
   if( !is_multisite() ) return false;

   // Because the get_blog_list() function is currently flagged as deprecated 
   // due to the potential for high consumption of resources, we'll use
   // $wpdb to roll out our own SQL query instead. Because the query can be
   // memory-intensive, we'll store the results using the Transients API
   if ( false === ( $site_list = get_transient( 'multisite_site_list' ) ) ) {
      global $wpdb;
      $site_list = $wpdb->get_results( $wpdb->prepare('SELECT * FROM wp_blogs ORDER BY blog_id') );
      // Set the Transient cache to expire every two hours
      set_site_transient( 'multisite_site_list', $site_list, $expires );
   }

   $current_site_url = get_site_url( get_current_blog_id() );

   $html = '' . "n";

   foreach ( $site_list as $site ) {
      switch_to_blog( $site->blog_id );
      $class = ( home_url() == $current_site_url ) ? ' class="current-site-item"' : '';
      $html .= "t" . 'blog_id . '"' . $class . '>' . get_bloginfo('name') . '' . "n";
      restore_current_blog();
   }

   $html .= '' . "nn";

   return $html;
}
0
ShoutingWords