私のWordpressデータベースには、以下のようにnav_menu_options
があります。
284,'nav_menu_options','a:2:{i:0;b:0;s:8:\"auto_add\";a:0:{}}'
この値を逆シリアル化しようとしましたが、結果は空の文字列です - 以下のように<my theme>/function.php
にコードスニペットを置きます。
echo 'TRY #1'.'<br>';
$v = 'a:2:{i:0;b:0;s:8:\"auto_add\";a:0:{}}';
$d = unserialize($v);
print_r($d);
echo 'TRY #1 end'.'<br>';
echo 'TRY #2'.'<br>';
$v ='a:5:{s:9:"engine_id";a:1:{i:0;s:9:"300000225";}s:15:"transmission_id";a:1:{i:0;s:6:"257691";}s:5:"plant";a:1:{i:0;s:23:"Oshawa, Ontario, Canada";}s:15:"Manufactured in";a:1:{i:0;s:6:"CANADA";}s:22:"Production Seq. Number";a:1:{i:0;s:6:"151411";}}';
$d = unserialize($v);
print_r($d);
echo 'TRY #2 end'.'<br>';
上記のコードの結果は以下のとおりです。
@ 1逆シリアル化されたWorpdress値は空になります。
@ 2有効な直列化された値のサンプルは、読み取り可能な配列として返されます。
それで私の質問はWordpressのシリアル化された値をデシリアライズできないのはなぜですか? - これはwordpress.orgにも投稿されています ここ 。
pS.
1)Wordpressのコードをさらに調査した結果、get_option('nav_menu_options');
コマンドを使用して、議論した値を「デコード」できることがわかりました。
2)nav_menu_options
の値はデータベースからコピーされた実際のデータです
あなたの問題は、折り返しquoteは一重引用符であるため、シリアル化された文字列にはそのように評価されないエスケープスラッシュが含まれていることです。
あなたが使っている:
$v = 'a:2:{i:0;b:0;s:8:\"auto_add\";a:0:{}}'; // wrong
どちらかを使用する必要があります
$v = "a:2:{i:0;b:0;s:8:\"auto_add\";a:0:{}}"; // ok
または
$v = 'a:2:{i:0;b:0;s:8:"auto_add";a:0:{}}'; // ok
ちなみに、WordPressデータベースの値をmanualunserializeにしないでください。
オプション(またはメタデータ、あるいはシリアル化される可能性のあるもの)を取得する必要がある場合は、WP関数を使用します。必要に応じて値をシリアル化解除します。
例えば。オプションの場合は、 get_option
を使用します。
WordPressがどのようにシリアル化解除を行うのかに興味があるなら、 maybe_unserialize
と is_serialized
を見てください。