it-swarm.com.de

Warum sollte switch_to_blog nicht mehr funktionieren?

Ich verwende die Multisite-Funktionalität von WordPress 3.0 und habe ein Netzwerk von Websites erstellt, in dem ich einen zufälligen Beitrag von einer der Unterwebsites auf der Hauptseite der Website anzeige. Zum Teil verwende ich dazu die Funktion switch_to_blog aus der alten WPMU-Funktionsliste.

Bis gestern konnte ich eine Funktion mit dem Namen switch_to_blog aufrufen, ein Array erstellen, den Namen des Blogs, die Post-Details, das Post-Thumbnail usw. zum Array hinzufügen und dann mit restore_current_blog zum Kontext des Hauptblogs zurückkehren. Dann benutzte ich dieses Array, um die Dinge, die ich für diesen Beitrag brauchte, wiederzugeben. Es hat gut funktioniert.

Wenn ich switch_to_blog aufrufe und dann aus diesem Block heraus bloginfo() aufrufe, um es zu testen, wird immer noch der Name des Blogs der obersten Ebene und NICHT des Blogs, zu dem gewechselt wurde, wiedergegeben.

Ist diese Funktion aufgrund von zufälligen Fehlern veraltet und nicht mehr funktionsfähig? Hat jemand irgendwelche Einsichten oder Ideen, um dies zu umgehen, oder muss ich eine benutzerdefinierte $wpdb->get_results();-Abfrage schreiben, um dies zu umgehen?

Vielen Dank!

1
Jason Rhodes

Es scheint, dass switch_to_blog möglicherweise zu unvorhersehbar ist, um für die Gestaltung wichtiger Websites verwendet zu werden. Hier ist mein erster Versuch einer SQL-basierten Lösung.

function get_intro_post($blogid, $thumb_size='') {

  global $wpdb, $post;

  // Get the system defined table prefix
  $prefix = $wpdb->prefix;

  // Create a full table prefix by combining the system prefix with the blogid
  $tbl = $prefix . $blogid;

  // First query selects posts with the 'Introduction' category
  $sql = "SELECT `ID` FROM {$tbl}_posts as p";
  $sql .= " JOIN {$tbl}_term_relationships tr ON p.ID = tr.object_id";
  $sql .= " JOIN {$tbl}_terms t ON tr.term_taxonomy_id = t.term_id";
  $sql .= " WHERE t.name = 'Introduction'";

  // Only want/expect one result row, so use get_row()
  $intro = $wpdb->get_row($sql);
  $postid = $intro->ID;

  // Second query joins the postmeta table to itself so that I can find
  // the row whose post_id matches the _thumbnail_id, found in meta_value, 
  // for the post whose post_id matches the one I found in the previous query.
  $sql = "SELECT p2.meta_key, p2.meta_value FROM  `{$tbl}_postmeta` p1";
  $sql .=   " JOIN  `{$tbl}_postmeta` p2 ON p1.meta_value = p2.post_id";
  $sql .=   " WHERE p1.meta_key =  '_thumbnail_id'";
  $sql .=   " AND p1.post_id =  '{$postid}'";
  $sql .=   " LIMIT 0 , 30";

  // Expecting 2 result rows, so use get_results()
  $thumb_meta = $wpdb->get_results($sql);

  // Set $src to FALSE as the default
  $src = FALSE;

  // Make sure the query returned results
  if(!empty($thumb_meta)) {
    foreach($thumb_meta as $row) {
        // We just want to find the row where meta_key is the attached file
        // and then set our $src var to that value, which is the image path
        if ($row->meta_key == "_wp_attached_file") $src = $row->meta_value;
    }
  }

  // If we found an image path above, I'll append the rest of the path to the front
  if($src) { $src = "/wp-content/blogs.dir/{$blogid}/files/{$src}"; }

  // Handy core function to grab the blogname of another network's blog, by ID
  $blogname = get_blog_details( $blogid )->blogname;

  // Make an associative array holding the elements we need, 
  // some pulled from the global $post context
  $p = array(
    'title' => get_the_title(),
    'content' => get_the_content(),
    'excerpt' => get_the_excerpt(),
    'permalink' => get_permalink(),
    'blogname' => $blogname,
    'thumbnail' => $src
  );

  // Return an object with the post details mentioned above
  return (object) $p;
}
4
Jason Rhodes

Es gibt mehrere switch_to_blog () -Probleme im Zusammenhang mit dem Caching:

Warten Sie bis 3.2 für volle Zuverlässigkeit ... (Wenn dann ...)

2

Ich bin versucht zu fragen, was gestern passiert ist. :) Neue Plugins installiert? Eine Verbesserung?

Ja, die Funktion ist veraltet, wird aber immer noch für Plugins verwendet und ist außerdem sehr anfällig für unvorhersehbare Ereignisse.

0
andrea_r