a-blog cmsで外部画像URLの存在確認とフォールバック処理を実装する
はじめに
a-blog cms で外部画像URL(Amazon の商品画像など)を扱う際、リンク切れで画像が表示されないことがある。
複数サイズのURLを順番にチェックして、存在するものを返す。全部ダメならフォールバック画像を表示する、という処理を実装したのでメモっとく。
公式ドキュメントについて
a-blog cms の公式ドキュメントには「校正オプションを自作する場合は extension/acms/Corrector.php に記述」との説明があった。
……が、記事執筆時点(2025年12月)で該当ページが404。検索結果には出てくるのにページがない。いつものことだけど高い金取ってんだからほんとドキュメントというかリファレンス整備して欲しい。
というわけで、実際に動作確認した内容を残す。
extension/acms/Corrector.php について
extension/ ディレクトリはカスタマイズ用の領域で、プラグインもここにインストールされる。プラグインが消えると困るので、アップデートでも上書きされない想定。
(公式ドキュメントが404なので断言はできないけどまあたぶん大丈夫)
実装
PHP側(extension/acms/Corrector.php)
extension/acms/Corrector.php に以下のメソッドを追加:
/**
* 指定EIDのカスタムフィールドから有効な画像URLを取得する
* 存在しない場合は引数で渡したフォールバック画像を返す
*/
public static function valid_image($eid, $args = []) {
$field = loadEntryField($eid);
$urls = [
$field->get('image_1'),
$field->get('image_2'),
$field->get('image_3'),
];
$valid_url = '';
foreach ($urls as $url) {
if (is_null($url) || empty($url) || $url === '') {
continue;
}
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code === 200) {
$valid_url = $url;
break;
}
}
if (!empty($valid_url)) {
return $valid_url;
}
// フォールバック画像(引数で渡されたもの)
if (count($args) > 0 && isset($args[0])) {
return $args[0];
}
return '';
}
テンプレート側
エントリーIDを渡して呼び出し。引数にフォールバック画像のパスを指定:
<img src="{eid}[valid_image('/path/to/noimage.png')]" alt="">
entry:loop 内で使う場合:
<!-- BEGIN entry:loop -->
<img src="{entry:loop.eid}[valid_image('/path/to/noimage.png')]" alt="">
<!-- END entry:loop -->
※ループ内やモジュール内で使う場合、エスケープ処理(\{eid\} など)が必要になることがある。動かなかったらどこに入れようとしてるかチェック。
処理の流れ
- エントリーIDからカスタムフィールドを読み込む
- 複数の画像URLフィールドを優先順にチェック
- curlでHEADリクエストを送り、200が返ってきたURLを採用
- 全部ダメなら引数のフォールバック画像を返す
注意点
- 外部URLへのリクエストが発生するため、ループ内で大量に呼び出すとパフォーマンスに影響が出る可能性があり
- 必要に応じてキャッシュ機構を追加することを検討(納品時にこの点を指摘したがCDNでカバーすると言われた)
まとめ
外部サービスの画像URLは予告なく変わったり消えたりするので、こういった存在確認+フォールバックの仕組みがあると安心。
extension/acms/Corrector.php への追加はアップデートで上書きされない想定なので、安心してカスタマイズできる(たぶん)。
ところで a-blog cms って使ってる人いるんですかね? こっちもとある案件で導入するって言われて覚えたレベルなんで、使ってる会社に出くわしたことがなくて……