it-swarm.dev

Dotazování příspěvků z více stránek v síti?

Uvědomuji si, že bylo několik otázek, které tančí kolem řešení jsem po, ale věřím, že jsem hledal něco konkrétního.

Toto je vlastně otázka dvou částí:

1) Mým cílem je, aby wordpress pracoval v režimu sítě (multi-site) a já se snažím zjistit způsob, jak v podstatě „seskupit“ konkrétní stránky dohromady. Jsem si vědoma "Multi-Network" plugin, ale zeptám se, jestli je to nejlepší přístup? Klíčem je umožnit konkrétním uživatelům přidávat/upravovat stránky v rámci své vlastní podsítě.

2) Toto je klíčová otázka tohoto příspěvku ... Chtěl bych vědět, jaký nejlepší přístup by mi umožnil v podstatě se ptát na příspěvky v rámci této „podsítě“ stránek. Pokud například v této podsíti existuje 10 webů a každý z nich vytvořil příspěvky v rámci vlastního typu příspěvku nazvaného "novinky", rád bych zobrazoval například 10 naposledy publikovaných příspěvků z této sbírky 10 míst.

POZNÁMKA: Potřebuji schopnost být schopen vytvářet násobné podsítě, což zase znamená, že dotaz na nejnovější publikované "zprávy" může zobrazit pouze příspěvky od těch, kteří patří do správné skupiny.

Konečně - já si uvědomuji, že existují řešení pro takové věci, ale hledám nejlepší přístup v obou případech, které vyžadují LEAST množství databázového zatížení/dotazů. Chtěl bych také velmi rád udělat to prostřednictvím kódu v mém function.php souboru, spíše než instalaci pluginy, které vytvářejí extra bloat.

Jsem velmi otevřený všem návrhům a oceňuji jakoukoliv reakci.

8

Vím, že jste raději neinstalovali plug-in, ale to je přesně to, co chcete dělat v této situaci. Umístění kódu do souboru functions.php motivu vyžaduje, abyste buď použili stejný motiv napříč všemi weby v podsíti, nebo zachovali více kopií stejného souboru. Na druhou stranu můžete vytvořit jednoduchý plug-in pro síť, který by zapouzdřil funkčnost, pak aktivujte ji v síti , a okamžitě nechte tuto funkci k dispozici pouze s jedním souborem, který chcete zachovat.méně bloat než v závislosti na souborech functions.php.

Je třeba mít na paměti, že buď budete muset projít jednotlivými stránkami v síti, abyste našli své příspěvky nebo provedli vlastní dotaz. Rozhodl bych se pro druhou rutinu, protože i když je to o něco složitější, jedná se o jeden dotaz, nikoli o jiný dotaz pro každý blog.

V podstatě ... budete muset udělat následující:

  1. Získejte seznam všech ID blogů v síti/podsíti. Pokud používáte Vanillovou instalaci, můžete to najít v wp_blogs table. Prostě udělejte jednoduchý SELECT dotaz, abyste nahráli pole, pak můžete projít a přidat každý blog do hlavního dotazu.
  2. Vytvořte smyčku, která přidá každý blog do velkého dotazu. Musíte být tabulky JOINing společně a hledat na základě blog_id (z wp_blogs), post_id (z wp_BLOG_posts) a vlastní taxonomie.

Jak jsem řekl, není to jednoduché řešení (příkaz SQL budevelmikomplikovaný a nemám čas ho v tuto chvíli proniknout), ale bude to jediné prohlášení, které dělá veškerou práci.

Alternativně ...

  1. Získejte seznam ID blogu a uložte jej do pole.
  2. Iterace přes pole dotazování každý blog v síti a připojování vašich zápasů (příspěvky s určitým termínem taxonomie) do samostatného pole.

S alternativní metodou budete muset spustit samostatný dotaz pro každý blog v síti. Pokud je vaše síť 10-20 míst, není to příliš problém. Pokud je vaše síť 200-500 stránek očekávat některé problémy s výkonem začít oříznout nahoru.

Pokud je to možné, měli byste také výsledky vyhledávání dotazovat. Pokud je spuštěn na vícenásobném načítání stránek (tj. Pro sidebar widget sdílený v síti), chcete dotaz spustit pouze v případě, že jsou k dispozici nová data. V opačném případě zobrazte výsledky uložené v mezipaměti, abyste nezpomalili síť.

7
EAMann

Měl jsem podobný problém. Potřeboval jsem seznam příspěvků napříč všemi síťovými stránkami seřazenými podle komentářů (aby se zobrazily nejoblíbenější příspěvky). To je funkce, kterou jsem použil.

Základem je, že nejprve dostane seznam všech ID blogů ve vaší síti. To pak staví velký jediný dotaz (používat UNION kombinovat všechny řádky a nevyžadovat ošklivé JOINs) to dostane výsledek obsahovat sloupce blog_id, ID, a comment_count. Pomocí tohoto, pak jsem použít get_blog_post (), aby si každý z příspěvků podrobné informace.

Tam jsou některé ladicí linky, které můžete použít v různých bodech vidět, co se děje.

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