上手くタイトルと概要文が取れないサイトの対応をします。
前回まで
OGPが設定されていないサイトのタイトルと概要文を取得しました。
UTF-8以外の文字コードのサイト
文字コードがUTF-8以外の場合、正しく文字を扱うことが出来ず、タイトルや概要文が取得できません。
UTF-8に文字コードを変換すると上手く扱うことが出来ます。
文字コードがEUC-JPのサイト
4Gamer.net ― 日本最大級の総合ゲーム情報サイト。最新ゲームのニュース,レビューはここで!ゲームの最新ニュースをお届けします。また,ゲームのタイトルのユーザーレビューの募集/掲載や,発売スケジュールなども用意。遊びたいゲームを探す時にご活用ください!
| ←サイト名称 | |
| ←タイトル | |
| https://www.4gamer.net/ | ←URL |
| ←概要文 |
文字コードがシフトJISのサイト
NTTグループの安心オンラインストア - NTT-X StoreNTTグループが運営する安心・安全の通販ショップ OCN オンラインショップ(旧NTT-X Store)。「PC・家電」カテゴリでは、パソコン、液晶ディスプレイ、デジカメ、デジタル機器、ネットワークカメラ、家電などを激安価格と即納で通信販売...
| ←サイト名称 | |
| ←タイトル | |
| 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のサイト
4Gamer.net ― 日本最大級の総合ゲーム情報サイト。最新ゲームのニュース,レビューはここで!ゲームの最新ニュースをお届けします。また,ゲームのタイトルのユーザーレビューの募集/掲載や,発売スケジュールなども用意。遊びたいゲームを探す時にご活用ください!
| www.4gamer.net | ←サイト名称 |
| 4Gamer.net ― 日本最大級の総合ゲーム情報サイト。最新ゲームのニュース,レビューはここで! | ←タイトル |
| https://www.4gamer.net/ | ←URL |
| ゲームの最新ニュースをお届けします。また,ゲームのタイトルのユーザーレビューの募集/掲載や,発売スケジュールなども用意。遊びたいゲームを探す時にご活用ください! | ←概要文 |
文字コードがシフトJISのサイト
NTTグループの安心オンラインストア - NTT-X StoreNTTグループが運営する安心・安全の通販ショップ OCN オンラインショップ(旧NTT-X Store)。「PC・家電」カテゴリでは、パソコン、液晶ディスプレイ、デジカメ、デジタル機器、ネットワークカメラ、家電などを激安価格と即納で通信販売...
| 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と同じ文が取得できると思います。
どちらかのサイトで上手く取得できていない状況でしょうか?