Question

Je sais qu'il ya eu quelques questions qui danse autour de la solution que je suis après, mais je crois que je suis à la recherche de quelque chose de spécifique.

Il est en fait une question en deux parties:

1) Mon but est d'avoir fonctionner dans le réseau wordpress (mode multi-site) et je suis en train de trouver un moyen pour l'essentiel des sites spécifiques « groupe » ensemble. si c'est la meilleure approche que je suis conscient du plugin « multi-réseaux », mais je me demande pour cela? La clé ici est de permettre aux utilisateurs spécifiques d'ajouter / modifier des sites au sein de leur propre sous-réseau.

2) Telle est la question clé de ce post ... Je voudrais savoir la meilleure approche qui me permettrait essentiellement à la requête de messages dans ce « sous-réseau » de sites. Ainsi, par exemple, s'il y a 10 sites dans ce sous-réseau et chacun d'entre eux ont créé des postes au sein d'un type de poste personnalisé appelé « nouvelles » je voudrais la possibilité d'afficher par exemple les 10 postes les plus récemment publiés de cette collection de 10 sites.

NOTE:. J'ai besoin de la capacité d'être d'être en mesure de créer de multiplier les sous-réseaux qui signifie à son tour qu'une requête de la dernière publication « nouvelles » ne peut afficher les messages de ceux appartenant au groupe correct

Enfin - je des solutions pour faire existent Réaliser des choses comme cela, mais je suis à la recherche de la meilleure approche sur les deux cas qui nécessitent le moins de la base de données charge / requêtes. Je voudrais aussi beaucoup à faire cela par le code dans mon fichier functions.php plutôt que d'installer des plugins qui créent ballonnement supplémentaires.

Je suis très ouvert à toutes les suggestions et apprécier toute réponse.

Était-ce utile?

La solution

Je sais que vous avez dit que vous préférez ne pas installer un plug-in, mais c'est exactement ce que vous voulez faire dans cette situation. Placer le code dans le fichier functions.php de thème vous oblige à utiliser soit le même thème sur tous les sites dans le sous-réseau ou conserver plusieurs copies du même fichier. D'autre part, vous pouvez créer un simple plug-in pour le réseau encapsulent la fonctionnalité, puis activer sur le réseau et immédiatement avoir la fonctionnalité disponible avec un seul fichier à maintenir. Cela fait créer moins ballonnement que selon vos fichiers functions.php.

La chose à garder à l'esprit est que vous allez soit besoin de boucler sur chaque site du réseau pour trouver vos messages ou effectuer une requête personnalisée. J'opte pour la deuxième routine parce que, si elle est un peu plus compliqué, il est une seule requête plutôt que d'une autre requête pour chaque blog.

En gros ... vous devez faire ce qui suit:

  1. Obtenir une liste de tous les ID de blog dans le réseau / sous-réseau. Si vous utilisez une installation de vanille, cela peut être trouvée dans la table wp_blogs . Il suffit de faire une simple requête SELECT pour charger un tableau, vous pouvez alors ajouter une boucle à travers chaque blog à votre requête principale.
  2. Créer une boucle qui ajoute chaque blog à une grande requête. Vous aurez besoin d'être des tables JOINing ensemble et la recherche basée sur blog_id (de wp_blogs), post_id (de wp_BLOG_posts), et la taxonomie personnalisée.

Comme je l'ai dit, ce n'est pas une solution simple (l'instruction SQL sera très compliqué et je n'ai pas le temps de pirater à travers elle pour le moment), mais ce sera une seule déclaration qui fait tout le travail.

Vous pouvez également ...

  1. Obtenir une liste des ID de blog et de le stocker dans un tableau.
  2. dans votre tableau Itérer interrogeant chaque blog dans le réseau et en associant vos correspondances (messages avec un terme de taxonomie) dans un tableau distinct.

Avec la méthode alternative, vous devrez exécuter une requête distincte pour chaque blog dans le réseau. Si votre réseau est de 10-20 des sites ce n'est pas trop un problème. Si votre réseau est 200-500 des sites attendent des problèmes de performance pour commencer à rogner vers le haut.

En outre, vous devez mettre en cache les résultats de votre requête, si possible. Si elle est en cours d'exécution sur plusieurs chargements de page (par exemple pour une barre latérale widget de partage à travers le réseau), alors vous ne souhaitez que pour exécuter la requête quand il y a de nouvelles données pour obtenir. Dans le cas contraire, servir les résultats mis en cache afin que vous ne ralentit pas le réseau.

Autres conseils

J'ai eu un problème similaire. Je avais besoin pour obtenir une liste des postes dans tous les sites du réseau triés par les commentaires (pour afficher les messages les plus populaires). Ceci est la fonction que je.

La base est qu'il obtient d'abord une liste de tous les ids de blog dans votre réseau. Il construit ensuite une grande seule requête (en utilisant UNION pour combiner toutes les lignes et ne nécessitant pas laid JOIN) qui obtient un résultat contenant les colonnes blog_id, ID et COMMENT_COUNT. En utilisant, je puis utiliser get_blog_post () pour obtenir chacun des postes des informations détaillées.

Il y a quelques lignes de débogage que vous pouvez utiliser à différents endroits 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;

}

Vous devez certainement un plugins réseau multi-sites. Il y a trois à choisir actuellement. Deux payés, un libre

A partir de là, vous pouvez utiliser quelque chose comme les balises au niveau du site plugin post tirage au blog principal dans chaque réseau.

Aucun de ceux-ci pourraient être (ou devrait être) fait à partir du fichier de fonctions d'un thème.

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

l'intégrer dans votre site web

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top