web-dev-qa-db-fra.com

Problèmes de performance WP_Query avec meta_query

Je travaille sur un modèle personnalisé pour un nouveau thème qui utilise une instance WP_Query pour sélectionner les publications de 2 types de publication avec 2 champs personnalisés non vides. En fonction de la section du site, une variable $current_zone peut être définie pour déterminer la catégorie à partir de laquelle interroger.

// Custom loop
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$custom_loop_args = array(
    'post_type' => array('videos', 'post'),
    'post_status' => 'publish',
    'ignore_sticky_posts' => 1,
    'paged' => $paged,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'article_source',
            'compare' => '!=',
            'value' => ''
        ),
        array(
            'key' => 'article_link',
            'compare' => '!=',
            'value' => ''
        )
    )
);

// Check the current zone
global $current_zone;

// Check for category match to current zone
if ( term_exists($current_zone, 'category') ) {
    $term = get_term_by('name', $current_zone, 'category');
    $custom_loop_args['cat'] = $term->term_id;
}

// Create unique identifier for caching
$cache_id = ( isset($term) ) ? '_term-' . $term->term_id : '_main';

// Run query or get transient cache
if ( ( $custom_loop = get_transient( "curated_wpquery$cache_id" ) ) === false ) {

    // It wasn't there, so regenerate the data and save the transient
    $custom_loop = new WP_Query( $custom_loop_args );
    set_transient( "curated_wpquery$cache_id", $custom_loop, ( 60 * 60 * 1 ) );
}

J'utilise les transitoires dans le but d'accélérer le processus, ce qui fonctionne, mais la requête initiale prend 35 secondes et nécessite une quantité de mémoire incroyable. Nous avons une assez grande base de données, avec environ 10 553 enregistrements dans la table posts. J'ai effacé les révisions, mais je n'ai pas remarqué d'augmentation des performances.

Ma vraie question est donc: comment puis-je améliorer les performances de cette requête? Une requête $wpdb personnalisée serait-elle préférable, ou la requête de champs personnalisés de cette manière est-elle totalement improductive?

Toute aide est très appréciée.

2
Kevin Leary

Les données de champ personnalisées sont stockées dans la table postmeta et il est probable que l'analyse de cette table provoque la lenteur.

Vous devriez:

  • installez le plugin debug bar qui vous donnera un meilleur aperçu des requêtes en cours d’exécution sur la base de données - vous pourrez voir la durée de chaque requête et le code SQL en cours d’exécution.
  • Recherchez les requêtes qui prennent beaucoup de temps à exécuter et EXPLAIN leur . Cela vous donnera une bien meilleure idée de ce qui se passe et de la marche à suivre.
5
anu