Wie puffern Beiträge basierend auf $ _GET? Optionsname ist zu lang? Optionen / Transienten

Ich habe eine Suchfunktion eingerichtet, die ziemlich teuer ist und ich möchte die Ergebnisse, basierend auf dem $ _get string, zwischenspeichern wie ?search_type=product&relation=or&date=all&s=tagsearch&merchcat=cotton&brand=brandx&color=blue&etc=morestuff

Also versuche ich das Array von Posts, die ich bekomme, zwischenzuspeichern:

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

für den vorübergehenden Namen habe ich verschiedene Dinge wie

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

Aber ich stoße auf das Problem, dass der Name der Option abgeschnitten und möglicherweise codiert, zerschnitten, usw. wird.

Wie würdest du das lösen?

Solutions Collecting From Web of "Wie puffern Beiträge basierend auf $ _GET? Optionsname ist zu lang? Optionen / Transienten"

Sehen Sie sich die relevanten Bits der databasebeschreibung für diese Tabelle an .

 Feldtyp        
 Optionsname varchar (64)      
 option_value Langtext                  

Der Schlüssel ist maximal 64 Zeichen lang. Der Wert ist longtext, der mehr sein sollte, als Sie benötigen.

Damit Sie Caching durchführen können, benötigen Sie einen eindeutigen Wert für den Schlüssel, der jedoch nicht lesbar sein muss. Mein Vorschlag wäre, den GET String zu GET . Es sollte einzigartig und gut schüchtern von 64 Zeichen sein.

Statt dessen: $name= base64_encode(serialize($_GET));

Versuchen Sie $name= wp_hash($_GET); : $name= wp_hash($_GET);

Proof of Concept mit der obigen Beispiel- GET Zeichenfolge:

 $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)); 

Bearbeiten Sie anhand der folgenden Diskussion (danke @GM):

Die Reihenfolge der Argumente in der GET Zeichenfolge könnte sich auf die Hashwerte auswirken. Die sichere Sache ist es, das Array zu normalisieren. Folgendes sollte das tun:

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

Alle Argumente bleiben erhalten, sogar die leeren, die anscheinend das sind, was das OP will, obwohl ich persönlich glaube, dass das Ausführen des Arrays durch array_filter , um leere Werte zu entfernen, tatsächlich ein besseres Caching bereitstellen würde.

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

Es wurde keine Datenvalidierung / -bereinigung versucht.

Wenn Sie diesen Schlüssel in der database speichern, würde ich auch vorschlagen, einen String voranzustellen, um ihn identifizierbar zu machen – etwas wie $str = 'my_plugin_slug'.$str vor dem Speichern.