記事サイトの構造化データに画像のパス一覧を入力するとき、どうするかなーと思って書いてみました。
やってることとしてはWPのデフォルトWYSIWYGに入力した内容からimgタグのsrcの中身だけ引っこ抜いて、ほしい形に整えて配列に入れて返す、みたいな感じです。
まずは本文を持ってきて、その中からsrc=""
の中身を抽出。
正規表現に引っかからなかった場合は処理を終了します。
$conts = get_the_content();
preg_match_all('/src="(\S+)(.jpg|.png|.gif)"/', $conts, $m);
if(!$m) return;
正規表現で引っこ抜いてきた、パスの文字列部分と拡張子部分をそれぞれがっちゃんこします。
投稿時にWP管理画面でサイズをしていると、そのサイズ込みのパスになります。
オリジナルの画像のパスを取るために雑にpreg_replace()
で置換していますが、他に良さげな方法ありますかね。
$img_name_arr = $m[1];
$img_ext_arr = $m[2];
foreach($img_name_arr as $key => $img_name) {
$img_path = $img_name.$img_ext_arr[$key];
$origin_img = preg_replace('/-(\d+)x(\d+)(.jpg|.png|.gif)/', '$3', $img_path);
}
構造化データに入れるとき、横幅が969px以上?でないといけないらしいので、基準となる$border_width
よりオリジナルの画像サイズが大きいときに配列に入れる、という条件をつけました。まぁ、ここはお好みで。
<?php
function get_img_list() {
if(!is_singular()) return false;
$border_width = 696;
$img_arr = array();
$conts = get_the_content();
preg_match_all('/src="(\S+)(.jpg|.png|.gif)"/', $conts, $m);
if(!$m) return;
$img_name_arr = $m[1];
$img_ext_arr = $m[2];
foreach($img_name_arr as $key => $img_name) {
$img_path = $img_name.$img_ext_arr[$key];
$origin_img = preg_replace('/-(\d+)x(\d+)(.jpg|.png|.gif)/', '$3', $img_path);
$origin_img_width = getimagesize($origin_img)[0];
if($origin_img_width && $origin_img_width >= $border_width) {
$img_arr[] = $origin_img;
}
}
return $img_arr;
}
というか、WPデフォで投稿内容から画像だけ抽出する方法があったら教えてほしいです。(´・ω・`)