web-dev-qa-db-fra.com

multisite: menu global contenant des liens de sites réseau?

Puis-je créer un seul menu qui

  1. apparaît sur chaque page du réseau et

  2. contient tous les sites et toutes les pages du réseau?

Je parle de la structure suivante:

  • Site principal

    • Exemple de page 1
    • Exemple de page 2

    • Site de réseau A

      • Exemple de page A1
      • Exemple de page A2
    • Site de réseau B

      • Exemple de page B1

Est-il possible de créer un menu qui ressemble à ceci?

1
okiedokey

get_sites() obtiendra une liste des sites d'un réseau multisite. Vous pouvez ensuite utiliser switch_to_blog() [*], get_posts() / get_pages() , et restore_current_blog() [*] pour obtenir les pages des différents sites.

Je vous recommande vivement de stocker les résultats sous forme d'option sur l'ensemble du site, à l'aide de update_site_option() , afin de réduire la charge sur votre serveur. Vous pouvez ajouter un travail à wp_cron() pour mettre à jour votre option périodiquement ou ajouter une action à save_post (ou à une ou plusieurs actions appropriées de - Transition post-statut hook (s), telles que new_to_publish et draft_to_publish) pour mettre à jour votre liste de menus stockés. Un autre avantage de conserver la liste de menus dans une option de site est que vous pouvez y accéder depuis n’importe quel site de votre réseau en utilisant get_site_option() .


[*] - À la sortie du multisite, la terminologie était asitedeblogs; plus tard, il est devenu anetworkdesites, mais les anciennes méthodes apparaissent toujours dans les noms de fonction tels que switch_to_blog() et restore_current_blog().

1
Pat J

Que diriez-vous duMulti-Site Site List Shortcodeplug-in? Je l'ai utilisé dans un widget de texte et cela a rendu le menu que j'étais après. http://wordpress.org/plugins/multi-site-site-list-shortcode/

0
Aaron

Il existait une fonction appelée get_blog_list() qui est actuellement obsolète en raison du potentiel de consommation élevée si les ressources sont stockées sur un réseau comportant de nombreux sites. Une méthode plus efficace et moins gourmande en ressources consisterait à interroger la table wp_blogs de votre base de données WP à l'aide d'une requête personnalisée.

Ajoutez le code suivant au fichier functions.php de votre thème et vous devriez être prêt à partir.

/**
 * 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