web-dev-qa-db-fra.com

Comment puis-je réduire le nombre d'appels de requête de base de données pour cette page d'accueil personnalisée?

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ù:

  • Les trois derniers articles de Parent> Alimentation> Européenne> Italienne
  • Les trois derniers articles de Parent> Alimentation> Européenne> Française
  • Les trois derniers articles de Parent> Alimentation> Asiatique> Chinois, etc.
  • etc.

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?

4
WPRookie82

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
);
2
NightHawk