Je travaille sur la conception d'un blog avec la hiérarchie de catégories ci-dessous (juste un exemple).
PARENT
|
|------------------------------------------------|
Food Fashion
| |
|---------------------| |---------------------|
European Asian European Asian
| | | |
|---------| |-----------| |--------| |--------|
Italian French Chinese Japanese Italian French Chinese Japanese
Sur la page d'accueil, mon client souhaite afficher les trois derniers messages de tous les enfants de niveau 4, d'où:
Ma première tentative était comme ça:
$allPosts = new WP_Query('cat=20, 21, 24, 22, 23, 25, 75, 84, 79, 85, 83, 96, 95, 97, 65, 68, 107, 48, 49&showposts=100&order=ASC');
Selon un plugin de débogage, 18 requêtes ont été appelées sur la page mais je me suis rendu compte qu'un tel appel n'a aucun sens pour ce que je veux car si une catégorie compte 2 000 publications, les 100 publications récupérées par cette ligne appartiendront toutes à la même catégorie.
Je divise donc les appels, comme ceci:
$italianFood = new WP_Query('cat=20&showposts=3&order=DESC');
$italianFashion = new WP_Query('cat=21&showposts=3&order=DESC');
$frenchFood = new WP_Query('cat=24&showposts=3&order=DESC');
$frenchFashion = new WP_Query('cat=22&showposts=3&order=DESC');
Cela fonctionne mais après avoir appelé TOUTES les catégories, le nombre d'appels de requête à la base de données est passé à 260!
Je vais mettre la page en cache avec un plugin, mais dois-je vraiment déclencher plus de 260 appels de base de données pour obtenir ce que je veux?
Vous pouvez aussi écrire votre propre requête. De cette façon, c'est une requête par catégorie:
global $wpdb;
$query = '
SELECT wpp1.*
FROM ' . $wpdb->posts . ' AS wpp1
LEFT JOIN ' . $wpdb->term_relationships . ' AS wptr1 ON wptr1.object_id = wpp1.ID
WHERE post_type = %s
AND post_status = %s
AND wptr1.term_taxonomy_id = %d
ORDER BY wpp1.post_date DESC
LIMIT %d
';
$query = $wpdb->prepare(
$query,
// Args: post type, post status, term taxonomy ID, number of posts
'post', 'publish', 80, 3
);
$posts = $wpdb->get_results(
$query,
ARRAY_A
);