2016-05-11 12 views
2

leeren Ich arbeite derzeit an einem Plugin, und ich bin mit einem Problem fest. ich eine SQL-Anfrage auf meine Datenbank über phpMyAdmin ausgeführt (was ich später durch ein Plugin-Update-Mechanismus implementiert), sah die Anfrage wie folgt aus:Wordpress: Wie Cache-Option Wert

UPDATE `wp_options` 
    SET `option_value` = replace(`option_value` , 'model', 'ldp_model') 
WHERE `option_name` LIKE 'ldp_container%' 

Wie Sie sehen können, bin ich alle Optionen Wert Name der Aktualisierung beginnen von 'ldp_container'. Später in der Ausführung von Code, wenn ich den Optionswertes am Abrufen, ich bin Wert immer seine false mit:

$termId = $term->term_id; 
$termMeta = get_option("ldp_container_$termId"); // $termMeta = false 

sah ich in dieser Frage, und ich zu dem Punkt, wo es scheint, dass wenn ich ein Update/diese Option erstellen, wie ich verwendet:

update_option("ldp_container_$termID", $termMeta); 

statt

update_option("ldp_container_$termID", $termMeta, false); 

der Wert dieser Option ist Teil des alloptions Cache werden. Also, das Abrufen wird immer falsch zurückgegeben, und ich weiß nicht, wie ich diesen Cache leeren soll.

ein Plugin-Update-Mechanismus auf die Versionsnummer auf Basis benutzen, habe ich versucht, die Wordpress-Objekt-Cache zu leeren mit:

$flush_cache = wp_cache_flush(); // returns true 

und die Datenbank-Abfrage-Cache zu:

$wpdb->flush(); 

ich hiermit ausdrücklich auch versucht zu löschen Diese Optionen Schlüssel aus dem Cache mit einer Abfrage dann Schleife Ergebnisse und Aufruf wp_cache_delete:

$result = $wpdb->get_results(
     "SELECT 'option_name' 
     FROM $wpdb->options 
     WHERE 'option_name' LIKE '%ldp_container_%';" 
    ); 

    foreach ($result as $current) { 
     wp_cache_delete($current, 'options'); 
    } 

Immer noch kein Glück.

Hat jemand eine Ahnung für mich hier?

Danke,

EDIT:

Scheint, wie mein Fehler woanders ist.

Nach einiger Fehlersuche mit Atom und Xdebug, es weist darauf hin, dass das Problem mit der unserialize Methode, um die aus der Datenbank in der Datei /wp-includes/option.php abgerufenen String angelegt ist wie folgt:

return apply_filters('option_' . $option, maybe_unserialize($value)); 

maybe_unserialize tun:

if (is_serialized($original)) // don't attempt to unserialize data that wasn't serialized going in 
    return unserialize($original); 
return $original; 

der Aufruf der unserialize ausfällt, so ist es false zurück, und dann wird der falsche Wert ... im Cache eines

Verwendung online unserializer es bestätigt, dass die string nicht korrekt ist, aber ich verstehe warum noch nicht.

+0

Das aus der Betrachtung der Dokumentation nur eine Vermutung ist, aber wie wäre es 'wp_cache_delete („alloptions“,„Optionen“);'. Ich habe das nicht getestet, sondern nur aus https://developer.wordpress.org/reference/functions/wp_load_alloptions/ und http://codex.wordpress.org/Function_Reference/wp_cache_delete erraten –

Antwort

0

So, wie ich mein Problem aufgrund der Änderung in serialisierten Objekten annahm, wurde ich direkt auf der Datenbank ausgeführt.Aufgrund der Natur von serialisierten Objekte, wie folgt aussehen:

a:1:{s:9:"ldp_model";s:1651:"{... 

Die 1651 ist die Anzahl der Zeichen in der ldp_model Zeichenfolge, wenn Sie etwas in diesem Stich ändern, dann unserialize() Deserialisierens verwendet, wird return false, weil die tatsächliche Anzahl der Zeichen unterscheidet sich von der angegebenen.

In meinem Fall war die Lösung stattdessen ein Datenbank-Update dieser Art der Ausführung:

$wpdb->query(
    "UPDATE $wpdb->options 
    SET `option_value` = replace(`option_value` , 'ldp_', '');" 
); 

die Optionen API wie folgt zu verwenden:

$result = $wpdb->get_results(
    "SELECT `option_name` 
    FROM $wpdb->options 
    WHERE `option_name` LIKE '%ldp_container_%';" 
); 

foreach ($result as $current) { 
    $option = get_option($current->option_name); 
    if (!empty($option) && !empty($option['ldp_model'])) { 
    $option['ldp_model'] = str_replace('ldp_', '', $option['ldp_model']); 
    update_option($current->option_name, $option, false); 
    } 
} 

Damit die serialisierte Objekte bleibt Korrekt, und das Options-API kümmert sich um die Serialisierung und Deserialisierung.

Viele hier für mich zu lernen ;-)

Verwandte Themen