Tu gères un multisite et tu veux afficher du contenu d’un autre site du réseau ? Ça te parle, non ?
Je parie que ton premier réflexe a été d’utiliser switch_to_blog(). Et franchement, on te comprend – cette fonction native fait le taf, tout simplement.
// Approche classique avec switch_to_blog()
switch_to_blog(2);
$posts = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 5
]);
restore_current_blog();Quelques points clés à retenir :
- C’est LA solution « officielle » de WordPress
- Super simple à mettre en place
- Pratique pour les cas basiques
Alors attention, parlons des pièges de switch_to_blog() sans prendre de gants ! 🚨
Les 4 galères qui peuvent te pourrir la vie :
- L’oubli mortel 💀
- Tu oublies restore_current_blog() une fois
- Et BAM ! Ton site part en vrille
- L’effet domino global 🎯 Cette fonction touche à TOUT
- Tes hooks WordPress partent en vacances
- Les options du site jouent aux montagnes russes
- Ton thème fait sa crise d’identité
- Les droits utilisateurs deviennent borderline
- La douche froide des perfs ⚡ Chaque switch c’est
- Tous tes caches qui sautent
- WordPress qui recharge sa config
- Tes perfs qui prennent un coup (Pro tip : Dans une boucle ? Évite comme la peste !)
- Le cauchemar de la maintenance 🔧
- Ton code devient un plat de spaghettis
- Les besoins évoluent ? Galère assurée
- Les devs qui reprennent ton code te maudissent
Alors, devons-nous nous résigner à ces compromis pour récupérer des contenus cross-site ? Absolument pas ! Tu sais quoi ? On va utiliser le hook posts_request comme un pro.
Pourquoi c’est la solution qui déchire ? 🤘
- Zéro compromis sur les perfs
- Maintenir le contexte de votre site intact
- Fini les prises de tête avec switch_to_blog()
- Un code qui fait plaisir à maintenir
La magie de posts_request : Une solution élégante 🎩✨
L’astuce que nous allons explorer repose sur un hook puissant mais méconnu (ou mal utilisé) de WordPress : posts_request. Ce filtre intervient juste avant l’exécution de la requête SQL générée par WP_Query, nous donnant l’opportunité parfaite de la modifier.
1. Mise en place du hook
add_filter(
'posts_request',
array( $this, 'posts_request' ),
50,
2
);Ce hook est particulièrement intéressant car il nous donne accès à :
- La requête SQL finale ($sql)
- L’instance complète de WP_Query ($query)
- Une priorité personnalisable (ici 50)
2. La fonction magique
public function posts_request( $sql, $query ) {
global $wpdb;
// Vérification de sécurité : on s'assure que who_network_id est défini et non vide
if ( isset( $query->query_vars['who_network_id'] ) && ! empty( $query->query_vars['who_network_id'] ) ) {
$blog_id = absint( $query->query_vars['who_network_id'] ); // Force la conversion en entier
$new_prefix = $wpdb->get_blog_prefix( $blog_id ); // Récupère le préfixe du site cible
// Remplace le préfixe des tables
$sql = str_replace( "{$wpdb->prefix}", "{$new_prefix}", $sql );
}
return $sql;
}
3. Anatomie de la solution
Décortiquons chaque élément clé :
Sécurité d’abord
if ( isset( $query->query_vars['who_network_id'] ) && ! empty( $query->query_vars['who_network_id'] ) )
- Vérifie la présence du paramètre who_network_id
- Évite toute modification non intentionnelle des requêtes
- Isole notre fonctionnalité pour ne l’activer que lorsque nécessaire
Conversion de données
$blog_id = absint( $query->query_vars['who_network_id'] );
- Force la conversion en entier avec absint()
- Convertit TOUT en nombre entier positif
- Nettoie les valeurs douteuses
- Transforme les caractères spéciaux en 0
- Garantit un ID de blog valide
Manipulation intelligente des préfixes
$new_prefix = $wpdb->get_blog_prefix( $blog_id );
$sql = str_replace( "{$wpdb->prefix}", "{$new_prefix}", $sql );
- Utilise les fonctions natives de WordPress pour obtenir le préfixe correct
- Modifie la requête de manière sûre et prévisible
- Maintient la compatibilité avec toutes les tables WordPress
4. Utilisation pratique
// Requête classique avec notre paramètre personnalisé
$query = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 5,
'who_network_id' => 2 // ID du site dont vous voulez récupérer les articles
]);
// Utilisation dans une boucle
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// le code ici
}
}
wp_reset_postdata();
Posons les choses avec le sourire ! 😎
La solution posts_request c’est du WordPress pur jus, pas besoin de réinventer la roue ! C’est comme choisir entre prendre l’autoroute bondée (switch_to_blog) ou une belle départementale (posts_request) – parfois le chemin le moins évident est le plus agréable.
Avant de te jeter sur le code comme un affamé (les big boss du copier-coller d’un bloc), pose-toi les bonnes questions : 📝
- T’as combien de contenus à gérer ? 100 ? 10 000 ? 1 million ?
- Ton multisite, c’est une coloc ou une ville entière ?
- La maintenance, tu y penses ? (Ton « toi du futur » te remerciera ! tes collègues aussi !)
- Tu veux faire du sur-mesure ou rester dans les clous WordPress ?
Pro tips pour garder la zen attitude : 🧘♂️
- On développe un site web, pas un logiciel pour la NASA
- Une erreur ? Pas de panique, on debug et on apprend
- Le parfait est l’ennemi du bien (mais faut quand même faire propre !)
Cadeau pour les pressés qui codent entre deux cafés ! ☕️
Pour tous les as du copier-coller qui sont toujours pressés (on vous voit ! 👀), voici le code qui va bien. Mais comme je suis un dev sympa, j’ai même ajouté un petit bonus debug. Parce que oui, même quand on est speed, autant faire les choses proprement ! 😉
public function posts_request( $sql, $query ) {
global $wpdb;
if ( isset( $query->query_vars['who_network_id'] ) && ! empty( $query->query_vars['who_network_id'] ) ) {
$blog_id = absint( $query->query_vars['who_network_id'] );
// Vérifie si le blog existe dans le multisite
$blog_exists = get_blog_details( $blog_id );
if ( $blog_exists ) {
$new_prefix = $wpdb->get_blog_prefix( $blog_id );
$sql = str_replace( "{$wpdb->prefix}", "{$new_prefix}", $sql );
} else {
// Log l'erreur pour le debugging
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
error_log( sprintf(
'Tentative d\'accès à un blog inexistant (ID: %d) - Fallback sur le blog courant (ID: %d)',
$blog_id,
get_current_blog_id()
) );
}
// Fallback sur le site courant
// On touche pas $sql ;)
}
}
return $sql;
}
🎭 DISCLAIMER DU DEV RESPONSABLE 🎭
Par mon pote Verbinator
Avant que tu ne fasses un copier-coller aussi rapide que Flash, laisse-moi te dire un truc : ce code, c’est comme les gremlins – y’a des règles à respecter !
Si tu te considères comme un vrai dev (tu sais, ces êtres mythiques qui lisent la doc), alors fais-moi plaisir :
- Teste ce code
- Améliore-le
- Customise-le
- Optimise-le
Tu as repéré une erreur ? Une optimisation possible ? Une meilleure approche ? Ne reste pas dans ton coin comme Gollum avec son précieux – partage ta sagesse avec les copains !

