上手くタイトルと概要文が取れないサイトの対応をします。
前回まで
OGPが設定されていないサイトのタイトルと概要文を取得しました。
UTF-8以外の文字コードのサイト
文字コードがUTF-8以外の場合、正しく文字を扱うことが出来ず、タイトルや概要文が取得できません。
UTF-8に文字コードを変換すると上手く扱うことが出来ます。
文字コードがEUC-JPのサイト
←サイト名称 | |
←タイトル | |
https://www.4gamer.net/ | ←URL |
←概要文 |
文字コードがシフトJISのサイト
←サイト名称 | |
←タイトル | |
https://nttxstore.jp/ | ←URL |
←概要文 |
コードを書いていく
文字コードを変換する
cURLで取得した$htmlの文字コードをUTF-8に変換します。
if (curl_errno($ch ) ) { $site_name = ''; $title = $url; $excerpt = ''; } else { $html = mb_convert_encoding($html, 'UTF-8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS' ); 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]); } }
タイトルと概要文が取得できた
もう一度試してみます。
文字コードがEUC-JPのサイト
www.4gamer.net | ←サイト名称 |
4Gamer.net ― 日本最大級の総合ゲーム情報サイト。最新ゲームのニュース,レビューはここで! | ←タイトル |
https://www.4gamer.net/ | ←URL |
ゲームの最新ニュースをお届けします。また,ゲームのタイトルのユーザーレビューの募集/掲載や,発売スケジュールなども用意。遊びたいゲームを探す時にご活用ください! | ←概要文 |
文字コードがシフトJISのサイト
nttxstore.jp | ←サイト名称 |
NTTグループの安心オンラインストア – NTT-X Store | ←タイトル |
https://nttxstore.jp/ | ←URL |
NTTグループが運営する安心・安全の通販ショップNTT-X Store。パソコン、液晶ディスプレイ、デジカメ、デジタル機器、ネットワークカメラ、家電などを激安価格と即納で通信販売!送料無料やクーポンなどお得な商品を多数掲載中です。 | ←概要文 |
今回のコード
今回はここまでです。
<?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 { $html = mb_convert_encoding($html, 'UTF-8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS' ); 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;
次回は・・・
スタイルシートを設定してブログカードっぽい見た目にしようと思います。
では、この辺で。(^-^)o
コメント
ぽぽろん様
始めまして。Pz-LinkCardを大変便利に利用させて頂いております。
抜粋文(概要文)について教えて頂きたいのですが
Metaタグのdescription(og:description)の内容を表示させることは可能でしょうか。
お手数ですがご教示頂けると幸いです。
よろしくお願いいたします。
谷内さん、ご利用&コメントありがとうございます。
Pz-LinkCardでは、外部リンクの場合、「og:description」、「meta description」の順番で取得して表示しています。
内部リンクの場合、記事内容から取得していますが、記事取得方法を「抜粋文が設定されている投稿はそちらを優先する」にすると、descriptionと同じ文が取得できると思います。
どちらかのサイトで上手く取得できていない状況でしょうか?