web-dev-qa-db-fra.com

Quel est un moyen efficace d'interroger basé sur post_meta?

Le problème que je rencontre, c’est que lorsque je permets aux utilisateurs de filtrer les publications, la base de données est surpuissante et les choses tournent extrêmement lentement. Je ne sais pas quel est le meilleur moyen d'interroger des publications à l'aide de méta-valeurs. Mon site contient un formulaire que les utilisateurs peuvent soumettre pour filtrer les publications en fonction de cases à cocher contenant des méta-valeurs. Le site crée actuellement un tableau à partir des cases à cocher sélectionnées pour les clés post_meta individuelles, comme ceci:

for ($i=0; $i< count($amenities); $i++)//where $amenities is an array of selected checkbox values

    {        //$arrays is the array that stores the arrays of checkboxes for different meta keys
        $count = count($arrays);
        $arrays[$count] = array(
                    'key' => 'amenities',
                    'value' => $amenities[$i],
                    'compare' => 'LIKE'
                    );
    }

Ensuite, j'interroge la base de données à l'aide d'un tableau de tableaux contenant les valeurs sélectionnées pour chaque méta_key. Comme ça:

$the_query = new WP_Query(array(
        'post_type' => 'listing',
        'post_status' => 'publish', 
        'category_name' => 'private_rental',
        'orderby' => 'Rand',
        'meta_query' => $arrays
    ));

Lorsque je le fais, j'obtiens les résultats souhaités, mais cela peut prendre plus d'une minute pour que les résultats apparaissent à l'écran. Y a-t-il un moyen plus efficace de le faire?

Toute aide serait appréciée!

3
tyler

J'aimerais voir quel est le code SQL généré que WP_Query utilise, mais pour l'instant.

(Vous pouvez utiliser http://wordpress.org/extend/plugins/debug-bar/ pour afficher facilement la requête SQL)

Les requêtes ordonnées par 'aléatoire' sont inefficaces. Si vous n'en avez pas besoin, supprimez-le. Si vous avez besoin d'un ordre aléatoire, envisagez néanmoins de le supprimer et d'utiliser PHP shuffle pour effectuer une randomisation.

Les requêtes LIKE sont également assez inefficaces. Utilisez = si vous le pouvez.

Vous serez peut-être plus rapide pour écrire votre propre requête qui extrait les identifiants de publication de la table postmeta, puis utilisez WP_Query avec un simple paramètre post__in pour extraire le contenu de la publication. Cela peut aider ou ne pas aider, mais vaut la peine d'expérimenter.

1
s_ha_dum

Vous pourrez peut-être alléger le serveur en utilisant une méta-requête utilisant IN:

$the_query = new WP_Query(array(
        'post_type' => 'listing',
        'post_status' => 'publish', 
        'category_name' => 'private_rental',
        'orderby' => 'Rand',
        'meta_query' => array(
                    'key' => 'amenities',
                    'value' => $amenities,
                    'compare' => 'IN'
                    );
    ));

La requête que vous tentiez de faire semble avoir été compliquée, ce qui peut avoir entraîné une charge excessive du serveur. IN cherchera en principe tous les articles contenant des métadonnées de la clé amenities ayant une valeur dans les champs que l'utilisateur recherche. Certainement une requête plus efficace, à mon humble avis

0
Manny Fleurmond