Interrogazione di post da più siti in una rete?


8

Mi rendo conto che ci sono state alcune domande che danzano intorno alla soluzione che sto cercando, ma credo di cercare qualcosa di specifico.

Questa è in realtà una domanda in due parti:

1) Il mio obiettivo è far funzionare wordpress in modalità di rete (multi-sito) e sto cercando di trovare un modo per "raggruppare" siti specifici. Sono a conoscenza del plug-in "Multi-Network" ma mi chiedo se questo è l'approccio migliore per questo? La chiave qui è consentire a utenti specifici di aggiungere / modificare i siti all'interno della propria sottorete.

2) Questa è la domanda chiave di questo post ... Vorrei conoscere l'approccio migliore che mi consentirebbe essenzialmente di interrogare i post all'interno di questa "sottorete" di siti. Quindi, ad esempio, se ci sono 10 siti all'interno di questa sottorete e ognuno di essi ha creato post all'interno di un tipo di post personalizzato chiamato "news", mi piacerebbe poter visualizzare ad esempio i 10 post pubblicati più di recente da questa raccolta di 10 siti.

NOTA: ho bisogno della capacità di essere in grado di creare molte sottoreti, il che a sua volta significa che una query delle ultime "notizie" pubblicate può visualizzare solo i post di quelli appartenenti al gruppo corretto.

Infine, mi rendo conto che esistono soluzioni per fare cose del genere, ma sto cercando l'approccio migliore per entrambi i casi che richiedono la quantità MINIMA di caricamento / query del database. Mi piacerebbe anche farlo attraverso il codice nel mio file Functions.php anziché installare plug-in che creano ulteriore rigonfiamento.

Sono molto aperto a qualsiasi suggerimento e apprezzo qualsiasi risposta.

Risposte:


7

So che hai detto che preferiresti non installare un plug-in, ma è esattamente quello che vuoi fare in questa situazione. Inserire il codice nel functions.phpfile del tema richiede di utilizzare lo stesso tema in tutti i siti della sottorete o di conservare più copie dello stesso file. D'altra parte, è possibile creare un semplice plug-in per la rete per incapsulare la funzionalità, quindi attivarla sulla rete e avere immediatamente la funzionalità disponibile con un solo file da mantenere. Questo in realtà creerebbe meno gonfia rispetto a seconda dei tuoi functions.phpfile.

La cosa da tenere a mente qui è che dovrai andare in loop attraverso ogni sito della rete per trovare i tuoi post o eseguire una query personalizzata. Opterei per la seconda routine perché, sebbene sia un po 'più complicata, è una singola query anziché una query diversa per ogni blog.

Fondamentalmente ... dovrai fare quanto segue:

  1. Ottieni un elenco di tutti gli ID blog nella rete / sottorete. Se si utilizza un'installazione vanilla, questa può essere trovata nella wp_blogstabella. Basta eseguire una semplice SELECTquery per caricare un array, quindi è possibile eseguire il ciclo continuo per aggiungere ogni blog alla query principale.
  2. Crea un ciclo che aggiunge ogni blog a una query di grandi dimensioni. Dovrai JOINraggruppare le tabelle e cercare in base a blog_id(da wp_blogs), post_id(da wp_BLOG_posts) e alla tassonomia personalizzata.

Come ho detto, non è una soluzione semplice (l'istruzione SQL sarà molto complicata e non ho tempo per hackerarla al momento), ma sarà una singola istruzione che farà tutto il lavoro.

In alternativa ...

  1. Ottieni un elenco degli ID blog e memorizzalo in un array.
  2. Scorri l'array eseguendo una query su ciascun blog della rete e aggiungendo le tue corrispondenze (post con un determinato termine di tassonomia) a un array separato.

Con il metodo alternativo dovrai eseguire una query separata per ogni blog della rete. Se la tua rete è composta da 10-20 siti, questo non è un grosso problema. Se la tua rete è di 200-500 siti, ti aspetti che alcuni problemi relativi alle prestazioni inizino ad apparire.

Inoltre, è necessario memorizzare nella cache i risultati della query, se possibile. Se viene eseguito su più caricamenti di pagina (ad esempio per un widget della barra laterale condiviso sulla rete), si desidera eseguire la query solo quando sono disponibili nuovi dati. Altrimenti, pubblica i risultati memorizzati nella cache in modo da non rallentare la rete.


Grazie per la risposta. Mi piace la tua idea di farlo attraverso una query sql personalizzata poiché suppongo che ciò creerebbe meno carico. Quello che spero è che tu possa mostrarmi quali plug-in useresti per creare queste sottoreti che possono avere siti associati con loro e si spera quando avrai tempo la query sql che dovresti usare per interrogare automaticamente tutti i post all'interno quei siti assegnati sottorete. Apprezzo molto il tuo tempo
NetConstructor.com il

3
Se possibile, aggiorna
NetConstructor.com il

1

Ho avuto un problema simile. Avevo bisogno di ottenere un elenco di post su tutti i siti di rete ordinati per commenti (per mostrare i post più popolari). Questa è la funzione che ho usato.

La base è che ottiene prima un elenco di tutti gli ID blog nella tua rete. Crea quindi un'unica grande query (utilizzando UNION per combinare tutte le righe e non richiede brutti JOIN) che ottiene un risultato contenente le colonne blog_id, ID e comment_count. Usando quello, poi uso get_blog_post () per ottenere informazioni dettagliate su ciascuno dei post.

Esistono alcune righe di debug che puoi utilizzare in diversi punti per vedere cosa sta succedendo.

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

Hai sicuramente bisogno di un plug-in di rete multisito. Ci sono tre tra cui scegliere attualmente: due a pagamento, uno gratuito.

Da lì, puoi usare qualcosa come il plug-in dei tag per tutto il sito per estrarre i post sul blog principale di ogni rete.

Nessuno di questi potrebbe essere (o dovrebbe essere) fatto dal file delle funzioni di un tema.


quali sono quelli a cui ti riferisci?
NetConstructor.com,


1
e pagato: (mio) wpebooks.com/networks
andrea_r

-3

costruire un motore di ricerca personalizzato google google.com/cse specificare tutti i siti che si desidera cercare

incorporalo nel tuo sito web


@mirelle - ma questa non è provocatoriamente la risposta che stavo cercando
NetConstructor.com
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.