Written by Anonymous
//外部サイトから直接OGP情報を取得してブログカードにする
if ( !function_exists( 'url_to_external_ogp_blogcard_tag' ) ):
function url_to_external_ogp_blogcard_tag($url){
if ( !$url ) return;
$url = strip_tags($url);//URL
if (preg_match('/.+(\.mp3|\.midi|\.mp4|\.mpeg|\.mpg|\.jpg|\.jpeg|\.png|\.gif|\.svg|\.pdf)$/i', $url, $m)) {
return;
}
$url = ampersand_urldecode($url);
$params = get_url_params($url);
$user_title = !empty($params['title']) ? $params['title'] : null;
$user_snippet = !empty($params['snippet']) ? $params['snippet'] : null;
//$url = add_query_arg(array('title' => null, 'snippet' => null), $url);
//_v($url);
$url_hash = TRANSIENT_BLOGCARD_PREFIX.md5( $url );
$error_title = $url; //エラーの場合はURLを表示
$title = $error_title;
$error_image = get_site_screenshot_url($url);
$image = '';
$snippet = '';
require_once abspath(__FILE__).'open-graph.php';
//ブログカードキャッシュ更新モード、もしくはログインユーザー以外のときはキャッシュの取得
if ( !(is_external_blogcard_refresh_mode() && is_user_administrator()) ) {
//保存したキャッシュを取得
$ogp = get_transient( $url_hash );
}
// キャッシュが無い
if ( empty($ogp) ) {
$ogp = OpenGraphGetter::fetch( $url );
// _v($ogp);
if ( $ogp == false ) {
$ogp = 'error';
} else {
if ( isset( $ogp->title ) && $ogp->title )
$title = $ogp->title;//タイトルの取得
if ( isset( $ogp->description ) && $ogp->description )
$snippet = $ogp->description;//ディスクリプションの取得
if ( isset( $ogp->image ) && $ogp->image )
$image = $ogp->image;//画像URLの取得
}
set_transient( $url_hash, $ogp,
DAY_IN_SECONDS * intval(get_external_blogcard_cache_retention_period()) );
} elseif ( $ogp == 'error' ) {
//前回取得したとき404ページだったら何も出力しない
} else {
if ( isset( $ogp->title ) && $ogp->title )
$title = $ogp->title;//タイトルの取得
if ( isset( $ogp->description ) && $ogp->description )
$snippet = $ogp->description;//ディスクリプションの取得
if ( isset( $ogp->image ) && $ogp->image )
$image = $ogp->image;//画像URLの取得
}
//var_dump($image);
//ドメイン名を取得(OGP情報のURLが正しいかのチェック)
$durl = punycode_decode($url);
if (isset($ogp->url) && preg_match(URL_REG, $ogp->url)) {
$durl = punycode_decode($ogp->url);
}
$domain = get_domain_name($durl);
$domain_style = get_external_blogcard_domain_style(); // "domain" or "name"
if ($domain_style === 'name' && !empty($ogp->site_name)) {
$domain = $ogp->site_name; // OGPのサイト名を優先
}
// og:imageが相対パスまたは無効URLのとき
if(!$image || (strpos($image, '//') === false) || (is_ssl() && (strpos($image, 'https:') === false))){
$image = '';
}
// og:imageが直接参照不可(403エラー)のとき
if($image && !is_image_accessible_browser_like($image)) {
$image = '';
}
// OGP画像が無い/アクセス不可の場合はスクリーンショット画像に
if (empty($image)) {
$image = $error_image;
}
$title = strip_tags($title);
if ($user_title) {
$title = $user_title;
}
//タイトルのフック
$title = apply_filters('cocoon_blogcard_title',$title);
$title = apply_filters('cocoon_external_blogcard_title',$title);
$image = strip_tags($image);
$snippet = get_content_excerpt($snippet, get_entry_card_excerpt_max_length());
$snippet = strip_tags($snippet);
if ($user_snippet) {
$snippet = $user_snippet;
}
$snippet = apply_filters( 'cocoon_blogcard_snippet', $snippet );
$snippet = apply_filters( 'cocoon_external_blogcard_snippet', $snippet );
//新しいタブで開く場合
$target = is_external_blogcard_target_blank() ? ' target="_blank"' : '';
$rel = '';
if (is_external_blogcard_target_blank()) {
$rel = ' rel="noopener"';
}
//コメント内でブログカード呼び出しが行われた際はnofollowをつける
global $comment; //コメント内以外で$commentを呼び出すとnullになる
if (is_external_blogcard_target_blank() && $comment) {
$rel = ' rel="nofollow noopener"';
}
//GoogleファビコンAPIを利用する
////www.google.com/s2/favicons?domain=nelog.jp
$favicon_tag = '<div class="blogcard-favicon external-blogcard-favicon">'.
get_original_image_tag('https://www.google.com/s2/favicons?domain='.$durl, 16, 16, 'blogcard-favicon-image external-blogcard-favicon-image').
'</div>';
//サイトロゴ
$site_logo_tag = '<div class="blogcard-domain external-blogcard-domain">'.$domain.'</div>';
$site_logo_tag = '<div class="blogcard-site external-blogcard-site">'.$favicon_tag.$site_logo_tag.'</div>';
//サムネイルを取得できた場合
$image = apply_filters('get_external_blogcard_thumbnail_url', $image);
if ( $image ) {
$thumbnail = get_original_image_tag($image, THUMB160WIDTH, THUMB160HEIGHT, 'blogcard-thumb-image external-blogcard-thumb-image');
}
//取得した情報からブログカードのHTMLタグを作成
$tag =
'<a href="'.esc_url($url).'" title="'.esc_attr($title).'" class="blogcard-wrap external-blogcard-wrap a-wrap cf"'.$target.$rel.'>'.
'<div class="blogcard external-blogcard'.get_additional_external_blogcard_classes().' cf">'.
'<div class="blogcard-label external-blogcard-label">'.
'<span class="fa"></span>'.
'</div>'.
'<figure class="blogcard-thumbnail external-blogcard-thumbnail">'.$thumbnail.'</figure>'.
'<div class="blogcard-content external-blogcard-content">'.
'<div class="blogcard-title external-blogcard-title">'.$title.'</div>'.
'<div class="blogcard-snippet external-blogcard-snippet">'.$snippet.'</div>'.
'</div>'.
'<div class="blogcard-footer external-blogcard-footer cf">'.$site_logo_tag.'</div>'.
'</div>'.
'</a>';
return $tag;
}
endif;
// リンク防止か判定
if ( !function_exists( 'is_image_accessible_browser_like' ) ):
function is_image_accessible_browser_like($url) {
if (empty($url)) return false;
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_NOBODY => true, // ヘッダのみ
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 5,
CURLOPT_TIMEOUT => 5,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36',
CURLOPT_REFERER => 'https://www.google.com/',
CURLOPT_HTTPHEADER => [
'Accept: image/webp,image/apng,image/*,*/*;q=0.8',
'Accept-Language: ja,en-US;q=0.9,en;q=0.8'
],
]);
curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ($http_code >= 200 && $http_code < 300);
}
endif;