web-dev-qa-db-ja.com

`wp_options`テーブルのWordpressシリーズ値をシリアル化解除できませんか?

私の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有効な直列化された値のサンプルは、読み取り可能な配列として返されます。

enter image description here 

それで私の質問はWordpressのシリアル化された値をデシリアライズできないのはなぜですか? - これはwordpress.orgにも投稿されています ここ

pS.

1)Wordpressのコードをさらに調査した結果、get_option('nav_menu_options');コマンドを使用して、議論した値を「デコード」できることがわかりました。

2)nav_menu_optionsの値はデータベースからコピーされた実際のデータです

enter image description here 

2
Nam G VU

あなたの問題は、折り返し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_unserializeis_serialized を見てください。

5
gmazzap