Wie würde ich pre_get_posts verwenden, um eine andere Website nach Posts in meinem Netzwerk mit mehreren Standorten abzufragen?

Ich habe ein MultiSite-Netzwerk von Websites, die Blog-Inhalte voneinander anzeigen sollten, wenn der Blog-Eintrag ein Tag mit dem Site-Namen hat.

Um alle Beiträge im Netzwerk zu sammeln, verwende ich das SWT (Sitewide Tags) Plugin, da es am effizientesten erscheint. Ich speichere alle Posts auf der Hauptseite (Blog-ID 1) und von meinen anderen Sites möchte ich die Posts-Tabelle der Haupt-Sites nach Posts abfragen, die ein Tag mit dem Domainnamen der Suchanfrage-Site enthalten.

Ich habe home.php in einer Seitenvorlage ( home.php ) – siehe unten – aber ich verstehe die Aktion pre_get_posts sind der Weg zu gehen, aber ich kann nicht herausfinden, wie Sie die Tabelle zu Abfrage ändern. Sollte ich vielleicht einen JOIN in der Aktion posts_join ?

Wenn meine Lösung viel komplizierter ist, als es sein sollte, zögern Sie nicht mich mit anderen Vorschlägen zu schlagen 🙂

Dies ist mein aktueller Vorlagencode:

 $tags = array( 'lundalogik-se' ); switch_to_blog(1); $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; $wp_query = new WP_Query(array( 'post_status' => 'publish', 'paged' => $paged, 'orderby' => 'date', 'order' => 'desc', 'tag' => implode(",", $tags) )); while (have_posts()) : the_post(); [..] 

Wie kann ich das in pre_get_posts umschreiben?

Hinweis; Wenn Sie sehen, dass das Tag, nach dem ich suche, im Moment statisch ist, wird sich dies ändern, um später dem Domain-Namen + ccTLD der abfragenden Site oder etwas Ähnlichem zu entsprechen.

Anmerkung 2; Ich würde switch_to_blog() lieber nicht verwenden, da ich gelesen habe, dass es teuer ist, aber ich habe keine Best Practice gefunden, um andere Blogs in einem Netzwerk switch_to_blog() . Sollte ich den Tabellennamen so einstellen, dass er stattdessen manuell abfragt?

Ich habe die meisten Beiträge hier sowohl in Blogs als auch im Codex gelesen (WP_Query, pre_get_posts etc.), die die Abfrage von mehreren Standorten betreffen, aber fast alle sprechen von der Verwendung von switch_to_blog und restore_current_blog.

Solutions Collecting From Web of "Wie würde ich pre_get_posts verwenden, um eine andere Website nach Posts in meinem Netzwerk mit mehreren Standorten abzufragen?"

OK, also habe ich am Ende switch_to_blog() und restore_current_blog() . Ich habe keinerlei Referenzen gefunden, um mehrere Tabellen abzufragen (außer meine eigenen JOIN statementen zu schreiben), wenn der Quellcode für die Aktion pre_get_posts .

Es wurde eine Menge Ratschläge gegeben, um restore_current_blog() zu überspringen, um CPU-Zyklen zu sparen, aber als ich den Quellcode überprüfte, sah ich, dass es ein großes Speicherproblem verursachen würde, da das letzte eingefügte Objekt hauptsächlich durch restore_current_blog() wird in einem globalen Array und dieses Array würde enorm mit jedem switch_to_blog() wachsen, dass man keine restore_current_blog() an tut.

Bitte zögern Sie nicht, den Quellcode zu überprüfen und auch die Antwort von @ user42826 diesbezüglich unter https://wordpress.stackexchange.com/a/123516/14820 .

Für diejenigen, die interessiert sind, endete ich mit Transienten sowohl für die Site-Liste als auch für das Ergebnis, um sowohl CPU-Zyklen als auch DB-performance zu sparen. Ich brauchte nur Daten aktualisiert werden, wenn es alt war (15 Minuten oder älter). Nur das relevante Bit der function ist darunter enthalten:

 $site_transient = get_site_transient( 'multisite_site_list'); if ($site_transient == false || LL_USE_TRANSIENTS == false) { $using_site_transient = false; // no cache available global $wpdb; // TODO: get prefix for wp tables $site_list = $wpdb->get_results($wpdb->prepare('SELECT * FROM nw_blogs WHERE public = %d AND deleted = %d ORDER BY blog_id', 1, 0)); // set transient set_site_transient('multisite_site_list', $site_list, LL_TRANSIENT_EXPIRES); } else { //log_msg("SITELIST - Transient found, using cached query.."); $site_list = $site_transient; $using_site_transient = true; } //log_msg("$id - get_posts_from_network | tags: " . implode(",", $tags) . " | tag_slug__and: $lang_full"); $start = microtime(true); // get blogpost transient, if existing $post_transient = get_site_transient( 'limelight_recent_posts_' . $hash); // if not, do query and save result as a transient if ($post_transient == false || LL_USE_TRANSIENTS == false) { $using_post_transient = false; $blogposts = array(); foreach ($site_list as $site) { switch_to_blog($site->blog_id); $posts = get_posts(array( 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'desc', 'tag' => implode(",", $tags), 'tag_slug__and' => array($lang_full) )); //log_msg("$id - get_posts_form_network | at site: $site->blog_id"); foreach ($posts as $post) { //log_msg("$id - get_posts_form_network | at site: $site->blog_id | got post!"); $post->human_post_date = human_time_diff(get_post_time('U', false, $post->ID), current_time('timestamp')) . ' ' . __('ago', 'limelight'); if (isset($tagline_metabox)) { $meta = get_post_meta($post->ID, $tagline_metabox->get_the_id(), TRUE); $post->tagline = $meta['tagline_text']; } if (!isset($post->tagline) || $post->tagline == '') $post->tagline = substr($post->post_title, 0, 20) . '..'; $post->post_date_timestamp = strtotime($post->post_date); //$post->blog_id = $site->blog_id; $post->blog_name = get_bloginfo('name'); $post->blog_url = get_bloginfo('wpurl'); $post->permalink = get_permalink($post->ID); $post->author_name = get_userdata($post->post_author)->display_name; //$data = get_userdata($post->post_author); $blogposts[] = $post; } restore_current_blog(); } // sort blogposts by post_date_timestamp, descending array_sort_by_obj($blogposts, 'post_date_timestamp', SORT_DESC); // pick five latest posts if (sizeof($blogposts) > 5) { $posts = array(); for ($i = 0; $i < = 4; $i++) { $posts[$i] = $blogposts[$i]; } $blogposts = $posts; } // set transient if (LL_USE_TRANSIENTS) set_site_transient('limelight_recent_posts_' . $hash, $blogposts, LL_TRANSIENT_EXPIRES); 

Versuche Folgendes:

 add_filter( 'pre_get_posts', 'get_post_from_main_blog' ); function get_post_from_main_blog($query) { global $wpdb; $wpdb->posts = 'wp_posts'; return $query; } 

Möglicherweise müssen Sie wp_posts in den Post-Tabellennamen Ihres Hauptblogs ändern.