PHPのsimplexml_load_stringを使ってRSSのmediaタグを読み込む

先日フィードに追加したmediaタグ。

タグとしてはフィード内に、このように書き出されていますが、

<media:content medium="image" url="https://monmon.jp/wp-content/uploads/2021/05/1620640132-106b0da10326dcbcdc539234427c24e1-1024x575.jpeg" width="1024" height="575"/>

これをPHPのsimplexml_load_stringで読み込む方法が、ググると中途半端だったり、動かなかったりと……不確かな情報が多く見られたので、動くものを整理してまとめておきます。

フィードの読み込み

通常、こんな感じでフィードを読み込みます。
一般的な内容ですね。

$rss_url = 'https://monmon.jp/feed/';

$rss = simplexml_load_string( file_get_contents( $this->rss_url ),'SimpleXMLElement', LIBXML_NOCDATA);

foreach($rss->channel->item as $item){

    //いろいろ読み込むよ♪
    $title = $item->title;
    $link = $item->link;

    //ここで好きに処理するよ♪
    
}

LIBXML_NOCDATAオプションも指定して、CDATAも読み込むようにしておくと後から情報の欠損が起きなくて好きです。このあたりは必要に応じて。

で、問題のmediaタグはnamespaceなので $item->media こんな感じに読み込めません。

childrenを使う

$item->children('media', True)->content->attributes()['url'];

これでOKです。

横幅や縦幅の情報も、

$item->children('media', True)->content->attributes()['width'];
$item->children('media', True)->content->attributes()['height'];

このように取得できます。

まとめるとこんな感じ

$rss_url = 'https://monmon.jp/feed/';

$rss = simplexml_load_string( file_get_contents( $this->rss_url ),'SimpleXMLElement', LIBXML_NOCDATA);

foreach($rss->channel->item as $item){

    //いろいろ読み込むよ♪
    $title = $item->title;
    $link = $item->link;

    $image_url = $item->children('media', True)->content->attributes()['url'];
    $image_width = $item->children('media', True)->content->attributes()['width'];
    $image_height = $item->children('media', True)->content->attributes()['height'];

    //ここで好きに処理するよ♪
    
}

$image_url などの変数に画像URL、幅、高さがそれぞれ格納されますので、あとは煮るなり焼くなり好きに使って。