web-dev-qa-db-fra.com

Vous interrogez des publications de plusieurs sites dans un réseau?

Je me rends compte qu'il y a eu quelques questions qui tournent autour de la solution que je recherche mais je crois que je cherche quelque chose de spécifique.

C'est en fait une question en deux parties:

1) Mon objectif est de faire fonctionner WordPress en mode réseau (multi-sites) et j'essaie de trouver un moyen de "grouper" essentiellement des sites spécifiques. Je connais le plugin "Multi-Network" mais je me demande si c'est la meilleure approche pour cela? La clé ici est de permettre à des utilisateurs spécifiques d’ajouter/éditer des sites au sein de leur propre sous-réseau.

2) C’est la question clé de ce message… Je voudrais connaître la meilleure approche qui me permettrait essentiellement d’interroger les messages de ce "sous-réseau" de sites. Ainsi, par exemple, s'il y a 10 sites dans ce sous-réseau et que chacun d'eux crée des messages dans un type de message personnalisé appelé "actualités", j'aimerais alors pouvoir afficher, par exemple, les 10 derniers messages publiés de cette collection de 10 des sites.

NOTE: J'ai besoin de la capacité de pouvoir créer plusieurs sous-réseaux, ce qui signifie qu'une requête sur les dernières "nouvelles" publiées ne peut afficher que les messages de ceux appartenant au bon groupe.

Enfin, je me rends compte que des solutions existent pour faire ce genre de choses, mais je cherche la meilleure approche dans les deux cas qui nécessitent le moins de charge/de requêtes dans la base de données. J'aimerais aussi beaucoup faire cela avec du code dans mon fichier functions.php plutôt que d'installer des plugins qui créent une surcharge supplémentaire.

Je suis très ouvert à toute suggestion et apprécie toute réponse.

8

Je sais que vous avez dit que vous préféreriez ne pas installer de plug-in, mais c'est exactement ce que vous voulez faire dans cette situation. Pour placer le code dans le fichier functions.php de votre thème, vous devez soit utiliser le même thème sur tous les sites du sous-réseau, soit conserver plusieurs copies du même fichier. D'autre part, vous pouvez créer un simple plug-in pour que le réseau encapsule la fonctionnalité, puis l'activer sur le réseau et disposer immédiatement de la fonctionnalité avec un seul fichier à gérer. Cela créerait en fait moins _ gonfler que dépendre de vos fichiers functions.php.

Il est important de garder à l’esprit que vous devrez soit parcourir en boucle chaque site du réseau pour trouver vos publications, soit effectuer une requête personnalisée. J'opterais pour la deuxième routine car, bien que ce soit un peu plus compliqué, il s'agit d'une requête unique plutôt que d'une requête différente pour chaque blog.

Fondamentalement ... vous devrez faire ce qui suit:

  1. Obtenez une liste de tous les identifiants de blog du réseau/sous-réseau. Si vous utilisez une installation Vanilla, vous pouvez le trouver dans la table wp_blogs . Il suffit de faire une simple requête SELECT pour charger un tableau, puis vous pouvez effectuer une boucle pour ajouter chaque blog à votre requête principale.
  2. Créez une boucle qui ajoute chaque blog à une requête volumineuse. Vous devez regrouper les tables JOIN et effectuer une recherche en fonction de blog_id (à partir de wp_blogs), de post_id (à partir de wp_BLOG_posts) et de la taxonomie personnalisée.

Comme je l'ai dit, ce n'est pas une solution simple (l'instruction SQL seratrèscompliquée et je n'ai pas le temps de la parcourir pour le moment), mais ce sera un déclaration unique qui fait tout le travail.

Alternativement ...

  1. Obtenez une liste des ID de blog et stockez-la dans un tableau.
  2. Parcourez votre tableau en interrogeant chaque blog du réseau et en ajoutant vos correspondances (publications avec un certain terme de taxonomie) à un tableau séparé.

Avec la méthode alternative, vous devrez exécuter une requête distincte pour chaque blog du réseau. Si votre réseau compte entre 10 et 20 sites, cela ne pose pas trop de problème. Si votre réseau compte entre 200 et 500 personnes, certains problèmes de performances vont apparaître.

En outre, vous devriez mettre en cache les résultats de votre requête si possible. S'il est exécuté sur plusieurs chargements de page (c'est-à-dire pour un widget de barre latérale partagé sur le réseau), vous ne souhaitez exécuter la requête que lorsque de nouvelles données doivent être récupérées. Sinon, diffusez les résultats mis en cache afin de ne pas ralentir le réseau.

7
EAMann

J'avais un problème similaire. J'avais besoin d'obtenir une liste de publications sur tous les sites du réseau, triées par commentaires (pour afficher les publications les plus populaires). C'est la fonction que j'ai utilisée.

La base est qu’il obtient d’abord une liste de tous les identifiants de blog de votre réseau. Il crée ensuite une grande requête unique (utilisant UNION pour combiner toutes les lignes et ne nécessitant pas de jointures laides) qui obtient un résultat contenant les colonnes blog_id, ID et comment_count. En utilisant cela, j’utilise ensuite get_blog_post () pour obtenir des informations détaillées sur chacun des posts.

Il existe des lignes de débogage que vous pouvez utiliser à différents moments pour voir ce qui se passe.

function txx_top_posts_mu( $howMany = 10 ) {
global $wpdb;
global $table_prefix;

// get an array of the table names that our posts will be in
// we do this by first getting all of our blog ids and then forming the name of the 
// table and putting it into an array
$rows = $wpdb->get_results( "SELECT blog_id from $wpdb->blogs WHERE
    public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0';" );
if ( $rows ) :
    $blogPostTableNames = array();
    foreach ( $rows as $row ) :
        $blogPostTableNames[$row->blog_id] = $wpdb->get_blog_prefix( $row->blog_id ) . 'posts';
    endforeach;
    //print_r($blogPostTableNames);

    // now we need to do a query to get all the posts from all our blogs
    // ordered by the number of comments and with limits applied
    if ( count( $blogPostTableNames ) > 0 ) :
        $query = '';
        $i = 0;
        foreach ( $blogPostTableNames as $blogId => $tableName ) :
            if ( $i > 0 ) :
                $query.= ' UNION ';
            endif;
            $query.= " SELECT ID, comment_count, $blogId as `blog_id` FROM $tableName ";
            $i++;
        endforeach;
        $query.= " ORDER BY comment_count DESC LIMIT 0,$howMany;";
        //echo $query;
        $rows = $wpdb->get_results( $query );

        // now we need to get each of our posts into an array and return them
        if ( $rows ) :
            $posts = array();
            foreach ( $rows as $row ) :
                $posts[] = get_blog_post( $row->blog_id, $row->ID );
            endforeach;
            //print_r($posts);
            return $posts;
        endif;
    endif;
endif;
return false;

}

1
user3967