リンクをカードにするプラグインを作ろう!(5)metaタグを取得する

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

引き続きリンク先のタイトルと概要文を取得します。

前回まで

リンク先から取得した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*&#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]);
            }
            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*&#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]);
            }

ドメイン名を取得する

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*&#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'];
            }

タイトルと概要文が取得できた

もう一度試してみます。

東京都公式ホームページ
東京都庁の公式ホームページ。都政に関する最新情報、記者会見、都議会や各局の情報、統計、入札・契約情報、知事への提言など。
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&#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 {
            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;

次回は・・・

UTF-8以外の文字コードに対応しようと思います。

では、この辺で。(^-^)o

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

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

ぽぽろんをフォローする

コメント

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