web-dev-qa-db-fra.com

Comment mettre en cache les publications basées sur $ _GET? Le nom de l'option est trop long? Options/transitoires

J'ai mis en place une fonctionnalité de recherche assez coûteuse et je souhaite mettre en cache les résultats, en fonction de la chaîne $ _get, telle que: ?search_type=product&relation=or&date=all&s=tagsearch&merchcat=cotton&brand=brandx&color=blue&etc=morestuff

Donc, j'essaie de mettre en cache le tableau de messages que je reçois:

if (false === ( $products = get_transient($name) ) ) {
    $products = getproducts();
    set_transient($name, $products, 60*60*12);
}

pour le nom transitoire, j'ai essayé diverses choses comme

$name= base64_encode(serialize($_GET));

Mais je rencontre le problème du nom de l’option qui est tronquée et éventuellement encodée, slashée, etc.

Comment voulez-vous résoudre ce problème?

1
Doug Cassidy

Examinez les bits pertinents de la description de la base de données pour cette table .

 Type de champ 
 Option_name varchar (64) 
 Valeur_option longtext 

La clé est de 64 caractères maximum. La valeur est longtext, ce qui devrait être plus que nécessaire.

Pour que la mise en cache fonctionne, vous avez besoin d’une valeur unique pour la clé, mais elle n’a pas besoin d’être lisible. Ma suggestion serait de hacher la chaîne GET. Il devrait être unique et bien timide de 64 caractères.

Au lieu de ceci: $name= base64_encode(serialize($_GET));

Essayez ceci: $name= wp_hash($_GET);

Preuve de concept utilisant l'exemple de chaîne GET ci-dessus:

$str = '?search_type=product&relation=or&date=all&s=tagsearch&merchcat=cotton&brand=brandx&color=blue&etc=morestuff';
var_dump(base64_encode(serialize($str)));
// vs
var_dump(wp_hash($str));

Modifiez en fonction de la discussion ci-dessous (merci @ G-M):

L'ordre des arguments dans la chaîne GET pourrait affecter les valeurs de hachage. La chose à faire est de normaliser le tableau. Ce qui suit devrait faire cela:

$str = $_GET;
ksort($str);
$str = add_query_arg($str,'');
$str = wp_hash($str);
var_dump($str);

Tous les arguments sont préservés, même les arguments vides, ce qui semble être ce que souhaite le PO, bien que je pense personnellement qu'exécuter le tableau à l'aide de array_filter pour supprimer les valeurs vides fournirait une meilleure mise en cache.

$str = $_GET;
$str = array_filter($str);
ksort($str);
$str = add_query_arg($str,'');
var_dump(wp_hash($str));

Aucune validation/désinfection des données n'a été tentée.

Lorsque vous enregistrez cette clé dans la base de données, je vous suggère également de préfixer une chaîne pour la rendre identifiable - quelque chose comme $str = 'my_plugin_slug'.$str avant de l'enregistrer.

4
s_ha_dum