2016-05-11 6 views
2

現在プラグインを開発中ですが、問題が残っています。 私は(私はプラグインの更新メカニズムを介して、後で実装)phpMyAdminにを通して私のデータベースにSQL要求を実行し、要求がこのように見えた:あなたが見ることができるようにWordpress:キャッシュされたオプション値をフラッシュする方法

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

、私は始まる名前を持つすべてのオプション値を更新しています'ldp_container'による。私はオプションの値を取得していたときに、後にコードの実行中に、私が使用してfalseされた値を取得しています:

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

を私はこの問題に見て、私は私が更新したときと思われるポイントになりました/代わりに

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

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

alloptionsキャッシュの一部となり、このオプションの値:Iが使用されるように、このオプションを作成します。だから、それを取得することは今や常にfalseを返し、私はこのキャッシュをどのようにフラッシュするか分からない。バージョン番号に基づいて、プラグインの更新メカニズムを使用して

は、私が使用してWordpressのオブジェクトキャッシュをフラッシュしようとした:

$flush_cache = wp_cache_flush(); // returns true 

とデータベースのクエリキャッシュすぎ:

$wpdb->flush(); 

私も明示的に削除しようとしましたこれらのオプションは、クエリを使用してキャッシュからキーを呼び出し、結果をループして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'); 
    } 

まだ、運はありません。

誰かが私のための手がかりを持っていますか?

おかげで、

EDIT:私のエラーはどこか別の場所であるように

は思えます。アトムとはXdebugを使用して、いくつかのデバッグ後

、その問題は次のようにファイル/wp-includes/option.phpでデータベースから取得した文字列に適用されるアンシリアライズ方法であることを指摘:

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

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

それは偽、その後、偽の値がキャッシュされている返すので、アンシリアライズへの呼び出しが...、失敗し

maybe_unserializeはそれを行いますオンラインのunserializerは文字列が正しくないことを確認しますが、なぜ私はまだ取得できません。

+0

これはドキュメントを見てからちょうど推測ですが、どのように 'wp_cache_delete(「alloptions」、「オプション」)について;'。私はこれをテストしていません。https://developer.wordpress.org/reference/functions/wp_load_alloptions/とhttp://codex.wordpress.org/Function_Reference/wp_cache_deleteから推測してください –

答えて

0

私の問題は、シリアル化されたオブジェクトの変更に起因すると私は想定していたので、私はデータベース上で直接実行していました。そのためシリアライズされたオブジェクトの性質上、このように見えるの:あなたが実際にあるため、その後、falseを返しますunserialize()を使用してunserializing、この刺さ内の何かを変更した場合

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

1651は、ldp_model文字列の文字数であること文字数は表示されている文字数とは異なります。私の場合は

、解決策は、代わりにこの種のデータベースの更新を実行するのであった。

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

次のようにオプションのAPIを使用するには:

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

をシリアライズされたオブジェクトが留まるように正しい、Options APIはシリアライゼーションとシリアル化を処理します。私のために、ここで学習の

たくさんの;-)

関連する問題