読者です 読者をやめる 読者になる 読者になる

俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

wordpressのwp_optionを直いじり - 日報 #135

なんかえれぇ疲れてるけど少しずつ進展がある日々で中々刺激的です。
フットサルやったらもんすげー足いたい。

それで。

wordpressをいじる作業が一旦終わり、
SEO的な調整最適化に入る前に、
ちょっと色々とチップスが発生したので共有を。

wordpressを無理やりハックしようとすると、
当然DBに対してもメスが入ります。
管理画面からいじるのがワケワカラン状態になってしまったら、
直接DBいじったるわいと思うのも無理からぬことです。
本当は駄目ですが。
それでも文字列置換くらいだったら、、、と軽い気持ちでやっちゃうと思わぬ落とし穴にはまります。
wp_optionなどはシリアライズされた配列データなどがそのままぶっこんであったりするので、
単純に文字列置換などを行うだけではエラーになってしまいます。

なのでシリアライズされたoption_valueをスクリプトでなんとかせんといけません。
何度も言いますが、面倒臭がらず、腐らず、折れず、変更管理画面を探しだして変更したほうが色々安全です。
ですが、「あぁ駄目だ!もうこれはDB倒すしか無い!」ってなったら下記手順でやるといいです。

凄い単純で、
一旦シリアライズ文字列をunserializeして、配列にします。
ここで再帰的に配列を全参照して文字列置換を行うという手法もありますが、
かったるいのでjson_encodeして文字列にします。
そこでpreg_replaceで文字列置換。
そしてjson_decodeして配列に戻し、serialize。
以上です。

<?php echo serialize(json_decode(preg_replace("/".preg_quote(@$argv[2])."/",@$argv[3],json_encode(unserialize(file_get_contents(@$argv[1])))),TRUE)); ?>

無駄にワンライナーです。
引数にシリアライズされた文字列が記載されたファイル名、
置換対象文字列、
置換後文字列、
の3つをあげればシリアライズされた文字列を返します。
わっかりづら!

じゃぁね。