J'utilise la fonctionnalité multisite de WordPress 3.0 et je dispose d'un réseau de sites sur lequel j'affiche une publication aléatoire de l'un des sous-sites de la page d'accueil du site principal. Pour ce faire, j'utilise en partie la fonction switch_to_blog
de l'ancienne liste de fonctions WPMU.
Jusqu'à hier, je pouvais appeler une fonction appelée switch_to_blog
, créer un tableau, ajouter le nom du blog, les détails du message, la vignette du message, etc. au tableau, puis utiliser restore_current_blog
pour revenir au contexte du blog principal. Ensuite, j'ai utilisé ce tableau pour faire écho aux choses dont j'avais besoin pour ce message que j'ai saisi. Cela a bien fonctionné.
Tout à coup, lorsque j'appelle switch_to_blog
et que, à l'intérieur de ce bloc, j'appelle bloginfo()
juste pour le tester, il fait encore écho au nom du blog de niveau supérieur, et NON au blog commuté.
Cette fonction est-elle complètement déconseillée et inutilisable à cause de bogues aléatoires? Quelqu'un a une idée ou des idées pour le résoudre ou dois-je écrire une requête personnalisée $wpdb->get_results();
pour résoudre ce problème?
Merci!
Il semble que switch_to_blog soit trop imprévisible pour la conception de sites majeurs. Voici ma première tentative de solution SQL.
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;
}
Il y a plusieurs problèmes switch_to_blog () liés à la mise en cache:
Attendez jusqu'à 3.2 pour une fiabilité totale ... (Si alors ...)
Je suis tenté de demander ce qui s'est passé hier. :) Nouveaux plugins installés? Une mise à niveau?
Oui, la fonction est déconseillée, mais elle est toujours utilisée pour les plug-ins, et également très sujette à l'imprévisible.