隙があればlispを詰め込んで行きたい (4)
- 平成22年6月29日(火) 11時09分06秒
- 区分
- lisp
- 報告者:
- chiba
隙があればlispを詰め込んで行きたい日々ですが、今回はWordPressのデータをいじる仕事です。
仕事の内容ですが、WordPressにはカスタムフィールドという便利機能があり、ここに入力したデータが便利にページに表示されます。
このカスタムフィールド内のHTMLを大量に変更することになりました。
具体的には、
select * from wp_postmeta where meta_key = 'こんにちは画像';で目的の内容が取得できるので、このテキストの内容を置換して同じ場所に戻してやる、ということになります。
SQL文を書いて色々すれば良いのですが、CLSQLを使ってみることにしました。
(asdf:oos 'asdf:load-op :clsql)
(in-package :clsql-user)
(connect '("localhost" "db" "wp" "")
:database-type :mysql)
(execute-command "set character_set_client='utf8'")
(execute-command "set character_set_connection='utf8'")
(execute-command "set character_set_results='utf8'"))
;; DBから読み出してSQLを出力
;; <a href=...>を<a target="_blank" href=...>に変更
(let ((ahref (ppcre:create-scanner "(<a)(\\s+)(href=.*)"))
(window.open (ppcre:create-scanner "window.open")))
(alexandria:with-output-to-file (out "/tmp/foo.txt")
(do-query ((meta_id post_id meta_key meta_value)
"select * from wp_postmeta where meta_key = 'こんにちは画像';")
(cond ((ppcre:scan "window.open" meta_value)
;; 既にwindow.openで開くような指定があるばあいはスルー
:nop)
('T (let ((new-val
(ppcre:regex-replace
ahref
meta_value
(lambda (match &rest registers)
(declare (ignore match))
(destructuring-bind (a b c) registers
(format nil
"~a target=\"_blank\"~a~a"
a
b
c)))
:simple-calls 'T)))
(format out
"update wp_postmeta set meta_value = '~A' where meta_key = 'こんにちは画像' and post_id = ~A;~%"
new-val
post_id)))))))
内容としては、
- CLSQLを準備
- MySQLに接続
- 文字コードをUTF-8に設定(任意)
- select文を発行して結果をリストで受けとる
- リストの内容から、目的の文を取り出しPPCRE(Common LispのPerl正規表現互換パッケージ)で処理
- ファイルにSQL文を書き出し
また、"select〜"みたいなことになっていますが、(select [...])のようにも書けるようです。
色々適当ですが、とりあえず目的は達成できました
■