引き続きリンク先のタイトルと概要文を取得します。
前回まで
リンク先から取得したHTMLを見て、OGPの情報を取得しました。
OGPが設定されていないサイト
OGPが設定されているサイトは上手くタイトルと概要文が取得できましたが、facebookでのシェアを意識していないサイトはOGP情報が設定されていません。
←サイト名称 | |
←タイトル | |
http://www.metro.tokyo.jp/ | ←URL |
←概要文 |
titleタグとmetaタグのdescriptionを設定しているサイトは多いので、そっちを取得してみます。
コードを書いていく
titleを取得する
OGPのタイトルが取得できなかった場合、titleタグに書かれた文字を取得します。
if (preg_match('/property="og:title"\s*content="([^"]*)/si', $html, $m ) ) { $title = esc_html($m[1]); } else { if (preg_match('/<\s*title\s*[^>]*>\s*([^<]*)\s*<\s*\/title\s*[^>]*>/si', $html, $m ) ) { $title = esc_html($m[1]); } } if (preg_match('/property="og:description"\s*content="([^"]*)/si', $html, $m ) ) { $excerpt = esc_html($m[1]); } if (preg_match('/property="og:site_name"\s*content="([^"]*)/si', $html, $m ) ) { $site_name = esc_html($m[1]); }
descriptionを取得する
OGPの概要文が取得できなかった場合、metaタグのdescriptionに書かれた文字を取得します。
if (preg_match('/property="og:title"\s*content="([^"]*)/si', $html, $m ) ) { $title = esc_html($m[1]); } else { if (preg_match('/<\s*title\s*[^>]*>\s*([^<]*)\s*<\s*\/title\s*[^>]*>/si', $html, $m ) ) { $title = esc_html($m[1]); } } if (preg_match('/property="og:description"\s*content="([^"]*)/si', $html, $m ) ) { $excerpt = esc_html($m[1]); } else { if (preg_match('/name="description"\s*content="([^"]*)/si', $html, $m ) ) { $excerpt = esc_html($m[1]); } } if (preg_match('/property="og:site_name"\s*content="([^"]*)/si', $html, $m ) ) { $site_name = esc_html($m[1]); }
ドメイン名を取得する
OGPのサイト名称が取得できなかった場合、URLからドメイン名を取得します。
if (preg_match('/property="og:title"\s*content="([^"]*)/si', $html, $m ) ) { $title = esc_html($m[1]); } else { if (preg_match('/<\s*title\s*[^>]*>\s*([^<]*)\s*<\s*\/title\s*[^>]*>/si', $html, $m ) ) { $title = esc_html($m[1]); } } if (preg_match('/property="og:description"\s*content="([^"]*)/si', $html, $m ) ) { $excerpt = esc_html($m[1]); } else { if (preg_match('/name="description"\s*content="([^"]*)/si', $html, $m ) ) { $excerpt = esc_html($m[1]); } } if (preg_match('/property="og:site_name"\s*content="([^"]*)/si', $html, $m ) ) { $site_name = esc_html($m[1]); } else { $m = parse_url($url ); $site_name = $m['host']; }
タイトルと概要文が取得できた
もう一度試してみます。
www.metro.tokyo.jp | ←サイト名称 |
東京都公式ホームページ | ←タイトル |
http://www.metro.tokyo.jp/ | ←URL |
東京都庁の公式ホームページ。都政に関する最新情報、記者会見、都議会や各局の情報、統計、入札・契約情報、知事への提言など。 | ←概要文 |
OGPが設定されていないサイトでもタイトルと概要文を取得することができました。
今回のコード
今回はここまでです。
<?php /* Plugin Name: popo-Blogcard Plugin URI: https://popozure.info/20180808/13142 Description: Blogcard Version: 0.0.1 Author: poporon Author URI: https://popozure.info License: GPL2 */ class popo_blogcard { function __construct() { add_shortcode('blogcard', array($this, 'shortcode' ) ); } function shortcode($opt , $content = null ) { $url = $opt['url']; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt($ch, CURLOPT_TIMEOUT, 8 ); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true ); curl_setopt($ch, CURLOPT_MAXREDIRS, 8 ); curl_setopt($ch, CURLOPT_AUTOREFERER, true ); curl_setopt($ch, CURLOPT_COOKIESESSION, true ); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false ); $html = curl_exec($ch); if (curl_errno($ch ) ) { $site_name = ''; $title = $url; $excerpt = ''; } else { if (preg_match('/property="og:title"\s*content="([^"]*)/si', $html, $m ) ) { $title = esc_html($m[1]); } else { if (preg_match('/<\s*title\s*[^>]*>\s*([^<]*)\s*<\s*\/title\s*[^>]*>/si', $html, $m ) ) { $title = esc_html($m[1]); } } if (preg_match('/property="og:description"\s*content="([^"]*)/si', $html, $m ) ) { $excerpt = esc_html($m[1]); } else { if (preg_match('/name="description"\s*content="([^"]*)/si', $html, $m ) ) { $excerpt = esc_html($m[1]); } } if (preg_match('/property="og:site_name"\s*content="([^"]*)/si', $html, $m ) ) { $site_name = esc_html($m[1]); } else { $m = parse_url($url ); $site_name = $m['host']; } } curl_close($ch ); $html = '<DIV class="popo_bc_site_name">'.$site_name.'</DIV><DIV>'.$title.'</DIV><DIV>'.$url.'</DIV><DIV>'.$excerpt.'</DIV>'; return $html; } } $popo_blogcard = new popo_blogcard;
次回は・・・
UTF-8以外の文字コードに対応しようと思います。
では、この辺で。(^-^)o
コメント