リンクをカードにするプラグインを作ろう!(11)テキストリンク行を変換

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

テキストにリンクが設定されただけの行をブログカードにします。

前回まで

サイトアイコンを表示させました。

テキストリンク行を変換する

フィルターの設定

記事の内容を取得するときのフィルターを設定します。

    function __construct() {
        add_shortcode('blogcard', array($this, 'shortcode' ) );
        add_action('wp_enqueue_scripts', array($this, 'enqueue' ) );
        add_filter('the_content', array($this, 'filter_content') );
        register_activation_hook(__FILE__, array($this, 'activate') );
        register_deactivation_hook(__FILE__, array($this, 'deactivate') );
    }

フィルターの関数を用意する

記事の内容を取得するときのフィルター関数を用意します。

    function enqueue() {
        wp_enqueue_style('popo-blogcard', plugin_dir_url(__FILE__).'style.css');
    }
    function filter_content($content) {
    }
}
$popo_blogcard = new popo_blogcard;

正規表現でショートコードに置き換える

テキストにリンクが設定されただけの行を探してショートコードに置きます。

    function enqueue() {
        wp_enqueue_style('popo-blogcard', plugin_dir_url(__FILE__).'style.css');
    }
    function filter_content($content) {
        $content = preg_replace( '/(^|<br ?\/?>)(<p.*>)?<a .*href=&#91;\'"&#93;(https?:\/\/&#91;-_\.!~*()a-zA-Z0-9;\/?:\@&=+\$,%#&#93;+)&#91;\'"&#93;((?!<IMG).)*<\/a>(<\/p>)?$/im', '[blogcard url="$3"]', $content);
        return $content;
    }
}
$popo_blogcard = new popo_blogcard;

表示してみる

記事中にテキストにリンクを設定した行を書きます。

記事を表示させるとブログカードになりました。

今回のコード

プラグイン本体

<?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' ) );
        add_action('wp_enqueue_scripts', array($this, 'enqueue' ) );
        add_filter('the_content', array($this, 'filter_content') );
        register_activation_hook(__FILE__, array($this, 'activate') );
        register_deactivation_hook(__FILE__, array($this, 'deactivate') );
    }
    function shortcode($opt , $content = null ) {
        $url = $opt&#91;'url'&#93;;
        global $wpdb;
        $data = $wpdb->get_row($wpdb->prepare("SELECT * FROM ".$wpdb->prefix."popo_blogcard WHERE url=%s", $url ) );
        if ($data ) {
            $site_name = $data->site_name;
            $title = $data->title;
            $excerpt = $data->excerpt;
        } else {
            $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*&#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 );
            $result = $wpdb->insert(
                $wpdb->prefix.'popo_blogcard',
                array(
                    'url' => $url,
                    'site_name' => $site_name,
                    'title' => $title,
                    'excerpt' => $excerpt
                )
            );
        }
        $site_icon = '<IMG class="popo_bc_siteicon" src="https://www.google.com/s2/favicons?domain=' .$url.'" alt="">';
        $thumbnail = '<IMG class="popo_bc_thumbnail" src="https://s.wordpress.com/mshots/v1/' .$url.'?w=94" alt="">';
        $html = '<DIV class="popo_blogcard"><A href="'.$url.'" target="_blank" class="popo_bc_link"><DIV class="popo_bc_wrap">'.$site_icon.'<DIV class="popo_bc_site_name">'.$site_name.'</DIV><DIV class="popo_bc_content">'.$thumbnail.'<DIV class="popo_bc_title">'.$title.'</DIV><DIV class="popo_bc_url">'.$url.'</DIV><DIV class="popo_bc_excerpt">'.$excerpt.'</DIV></DIV></DIV></DIV>';
        return $html;
    }
    public function activate() {
        global $wpdb;
        $wpdb->hide_errors();
        require_once (ABSPATH.'wp-admin/includes/upgrade.php');
        $sql = "CREATE TABLE ".$wpdb->prefix."popo_blogcard (
                    url              VARCHAR(2048)   DEFAULT '',
                    site_name        VARCHAR(100)    DEFAULT '',
                    title            VARCHAR(200)    DEFAULT '',
                    excerpt          VARCHAR(500)    DEFAULT '',
                ) ".$wpdb->get_charset_collate()." ;";
        dbDelta($sql);
    }
    public function deactivate() {
        global $wpdb;
        $sql = "DROP TABLE ".$wpdb->prefix."popo_blogcard";
        $wpdb->query($sql);
    }
    function enqueue() {
        wp_enqueue_style('popo-blogcard', plugin_dir_url(__FILE__).'style.css');
    }
    function filter_content($content) {
        $content = preg_replace( '/(^|<br ?\/?>)(<p.*>)?<a .*href=&#91;\'"&#93;(https?:\/\/&#91;-_\.!~*()a-zA-Z0-9;\/?:\@&=+\$,%#&#93;+)&#91;\'"&#93;((?!<IMG).)*<\/a>(<\/p>)?$/im', '[blogcard url="$3"]', $content);
        return $content;
    }
}
$popo_blogcard = new popo_blogcard;

スタイルシート

.popo_bc_wrap {
    margin: 16px;
    padding: 8px;
    width: 96%;
    border: 2px solid #8888ff;
    background-color: #ffffff;
    border-radius: 3px;
}
.popo_bc_link {
    text-decoration: none;
}
.popo_bc_siteicon {
    float: left;
}
.popo_bc_site_name {
    display: block;
    font-size: 12px;
}
.popo_bc_thumbnail {
    float: left;
    padding: 8px;
    max-width: 94px;
}
.popo_bc_title {
    display: block;
    font-size: 18px;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}
.popo_bc_url {
    display: block;
    font-size: 12px;
    color: #00f;
    text-decoration: underline;
}
.popo_bc_excerpt {
    height: 32px;
    font-size: 12px;
    color: #444;
    overflow: hidden;
    text-overflow: ellipsis;
}

次回は・・・

今回でこの企画は終了です。

何か要望があれば追加したいと思います。

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

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

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

ぽぽろんをフォローする

コメント

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