ワードプレスのデータベースの配列データから画像のパスだけを取得

2018-11-27
ワードプレスを外し、独自のシステムに移行する際、画像のエクスポートが苦労しました。
個人的にワードプレスは好みません。クライアントに管理画面を提供する場合は、自分で一から作ったほうがユーザビリティーが圧倒的に良くなるからです。

アップロード画像の記録がある、postmetaテーブルの検索で「meta_key = _wp_attachment_metadata」とすると、データが下記のようになっていた。なんというごちゃごちゃしたデータ。これだからワードプレスは苦手だ。
a:5:{s:5:"width";i:731;s:6:"height";i:723;s:4:"file";s:22:"2018/07/download-1.png";s:5:"sizes";a:3:{s:9:"thumbnail";a:4:{s:4:"file";s:22:"download-1-150x150.png";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:9:"image/png";}s:6:"medium";a:4:{s:4:"file";s:22:"download-1-300x297.png";s:5:"width";i:300;s:6:"height";i:297;s:9:"mime-type";s:9:"image/png";}s:10:"shop-thumb";a:4:{s:4:"file";s:22:"download-1-720x320.png";s:5:"width";i:720;s:6:"height";i:320;s:9:"mime-type";s:9:"image/png";}}s:10:"image_meta";a:12:{s:8:"aperture";s:1:"0";s:6:"credit";s:0:"";s:6:"camera";s:0:"";s:7:"caption";s:0:"";s:17:"created_timestamp";s:1:"0";s:9:"copyright";s:0:"";s:12:"focal_length";s:1:"0";s:3:"iso";s:1:"0";s:13:"shutter_speed";s:1:"0";s:5:"title";s:0:"";s:11:"orientation";s:1:"0";s:8:"keywords";a:0:{}}}
ワードプレスのアップロードファイルをディレクトリ(\wp-content\uploads)で直に見ると、「2018」フォルダしかなかったので、下記の正規表現で画像のパス部分を取得しました。
正規表現マッチングパターン部分の「(.*?)」の「?」がポイントです。これがないと、余計な部分も取得してしまいます。「最初に現れるダブルクォーテーションまで」という意味になります。
<?php
$rst = $pdo->query("SELECT * FROM `{$TB['postmeta']}` WHERE `meta_key` = '_wp_attachment_metadata'");
while($row = $rst->fetch(PDO::FETCH_ASSOC)){
    $value = preg_match("/2018\/(.*?)\"/",$row['meta_value'],$match); //正規表現
    $path = str_replace('\"','',$match[0]); //ダブルクォーテーション削除
    echo $path."<br>";
}
?>
画像パスの取得ができたら、後はファイル名を自分の都合に合わせて変更して保存。
画像周りは「class.upload.php」を未だに愛用してます。
<?php
require("./libs/class.upload.php"); //画像処理ライブラリ

$rst = $pdo->query("SELECT * FROM `{$TB['postmeta']}` WHERE `meta_key` = '_wp_attachment_metadata'");
while($row = $rst->fetch(PDO::FETCH_ASSOC)){
    $value = preg_match("/2018\/(.*?)\"/",$row['meta_value'],$match); //正規表現
    $path = str_replace('\"','',$match[0]); //ダブルクォーテーション削除
    
    if(file_exists($path)){
        $handle = new Upload($path);
        $handle->image_convert = 'jpg'; //強制的にjpgに変換
        $handle->file_overwrite = true;
        $handle->file_auto_rename = false;
        $handle->file_src_name_body = $file_name; //ファイル名は各自設定
        $handle->jpeg_quality = 90;
        $handle->Process(_IMG_DIR_); //画像保存場所のパスは各自設定
    }
}
?>
class.upload.phpを使えば、画像保存時に画像サイズなども変換しやすいのでオススメです。
もっと進んだライブラリが既にあると思いますが、ファイル一つ読み込ませただけで使えるのでclass.upload.phpは手放せません。