Interroger les publications de plusieurs sites d'un réseau?

8

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

Il s'agit en fait d'une question en deux parties:

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

2) C'est la question clé de ce billet ... Je voudrais connaître la meilleure approche qui me permettrait essentiellement d'interroger des billets à partir 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 a créé des messages dans un type de message personnalisé appelé "news", j'aimerais pouvoir afficher par exemple les 10 messages les plus récemment publiés de cette collection de 10 des sites.

REMARQUE: j'ai besoin de pouvoir créer des sous-réseaux multipliés, ce qui signifie qu'une requête des dernières "nouvelles" publiées ne peut afficher que les messages de ceux appartenant au bon groupe.

Enfin - je réalise que des solutions existent pour faire des choses comme ça, mais je cherche la meilleure approche dans les deux cas qui nécessitent le MOINS de charge / requêtes de base de données. Je voudrais également beaucoup le faire via 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 à toutes suggestions et apprécie toute réponse.

NetConstructor.com
la source

Réponses:

7

Je sais que vous avez dit que vous préférez ne pas installer de plug-in, mais c'est exactement ce que vous voulez faire dans cette situation. Pour placer le code dans le functions.phpfichier 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'un autre côté, vous pouvez créer un plug-in simple pour le réseau pour encapsuler la fonctionnalité, puis l' activer sur le réseau et avoir immédiatement la fonctionnalité disponible avec un seul fichier à maintenir. Cela créerait en fait moins de ballonnement qu'en fonction de vos functions.phpfichiers.

La chose à garder à l'esprit ici est que vous devrez parcourir chaque site du réseau pour trouver vos publications ou effectuer une requête personnalisée. J'opterais pour la deuxième routine parce que, même si c'est un peu plus compliqué, c'est une seule requête plutôt qu'une requête différente pour chaque blog.

Fondamentalement ... vous devrez faire ce qui suit:

  1. Obtenez une liste de tous les ID de blog dans le réseau / sous-réseau. Si vous utilisez une installation vanilla, cela peut être trouvé dans le wp_blogstableau. Faites simplement une SELECTrequête simple pour charger un tableau, puis vous pouvez parcourir pour ajouter chaque blog à votre requête principale.
  2. Créez une boucle qui ajoute chaque blog à une grande requête. Vous devrez JOINregrouper les tableaux et effectuer des recherches en fonction blog_id(de wp_blogs), post_id(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 sera très compliquée et je n'ai pas le temps de la pirater pour le moment), mais ce sera une seule instruction qui fera tout le travail.

Alternativement ...

  1. Obtenez une liste des ID de blog et stockez-les 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 distinct.

Avec la méthode alternative, vous devrez exécuter une requête distincte pour chaque blog du réseau. Si votre réseau compte 10 à 20 sites, ce n'est pas trop un problème. Si votre réseau compte entre 200 et 500 sites, attendez-vous à ce que certains problèmes de performances commencent à apparaître.

En outre, vous devez 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 lorsqu'il y a de nouvelles données à obtenir. Sinon, diffusez les résultats mis en cache afin de ne pas ralentir le réseau.

EAMann
la source
Merci pour votre réponse. J'aime votre idée de le faire via une requête SQL personnalisée car je suppose que cela créerait moins de charge. Ce que j'espère, c'est que vous pouvez me montrer quels plugins vous utiliseriez pour créer ces sous-réseaux qui peuvent avoir des sites qui leur sont associés et, espérons-le, lorsque vous aurez le temps la requête SQL que vous devrez utiliser pour interroger automatiquement tous les messages dans que les sites ont attribué un sous-réseau. J'apprécie beaucoup votre temps
NetConstructor.com
3
Si possible, veuillez mettre à jour
NetConstructor.com
1

J'avais un problème similaire. J'avais besoin d'obtenir une liste de messages sur tous les sites du réseau triés par commentaires (pour afficher les messages 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 (en 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 articles.

Il existe des lignes de débogage que vous pouvez utiliser à différents points 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;

}


la source
-1

Vous avez certainement besoin d'un plugin réseau multisite. Vous avez le choix entre trois actuellement: deux payants, un gratuit.

À partir de là, vous pouvez utiliser quelque chose comme le plugin de balises à l'échelle du site pour extraire le message sur le blog principal de chaque réseau.

Aucun de ces éléments ne peut (ou ne devrait être) effectué à partir du fichier de fonctions d'un thème.

andrea_r
la source
Quels sont ceux dont vous parlez?
NetConstructor.com
1
et payé: (le mien) wpebooks.com/networks
andrea_r
-3

créer un moteur de recherche google personnalisé google.com/cse spécifier tous les sites que vous souhaitez rechercher

l'intégrer dans votre site Web

mireille raad
la source
@mirelle - mais ce n'est certainement pas la réponse que je cherchais
NetConstructor.com