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?
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.