リンクをカードにするプラグインを作ろう!(6)文字コードを変換する

PHP
この記事は約3分で読めます。

上手くタイトルと概要文が取れないサイトの対応をします。

前回まで

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*&#91;^>]*>\s*([^<&#93;*)\s*<\s*\/title\s*&#91;^>]*>/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&#91;'url'&#93;;
        $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="(&#91;^"&#93;*)/si', $html, $m ) ) {
                $title = esc_html($m&#91;1&#93;);
            } else {
                if (preg_match('/<\s*title\s*&#91;^>]*>\s*([^<&#93;*)\s*<\s*\/title\s*&#91;^>]*>/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

PHPWordPress
ぽぽろんをフォローする
この記事を書いた人

「ただいま」の挨拶よりもパソコンの電源を入れる方が先なパソコンおたく。プログラミングもするけど、パソコンを触っていること自体が趣味。

ぽぽろんをフォローする

コメント

  1. ぽぽろん様

    始めまして。Pz-LinkCardを大変便利に利用させて頂いております。

    抜粋文(概要文)について教えて頂きたいのですが
    Metaタグのdescription(og:description)の内容を表示させることは可能でしょうか。

    お手数ですがご教示頂けると幸いです。
    よろしくお願いいたします。

    • 谷内さん、ご利用&コメントありがとうございます。

      Pz-LinkCardでは、外部リンクの場合、「og:description」、「meta description」の順番で取得して表示しています。

      内部リンクの場合、記事内容から取得していますが、記事取得方法を「抜粋文が設定されている投稿はそちらを優先する」にすると、descriptionと同じ文が取得できると思います。

      どちらかのサイトで上手く取得できていない状況でしょうか?

タイトルとURLをコピーしました