Permalink
Fetching contributors…
Cannot retrieve contributors at this time
1106 lines (965 sloc) 42.6 KB
<?php //AMP
/**
* Cocoon WordPress Theme
* @author: yhira
* @link: https://wp-cocoon.com/
* @license: http://www.gnu.org/licenses/gpl-2.0.html GPL v2 or later
*/
//AMP判別関数
if ( !function_exists( 'is_amp' ) ):
function is_amp(){
//bbPressがインストールされていて、トピックの時は除外
if (is_plugin_fourm_page()) {
return false;
}
//AMPチェック
$is_amp = false;
if ( empty($_GET['amp']) ) {
return false;
}
// ampのパラメーターが1かつ
// かつsingularページのみ$is_ampをtrueにする
if(is_amp_enable() && //AMPがカスタマイザーの有効化されているか
is_singular() &&
$_GET['amp'] === '1' &&//URLにamp=1パラメータがあるとき
has_amp_page()//AMPページが存在しているとき
){
$is_amp = true;
}
return $is_amp;
}
endif;
//AMPページがある投稿ページか
if ( !function_exists( 'has_amp_page' ) ):
function has_amp_page(){
$category_ids = get_amp_exclude_category_ids();
//return 1;
return is_singular() &&
is_amp_enable() &&
is_the_page_amp_enable() &&
!in_category( $category_ids ) && //除外カテゴリではAMPページを生成しない
//プラグインが生成するフォーラムページでない場合
!is_plugin_fourm_page();
}
endif;
//AMP用にコンテンツを変換する
//add_filter('the_content','convert_content_for_amp', 999999999);
if ( !function_exists( 'convert_content_for_amp' ) ):
function convert_content_for_amp($the_content){
if ( !is_amp() ) {
return $the_content;
}
//iframe用のplaceholderタグ(amp-iframeの呼び出し位置エラー対策)
$amp_placeholder = '<amp-img layout="fill" src="'.get_template_directory_uri().'/images/transparence.png'.'" placeholder></amp-img>';
// バリューコマースのバナー変換
$pattern = '/<script .+?ad\.jp\.ap\.valuecommerce\.com\/servlet\/jsbanner.+?<a.+?ck\.jp\.ap\.valuecommerce\.com.+?sid=(\d+).+?pid=(\d+).+?<\/a><\/noscript>/';
// preg_match($pattern, $the_content, $m);
// _v($the_content);
// _v($m);
$append =
'<amp-ad width="300" height="250"
type="valuecommerce"
data-sid="$1"
data-pid="$2">
</amp-ad>';
$the_content = preg_replace($pattern, $append, $the_content);
//noscriptタグの削除
$the_content = preg_replace('/<noscript>/i', '', $the_content);
$the_content = preg_replace('/<\/noscript>/i', '', $the_content);
//fontタグの削除
$the_content = preg_replace('/<font[^>]*?>/i', '', $the_content);
$the_content = preg_replace('/<\/font>/i', '', $the_content);
//colタグのwidth属性削除
$the_content = preg_replace('/<col(.*?) width="[^"]*?"(.*?)>/i', '<col$1$2>', $the_content);
$the_content = preg_replace("/<col(.*?) width='[^']*?'(.*?)>/i", '<col$1$2>', $the_content);
//Amazon商品リンクのhttp URLをhttpsへ
$the_content = str_replace(
'http://rcm-jp.amazon.co.jp/',
'https://rcm-fe.amazon-adsystem.com/', $the_content);
$the_content = str_replace(
'"//rcm-fe.amazon-adsystem.com/',
'"https://rcm-fe.amazon-adsystem.com/', $the_content);
$the_content = str_replace(
"'//rcm-fe.amazon-adsystem.com/",
"'https://rcm-fe.amazon-adsystem.com/", $the_content);
//Amazon商品画像のURLをhttpsへ
$the_content = str_replace(
'http://ecx.images-amazon.com',
'https://images-fe.ssl-images-amazon.com', $the_content);
//楽天商品画像のURLをhttpsへ
$the_content = str_replace(
'http://thumbnail.image.rakuten.co.jp',
'https://thumbnail.image.rakuten.co.jp', $the_content);
//レントラックス
$the_content = str_replace(
'http://www.rentracks.jp/adx/p.gifx',
'https://www.rentracks.jp/adx/p.gifx', $the_content);
$the_content = str_replace(
'http://www.image-rentracks.com/',
'https://www.image-rentracks.com/', $the_content);
//YouTube iframeのsrc属性のhttp URLをhttpsへ
$the_content = str_replace('http://www.youtube.com/', 'https://www.youtube.com/', $the_content);
//JetpackがYouTubeのURLに余計なクエリを付け加えるのを取り除く
//$the_content = preg_replace('{(https://www.youtube.com/embed/[^?"\']+)[^"\']*}i', '$1', $the_content);
//Googleカスタム検索ボックス
$the_content = preg_replace('{</?gcse:searchbox-only>}', '', $the_content);
$the_content = preg_replace('{</?gcse:search>}', '', $the_content);
//C2A0文字コード(UTF-8の半角スペース)を通常の半角スペースに置換
$the_content = str_replace('\xc2\xa0', ' ', $the_content);
//インラインスタイルを除去する場合
if (!is_amp_inline_style_enable()) {
//style属性を取り除く
$the_content = preg_replace('/ +?style=["][^"]*?["]/i', '', $the_content);
$the_content = preg_replace('/ +?style=[\'][^\']*?[\']/i', '', $the_content);
} else {
//style属性にzoomが入っていれば取り除く
$pattern = '/style="(.*?)zoom:.+?;(.*?)"/i';
$append = 'style="$1$2"';
$the_content = preg_replace($pattern, $append, $the_content);
//style属性に-webkitが入っていれば取り除く
$pattern = '/style="(.*?)-webkit-.+?:.+?;(.*?)"/i';
$append = 'style="$1$2"';
$the_content = preg_replace($pattern, $append, $the_content);
//style属性に_displayが入っていれば取り除く
$pattern = '/style="(.*?)_display:.+?;(.*?)"/i';
$append = 'style="$1$2"';
$the_content = preg_replace($pattern, $append, $the_content);
//style属性に!importantが入っていれば取り除く
$pattern = '/style="(.*?)!important(.*?)"/i';
$append = 'style="$1$2"';
$the_content = preg_replace($pattern, $append, $the_content);
}
//target属性を取り除く
$the_content = preg_replace('/ +?target=["](?!.*_blank).*?["]/i', '', $the_content);
$the_content = preg_replace('/ +?target=[\'](?!.*_blank).*?[\']/i', '', $the_content);
// $the_content = preg_replace('/ +?target=["][^"]*?["]/i', '', $the_content);
// $the_content = preg_replace('/ +?target=[\'][^\']*?[\']/i', '', $the_content);
//rel属性を取り除く
$the_content = preg_replace('/ +?rel=["][^"]*?["]/i', '', $the_content);
$the_content = preg_replace('/ +?rel=[\'][^\']*?[\']/i', '', $the_content);
//onclick属性を取り除く
$the_content = preg_replace('/ +?onclick=["][^"]*?["]/i', '', $the_content);
$the_content = preg_replace('/ +?onclick=[\'][^\']*?[\']/i', '', $the_content);
//onload属性を取り除く
$the_content = preg_replace('/ +?onload=["][^"]*?["]/i', '', $the_content);
$the_content = preg_replace('/ +?onload=[\'][^\']*?[\']/i', '', $the_content);
//marginwidth属性を取り除く
$the_content = preg_replace('/ +?marginwidth=["][^"]*?["]/i', '', $the_content);
$the_content = preg_replace('/ +?marginwidth=[\'][^\']*?[\']/i', '', $the_content);
//marginheight属性を取り除く
$the_content = preg_replace('/ +?marginheight=["][^"]*?["]/i', '', $the_content);
$the_content = preg_replace('/ +?marginheight=[\'][^\']*?[\']/i', '', $the_content);
//contenteditable属性を取り除く
$the_content = preg_replace('/ +?contenteditable=["][^"]*?["]/i', '', $the_content);
$the_content = preg_replace('/ +?contenteditable=[\'][^\']*?[\']/i', '', $the_content);
//sandbox属性を取り除く
$the_content = preg_replace('/ +?sandbox=["][^"]*?["]/i', '', $the_content);
$the_content = preg_replace('/ +?sandbox=[\'][^\']*?[\']/i', '', $the_content);
//security属性を取り除く
$the_content = preg_replace('/ +?security=["][^"]*?["]/i', '', $the_content);
$the_content = preg_replace('/ +?security=[\'][^\']*?[\']/i', '', $the_content);
//xml:lang属性を取り除く
$the_content = preg_replace('/ +?xml:lang=["][^"]*?["]/i', '', $the_content);
$the_content = preg_replace('/ +?xml:lang=[\'][^\']*?[\']/i', '', $the_content);
// //type属性を取り除く
// $the_content = preg_replace('/ +?type=["][^"]*?["]/i', '', $the_content);
// $the_content = preg_replace('/ +?type=[\'][^\']*?[\']/i', '', $the_content);
$the_content = str_replace(' type="text/html"', '', $the_content);
//YouTubeプレイヤーのtype属性を取り除く
$the_content = str_replace(" class='youtube-player' type='text/html'", " class='youtube-player'", $the_content);
$the_content = str_replace(' class="youtube-player" type="text/html"', ' class="youtube-player"', $the_content);
//FONTタグを取り除く
$the_content = preg_replace('/<font[^>]+?>/i', '', $the_content);
$the_content = preg_replace('/<\/font>/i', '', $the_content);
//ドロップダウンのアーカイブウィジェットは削除
$pattern = '{<aside id="archives-.+?archives-dropdown.+?</aside>}is';
$append = '';
$the_content = preg_replace($pattern, $append, $the_content);
$pattern = '{<div id="archives-.+?<select id="archives-dropdown-.+?</div>}is';
$append = '';
$the_content = preg_replace($pattern, $append, $the_content);
//ドロップダウンのカテゴリウィジェットは削除
$pattern = '{<aside id="categories-.+?categories-dropdown.+?</aside>}is';
$append = '';
$the_content = preg_replace($pattern, $append, $the_content);
$pattern = '{<div id="categories.+?categories-dropdown.+?</div>}is';
$append = '';
$the_content = preg_replace($pattern, $append, $the_content);
//formタグを取り除く
$the_content = preg_replace('{<form(?!.*class="amp-form).+?</form>}is', '', $the_content);
//AMPフォームの場合はtarget="_top"を加える
$the_content = str_replace('<form class="amp-form search-box"', '<form class="amp-form search-box" target="_top"', $the_content);
//formタグを完全に取り除く
$pattern = '{<form action="[^"]+?" method="get">(.*?</form>)?}is';
$append = '';
$the_content = preg_replace($pattern, $append, $the_content);
//ドロップダンスカテゴリの削除
$pattern = '{<aside class="widget.+?categories-dropdown.+?</aside>}is';
$append = '';
$the_content = preg_replace($pattern, $append, $the_content);
//selectタグを取り除く
$the_content = preg_replace('{<select.+?</select>}is', '', $the_content);
//アプリーチの画像対応
$the_content = preg_replace('/<img([^>]+?src="[^"]+?(mzstatic\.com|phobos\.apple\.com|ggpht\.com)[^"]+?[^>\/]+)\/?>/is', '<amp-img$1 width="75" height="75" sizes="(max-width: 75px) 100vw, 75px"></amp-img>', $the_content);
$the_content = preg_replace('/<img([^>]+?src="[^"]+?nabettu\.github\.io[^"]+?[^>\/]+)\/?>/is', '<amp-img$1 width="120" height="36" sizes="(max-width: 120px) 100vw, 120px"></amp-img>', $the_content);
//imgタグをamp-imgタグに変更する
$res = preg_match_all('/<img(.+?)\/?>/is', $the_content, $m);
//var_dump($res);
//var_dump($m);
if ($res) {//画像タグがある場合
//_v($m);
foreach ($m[0] as $match) {
//変数の初期化
$src_attr = null;
$url = null;
$width_attr = null;
$width_value = null;
$height_attr = null;
$height_value = null;
$alt_attr = null;
$alt_value = null;
$title_attr = null;
$title_value = null;
$sizes_attr = null;
//var_dump(htmlspecialchars($match));
//src属性の取得(画像URLの取得)
$src_res = preg_match('/src=["\']([^"\']+?)["\']/is', $match, $srcs);
if ($src_res) {
$src_attr = ' '.$srcs[0];//src属性を作成
$url = $srcs[1];//srcの値(URL)を取得する
}
//width属性の取得
$width_res = preg_match('/width=["\']([^"\']*?)["\']/is', $match, $widths);
if ($width_res) {
$width_attr = ' '.$widths[0];//width属性を作成
$width_value = $widths[1];//widthの値(幅)を取得する
}
//height属性の取得
$height_res = preg_match('/height=["\']([^"\']*?)["\']/is', $match, $heights);
if ($height_res) {
$height_attr = ' '.$heights[0];//height属性を作成
$height_value = $heights[1];//heightの値(高さ)を取得する
}
//class属性の取得
$class_value = null;
$class_attr = null;
$class_res = preg_match('/class=["\']([^"\']*?)["\']/is', $match, $classes);
if ($class_res) {
$class_attr = ' '.$classes[0];//class属性を作成
$class_value = $classes[1];//classの値を取得する
if ($class_value) {
$class_value = ' '.$class_value;
}
}
//alt属性の取得
$alt_res = preg_match('/alt=["]([^"]*?)["]/is', $match, $alts);
if (!$alt_res)
$alt_res = preg_match("/alt=[']([^']*?)[']/is", $match, $alts);
if ($alt_res) {
$alt_attr = ' '.$alts[0];//alt属性を作成
$alt_value = $alts[1];//altの値を取得する
}
//title属性の取得
$title_res = preg_match('/title=["]([^"]*?)["]/is', $match, $titles);
if (!$title_res)
$title_res = preg_match("/title=[']([^']*?)[']/is", $match, $titles);
if ($title_res) {
$title_attr = ' '.$titles[0];//title属性を作成
$title_value = $titles[1];//titleの値を取得する
}
//widthとheight属性のないものは画像から情報取得
if ($url && (empty($width_value) || empty($height_value))) {
$size = get_image_width_and_height($url);
//_v($class_value);
if ($size) {
//$class_attr = ' class="internal-content-img'.$class_value.'"';
$width_value = $size['width'];
$width_attr = ' width="'.$width_value.'"';//width属性を作成
$height_value = $size['height'];
$height_attr = ' height="'.$height_value.'"';//height属性を作成
} else {
//外部サイトにある画像の場合
//$class_attr = ' class="external-content-img'.$class_value.'"';
//var_dump($url);
if (
strpos($url,'//images-fe.ssl-images-amazon.com') !== false ||
strpos($url,'//thumbnail.image.rakuten.co.jp') !== false ||
strpos($url,'//item.shopping.c.yimg.jp') !== false
) {
//Amazon・楽天・Yahoo!ショッピング商品画像にwidthとheightの属性がない場合
$width_value = get_amp_product_image_width();
$width_attr = ' width="'.$width_value.'"';//width属性を作成
$height_value = get_amp_product_image_height();
$height_attr = ' height="'.$height_value.'"';//height属性を作成
} else {
$width_value = get_amp_default_image_width();
$width_attr = ' width="'.$width_value.'"';//width属性を作成
$height_value = get_amp_default_image_height();
$height_attr = ' height="'.$height_value.'"';//height属性を作成
}
}
}
//sizes属性の作成(きれいなレスポンシブ化のために)
if ($width_value) {
$sizes_attr = ' sizes="(max-width: '.$width_value.'px) 100vw, '.$width_value.'px"';
}
//amp-imgタグの作成
$tag = '<amp-img'.$src_attr.$width_attr.$height_attr.$alt_attr.$title_attr.$sizes_attr.$class_attr.'></amp-img>';
//_v($tag);
// echo('<pre>');
// var_dump($srcs);
// var_dump(htmlspecialchars($tag));
// var_dump($widths);
// var_dump($heights);
// var_dump($alts);
// var_dump($titles);
// echo('</pre>');
//imgタグをamp-imgタグに置換
$the_content = preg_replace('{'.preg_quote($match).'}', $tag , $the_content, 1);
}
}
//画像タグをAMP用に置換
$the_content = preg_replace('/<img(.+?)\/?>/is', '<amp-img$1></amp-img>', $the_content);
// Twitterをamp-twitterに置換する(埋め込みコード)
$pattern = '{<blockquote class="twitter-tweet".*?>.+?<a.+?href="https://twitter.com/.*?/status/([^\?"]+).*?">.+?</blockquote>}is';
$append = '<p><amp-twitter width=592 height=472 layout="responsive" data-tweetid="$1"></amp-twitter></p>';
$the_content = preg_replace($pattern, $append, $the_content);
// JetpackによるFacebook埋め込みをamp-facebookに置換する(埋め込みコード)
$pattern = '{<fb:post href="([^"]+?)"></fb:post>}is';
$append = '<amp-facebook width=324 height=438 layout="responsive" data-href="$1"></amp-facebook>';
$the_content = preg_replace($pattern, $append, $the_content);
// vineをamp-vineに置換する
$pattern = '/<iframe[^>]+?src="https:\/\/vine.co\/v\/(.+?)\/embed\/simple".+?><\/iframe>/is';
$append = '<p><amp-vine data-vineid="$1" width="592" height="592" layout="responsive"></amp-vine></p>';
$the_content = preg_replace($pattern, $append, $the_content);
// Instagramをamp-instagramに置換する
$pattern = '{<blockquote class="instagram-media".+?"https://www.instagram.com/p/(.+?)/.*?".+?</blockquote>}is';
$append = '<p><amp-instagram layout="responsive" data-shortcode="$1" width="592" height="592" ></amp-instagram></p>';
$the_content = preg_replace($pattern, $append, $the_content);
// audioをamp-audioに置換する
$pattern = '/<audio .+?src="([^"]+?)".+?<\/audio>/is';
$append = '<p><amp-audio src="$1"></amp-audio></p>';
$the_content = preg_replace($pattern, $append, $the_content);
// videoをamp-videoに置換する
$pattern = '/<video/i';
$append = '<amp-video controls layout="responsive" width="640" height="360"';
$the_content = preg_replace($pattern, $append, $the_content);
$pattern = '/<\/video>/i';
$append = '</amp-video>';
$the_content = preg_replace($pattern, $append, $the_content);
// YouTubeを置換する(埋め込みコード)
$pattern = '/<iframe[^>]+?src="https?:\/\/www.youtube.com\/embed\/([^\?"]+).*?".*?><\/iframe>/is';
$append = '<amp-youtube layout="responsive" data-videoid="$1" width="800" height="450"></amp-youtube>';
$the_content = preg_replace($pattern, $append, $the_content);
// Facebookを置換する(埋め込みコード)
$pattern = '/<div class="fb-video" data-allowfullscreen="true" data-href="([^"]+?)"><\/div>/is';
$append = '<amp-facebook layout="responsive" data-href="$1" width="500" height="450"></amp-facebook>';
$the_content = preg_replace($pattern, $append, $the_content);
//iframe埋め込み対策
$the_content = preg_replace('/ +allowTransparency(=["\'][^"\']*?["\'])?/i', '', $the_content);
$the_content = preg_replace('/ +allowFullScreen(=["\'][^"\']*?["\'])?/i', '', $the_content);
$the_content = preg_replace('/ +webkitAllowFullScreen(=["\'][^"\']*?["\'])?/i', '', $the_content);
$the_content = preg_replace('/ +mozallowfullscreen(=["\'][^"\']*?["\'])?/i', '', $the_content);
//はてなブログカードiframe用の処理追加
$pattern = '{<iframe.+?src="(https?://hatenablog-parts\.com/embed.+?)".+?></iframe>}is';
$append = '<amp-iframe src="$1" width="500" height="190"></amp-iframe>';
$the_content = preg_replace($pattern, $append, $the_content);
//Amazon商品紹介iframeのAMP化
$pattern = '{<iframe.+?src="(.+?rcm-fe\.amazon-adsystem\.com.+?)".+?(width="(\d+)")?.(height="(\d+)")?.+?</iframe>}is';
if (preg_match_all($pattern, $the_content, $m)) {
$all_idx = 0;
$url_idx = 1;
$width_attr_idx = 2;
$width_idx = 3;
$height_attr_idx = 4;
$height_idx = 5;
//_v($m);
if ($m[0]) {
$i = 0;
foreach ($m[$all_idx] as $key => $iframe_raw) {
$url = $m[$url_idx][$i];
$width = 120;
$height = 240;
if (isset($m[$width_idx]) && isset($m[$height_idx])) {
if (!empty($m[$width_idx][$i]) && !empty($m[$height_idx][$i])) {
$width = $m[$width_idx][$i];
$height = $m[$height_idx][$i];
}
}
$iframe_new = '<amp-iframe sandbox="allow-scripts allow-same-origin allow-popups" src="'.$url.'" width="'.$width.'" height="'.$height.'">'.$amp_placeholder.'</amp-iframe>';
//_v($iframe_new);
$the_content = str_replace($iframe_raw, $iframe_new, $the_content);
$i++;
}
}
//_v($m);
}
//タイトルつきiframeでhttpを呼び出している場合は通常リンクに修正
$pattern = '/<iframe[^>]+?src="(http:\/\/[^"]+?)"[^>]+?title="([^"]+?)"[^>]+?><\/iframe>/is';
$append = '<a href="$1">$2</a>';
$the_content = preg_replace($pattern, $append, $the_content);
$pattern = '/<iframe[^>]+?title="([^"]+?)[^>]+?src="(http:\/\/[^"]+?)""[^>]+?><\/iframe>/is';
$append = '<a href="$1">$2</a>';
$the_content = preg_replace($pattern, $append, $the_content);
//iframeでhttpを呼び出している場合は通常リンクに修正
$pattern = '/<iframe[^>]+?src="(http:\/\/[^"]+?)"[^>]+?><\/iframe>/is';
$append = '<a href="$1">$1</a>';
$the_content = preg_replace($pattern, $append, $the_content);
//iframeをamp-iframeに置換する
$pattern = '/<iframe/i';
$append = '<amp-iframe layout="responsive" sandbox="allow-scripts allow-same-origin allow-popups"';
$the_content = preg_replace($pattern, $append, $the_content);
$pattern = '/<\/iframe>/i';
$append = $amp_placeholder.'</amp-iframe>';
$the_content = preg_replace($pattern, $append, $the_content);
//カエレバのstyle属性を取り除く
$pattern = '{<div class="(kaerebalink-box|booklink-box|tomarebalink-box)".+?<div class="booklink-footer"}is';
if (preg_match_all($pattern, $the_content, $m)) {
if (isset($m[0])) {
foreach ($m[0] as $match) {
$kaereba_tag = $match;
$replaced_kaereba_tag = preg_replace('/ +?style=["][^"]*?["]/i', '', $kaereba_tag);
$the_content = str_replace($kaereba_tag, $replaced_kaereba_tag, $the_content);
}
}
}
//スクリプトを除去する
$pattern = '/<p><script.+?<\/script><\/p>/i';
$append = '';
$the_content = preg_replace($pattern, $append, $the_content);
$pattern = '/<script(?!.*type="application\/json").+?<\/script>/is';
$append = '';
$the_content = preg_replace($pattern, $append, $the_content);
//スタイルを除去する
$pattern = '{<style.+?</style>}is';
$append = '';
$the_content = preg_replace($pattern, $append, $the_content);
// $pattern = '/<script.+?<\/script>/is';
// $append = '';
// $the_content = preg_replace($pattern, $append, $the_content);
//空のamp-imgタグは削除
$pattern = '{<amp-img></amp-img>}i';
$append = '';
$the_content = preg_replace($pattern, $append, $the_content);
//空のpタグは削除
$pattern = '{<p></p>}i';
$append = '';
$the_content = preg_replace($pattern, $append, $the_content);
switch (get_amp_image_zoom_effect()) {
case 'amp-image-lightbox':
//amp-img を amp-image-lightbox 用に置換
$pattern = '{<p><a href="[^"]+?/wp-content/uploads.+?"><amp-img(.+?)></a></p>}i';
$append = '<p><amp-img class="amp-lightbox amp-image-lightbox" on="tap:amp-lightbox" role="button" tabindex="0"$1></p>';
// $the_content = preg_replace( $pattern, $append, $the_content );
if (preg_match_all($pattern, $the_content, $m)) {
$all_idx = 0;
$etc_idx = 1;
$i = 0;
foreach ($m[$all_idx] as $tag) {
$all_tag = $tag;
$etc_tag = $m[$etc_idx][$i];
if (preg_match('/class="(.+?)"/i', $etc_tag, $n)) {
$etc_tag = preg_replace('/class=".+?"/i', '', $etc_tag );
$the_content = str_replace($all_tag,
'<p><amp-img class="amp-lightbox amp-image-lightbox '.$n[1].'" on="tap:amp-lightbox" role="button" tabindex="0"'.$etc_tag.'></p>',
$the_content);
} else {
$the_content = str_replace($all_tag,
'<p><amp-img class="amp-lightbox amp-image-lightbox" on="tap:amp-lightbox" role="button" tabindex="0"'.$etc_tag.'></p>',
$the_content);
}
$i++;
}
}
break;
case 'amp-lightbox-gallery':
// amp-img を amp-lightbox-gallery 用に置換
$pattern = '{<p><a href="[^"]+?/wp-content/uploads.+?"><amp-img(.+?)></a></p>}i';
//$append = '<p><amp-img class="amp-lightbox amp-lightbox-gallery" lightbox$1></p>';
//$the_content = preg_replace( $pattern, $append, $the_content );
if (preg_match_all($pattern, $the_content, $m)) {
$all_idx = 0;
$etc_idx = 1;
$i = 0;
foreach ($m[$all_idx] as $tag) {
$all_tag = $tag;
$etc_tag = $m[$etc_idx][$i];
if (preg_match('/class="(.+?)"/i', $etc_tag, $n)) {
$etc_tag = preg_replace('/class=".+?"/i', '', $etc_tag );
$the_content = str_replace($all_tag,
'<p><amp-img class="amp-lightbox amp-lightbox-gallery '.$n[1].'" lightbox'.$etc_tag.'></p>',
$the_content);
} else {
$the_content = str_replace($all_tag,
'<p><amp-img class="amp-lightbox amp-lightbox-gallery" lightbox'.$etc_tag.'></p>',
$the_content);
}
$i++;
}
}
break;
}
//$the_content = str_replace('</body>', '<amp-image-lightbox id="amp-lightbox" layout="nodisplay"></amp-image-lightbox></body>', $the_content);
//_v($the_content);
// echo('<pre>');
// var_dump(htmlspecialchars($the_content));
// echo('</pre>');
return apply_filters('convert_content_for_amp', $the_content);
}//convert_content_for_amp
endif;
//テンプレートの中身をAMP化する
if ( !function_exists( 'get_template_part_amp' ) ):
function get_template_part_amp($template_name){
ob_start();//バッファリング
get_template_part($template_name);//テンプレートの呼び出し
$template = ob_get_clean();//テンプレート内容を変数に代入
$template = convert_content_for_amp($template);
echo $template;
}
endif;
//AMP用のAdSenseコードを取得する
if ( !function_exists( 'generate_amp_adsense_code' ) ):
function generate_amp_adsense_code(){
$adsense_code = null;
if ( get_amp_adsense_code() || is_active_sidebar( 'adsense-300' ) ) {
$ad300 = get_amp_adsense_code();
ob_start();
dynamic_sidebar('adsense-300');
$ad300 .= ob_get_clean();
//var_dump(htmlspecialchars($ad300));
preg_match('/data-ad-client="(ca-pub-[^"]+?)"/i', $ad300, $m);
if (empty($m[1])) return;
$data_ad_client = $m[1];
if (!$data_ad_client) return;
preg_match('/data-ad-slot="([^"]+?)"/i', $ad300, $m);
$data_ad_slot = $m[1];
if (!$data_ad_slot) return;
$adsense_code = '<amp-ad width="300" height="250" type="adsense" data-ad-client="'.$data_ad_client.'" data-ad-slot="'.$data_ad_slot.'"></amp-ad>';
//var_dump(htmlspecialchars($adsense_code));
}
return $adsense_code;
}
endif;
//最初のH2の手前に広告を挿入(最初のH2を置換)
if ( !function_exists( 'add_ads_before_1st_h2_in_amp' ) ):
function add_ads_before_1st_h2_in_amp($the_content) {
if ( is_amp() ) {//AMPの時のみ有効
//広告(AdSense)タグを記入
ob_start();//バッファリング
get_template_part('ad-amp');//広告貼り付け用に作成したテンプレート
$ad_template = ob_get_clean();
$h2result = get_h2_included_in_body( $the_content );//本文にH2タグが含まれていれば取得
if ( $h2result ) {//H2見出しが本文中にある場合のみ
//最初のH2の手前に広告を挿入(最初のH2を置換)
$count = 1;
$the_content = preg_replace(H2_REG, $ad_template.PHP_EOL.PHP_EOL.$h2result, $the_content, $count);
}
}
return $the_content;
}
endif;
add_filter('the_content','add_ads_before_1st_h2_in_amp');
//AMP用のURLを取得する
if ( !function_exists( 'get_amp_permalink' ) ):
function get_amp_permalink(){
$permalink = get_permalink();
//URLの中に?が存在しているか
if (strpos($permalink,'?') !== false) {
$amp_permalink = $permalink.'&amp;amp=1';
} else {
$amp_permalink = $permalink.'?amp=1';
}
return $amp_permalink;
}
endif;
// //画像URLから幅と高さを取得する(同サーバー内ファイルURLのみ)
// function get_image_width_and_height($image_url){
// //URLにサイトアドレスが含まれていない場合
// if (!includes_site_url($image_url)) {
// return false;
// }
// $wp_upload_dir = wp_upload_dir();
// $uploads_dir = $wp_upload_dir['basedir'];
// $uploads_url = $wp_upload_dir['baseurl'];
// $image_file = str_replace($uploads_url, $uploads_dir, $image_url);
// $imagesize = getimagesize($image_file);
// if ($imagesize) {
// $res = array();
// $res['width'] = $imagesize[0];
// $res['height'] = $imagesize[1];
// return $res;
// }
// }
//AMPページではCrayon Syntax Highlighterを表示しない
add_action( 'wp_loaded','remove_crayon_syntax_highlighter' );
if ( !function_exists( 'remove_crayon_syntax_highlighter' ) ):
function remove_crayon_syntax_highlighter() {
//is_ampではダメ
if (isset($_GET['amp']) && $_GET['amp'] === '1') {
//Crayon Syntax HighlighterはAMPページで適用しない
remove_filter('the_posts', 'CrayonWP::the_posts', 100);
}
}
endif;
if ( !function_exists( 'get_the_singular_content' ) ):
function get_the_singular_content(){
$all_content = null;
//while(have_posts()): the_post();
ob_start();//バッファリング
get_template_part('tmp/body-top');//bodyタグ直下から本文まで
$body_top_content = ob_get_clean();
ob_start();//バッファリング
if (is_single()) {
get_template_part('tmp/single-contents');
} else {
get_template_part('tmp/page-contents');
}
$body_content = ob_get_clean();
//_v($body_content);
ob_start();//バッファリング
dynamic_sidebar( 'sidebar' );
$sidebar_content = ob_get_clean();
//_v($sidebar_content);
ob_start();//バッファリング
dynamic_sidebar( 'sidebar-scroll' );
$sidebar_scroll_content = ob_get_clean();
// ob_start();//バッファリング
// get_template_part('tmp/mobile-menu-buttons');
// $mobile_menu_buttons = ob_get_clean();
ob_start();//バッファリング
dynamic_sidebar('footer-left');
dynamic_sidebar('footer-center');
dynamic_sidebar('footer-right');
$footer_content = ob_get_clean();
ob_start();//バッファリング
get_template_part('tmp/amp-footer-insert');
$footer_insert = ob_get_clean();
$all_content = $body_top_content.$body_content.$sidebar_content.$sidebar_scroll_content.$footer_content.$footer_insert;
//endwhile;
//$all_content = convert_content_for_amp($all_content);
return $all_content;
}
endif;
//<style amp-custom>タグの作成
if ( !function_exists( 'generate_style_amp_custom_tag' ) ):
function generate_style_amp_custom_tag(){?>
<style amp-custom><?php
$css_all = '';
//AMPスタイルの取得(SCSSで出力したAMP用のCSS)
$css_url = get_template_directory_uri().'/amp.css';
$css = css_url_to_css_minify_code($css_url);
if ($css !== false) {
$css_all .= apply_filters( 'amp_parent_css', $css );
}
///////////////////////////////////////////
//IcoMoonのスタイル
///////////////////////////////////////////
$css_icomoom = css_url_to_css_minify_code(get_template_directory_uri().'/webfonts/icomoon/style.css');
if ($css_icomoom !== false) {
$css_all .= apply_filters( 'amp_icomoon_css', $css_icomoom );
}
///////////////////////////////////////////
//スキンのスタイル
///////////////////////////////////////////
if ( ($skin_url = get_skin_url()) && is_amp_skin_style_enable() ) {//設定されたスキンがある場合
//通常のスキンスタイル
$skin_css = css_url_to_css_minify_code($skin_url);
if ($skin_css !== false) {
$css_all .= apply_filters( 'amp_skin_css', $skin_css );
}
//AMPのスキンスタイル
$amp_css_url = str_replace('style.css', 'amp.css', $skin_url);
$amp_css = css_url_to_css_minify_code($amp_css_url);
if ($amp_css !== false) {
$css_all .= apply_filters( 'amp_skin_amp_css', $amp_css );
}
}
/*
///////////////////////////////////////
// 本文中に挿入されたスタイル(ギャラリーなど)
///////////////////////////////////////
//$content = do_shortcode(get_the_content());
//_v($content);
$pattern = '{<style[^>]*?>(.+?)</style>}is';
if (preg_match_all($pattern, $content, $m)) {
$all_idx = 0;
$css_idx = 1;
//_v($m);
if ($m[$css_idx]) {
foreach ($m[$css_idx] as$key => $css) {
//do_shortcodeすると、おそらくIDが一つ進むと思われ
//それに対応するためID番号に+1している
if (preg_match('{#gallery-(\d+)}', $css, $n)) {
$css = str_replace($n[$all_idx], '#gallery-'.strval(intval($n[1])+1), $css);
}
$css_all .= minify_css($css);
}
}
}
*/
///////////////////////////////////////////
//カスタマイザーのスタイル
///////////////////////////////////////////
ob_start();//バッファリング
get_template_part('tmp/css-custom');//カスタムテンプレートの呼び出し
$css_custom = ob_get_clean();
$css_all .= apply_filters( 'amp_custum_css', minify_css($css_custom) );
///////////////////////////////////////////
//子テーマのスタイル
///////////////////////////////////////////
if ( is_child_theme() && is_amp_child_theme_style_enable() ) {
//通常のスキンスタイル
$css_child_url = get_stylesheet_directory_uri().'/style.css';
$child_css = css_url_to_css_minify_code($css_child_url);
if ($child_css !== false) {
$css_all .= apply_filters( 'amp_child_css', $child_css );
}
//AMPのスキンスタイル
$css_child_url = get_stylesheet_directory_uri().'/amp.css';
$child_amp_css = css_url_to_css_minify_code($css_child_url);
if ($child_amp_css !== false) {
$css_all .= apply_filters( 'amp_child_amp_css', $child_amp_css );
}
}
///////////////////////////////////////////
//投稿・固定ページに記入されているカスタムCSS
///////////////////////////////////////////
if ($custom_css = get_custom_css_code()) {
$css_all .= apply_filters( 'amp_singular_custom_css', $custom_css );
}
//!importantの除去
$css_all = preg_replace('/!important/i', '', $css_all);
//CSSの縮小化
$css_all = minify_css($css_all);
//全てのCSSの出力
echo apply_filters( 'amp_all_css', $css_all );
//}?></style>
<?php
}
endif;
if ( !function_exists( 'get_cleaned_css_selector' ) ):
function get_cleaned_css_selector($selector){
//class用のドットを取り除く
$selector = str_replace('.', ' ', $selector);
//ID用のシャープを取り除く
$selector = str_replace('#', ' ', $selector);
//>をスペースに変換
$selector = str_replace('>', ' ', $selector);
///////////////////////////////////////
// 擬似要素
///////////////////////////////////////
//:beforeを取り除く
$selector = str_replace(':before', '', $selector);
//:afterを取り除く
$selector = str_replace(':after', '', $selector);
///////////////////////////////////////
// 疑似クラス
///////////////////////////////////////
// //:hoverを取り除く
// $selector = str_replace(':hover', '', $selector);
// //:first-childを取り除く
// $selector = str_replace(':first-child', '', $selector);
// //:last-childを取り除く
// $selector = str_replace(':last-child', '', $selector);
// //:first-of-typeを取り除く
// $selector = str_replace(':first-of-type', '', $selector);
// //:last-of-typeを取り除く
// $selector = str_replace(':last-of-type', '', $selector);
$classes = array(':active',':any',':checked',':default',':disabled',':empty',':enabled',':first',':first-child',':first-of-type',':fullscreen',':focus',':hover',':indeterminate',':in-range',':invalid',':last-child',':last-of-type',':left',':link',':only-child',':only-of-type',':optional',':out-of-range',':read-only',':read-write',':required',':right',':root',':scope',':target',':valid',':visited');
foreach ($classes as $class) {
$selector = str_replace($class, '', $selector);
}
//:を取り除く
$selector = str_replace(':', '', $selector);
//連続した半角スペースを1つに置換
$selector = str_replace(' ', ' ', $selector);
return $selector;
}
endif;
//CSSセレクターセットが本文内に存在するか(厳密な判別ではない、結構大ざっぱ)
if ( !function_exists( 'is_comma_splited_selector_exists_in_body_tag' ) ):
function is_comma_splited_selector_exists_in_body_tag($comma_splited_selector, $body_tag){
//amp-imgが含まれるCSSセレクタは除外しない
if (strpos($comma_splited_selector, 'amp-img') !== false) {
return true;
}
$comma_splited_selector = get_cleaned_css_selector($comma_splited_selector);
$space_splited_selectors = explode(' ', $comma_splited_selector);
// if (count($space_splited_selectors) > 8) {
// _v($comma_splited_selector);
// }
foreach ($space_splited_selectors as $selector) {
// if (preg_match('/amp-img/', $selector)) {
// _v(strpos($body_tag, $selector) !== false);
// _v($body_tag);
// }
//$selector = get_cleaned_css_selector($selector);
//調べるまでもなく最初から存在するとわかっているセレクターは次に飛ばす(多少なりとも処理時間の短縮)
$elements = array('html', 'body', 'div', 'span', 'a', 'aside', 'section', 'figure', 'main', 'header', 'footer', 'sidebar', 'article', 'ul', 'ol', 'li', 'p', 'h1', 'h2', 'h3');
if (in_array($selector, $elements)) {
continue;
}
//本文内にセレクタータグが存在しない場合
if ($selector && strpos($body_tag, $selector) === false) {
return false;
}
}
return true;
}
endif;
//AMP用のCSSから不要なCSSコードを取り除く(なるべくAMPの50KB制限に引っかからないようにサイズ節約)
if ( !function_exists( 'get_dieted_amp_css_tag' ) ):
function get_dieted_amp_css_tag($style_amp_custom_tag, $body_tag){
$css = $style_amp_custom_tag;
if (preg_match_all('/\}([\.#\-a-zA-Z0-9\s>,:]+?)\{/i', $css, $m)
&& isset($m[1])) {
$selectors = $m[1];
//重複は統一
$selectors = array_unique($selectors);
//_v($selectors);
$delete_target_selectors = array();
//セレクター判別用の清掃
foreach ($selectors as $selector) {
//カンマで区切られたCSS配列を分割
$comma_splited_selectors = explode(',', $selector);
$comma_splited_selectors = array_unique($comma_splited_selectors);
foreach ($comma_splited_selectors as $comma_splited_selector) {
//置換用のターゲットCSSセレクタの保存
$delete_target_selector = $comma_splited_selector;
if (!is_comma_splited_selector_exists_in_body_tag($comma_splited_selector, $body_tag)) {
$delete_target_selectors[] = $delete_target_selector;
}
}
}
//_v($delete_target_selectors);
//削除候補のCSSセレクタを置換で削除
foreach ($delete_target_selectors as $delete_target_selector) {
$css = preg_replace('/\}'.preg_quote($delete_target_selector, '/').',/i', '}', $css);
$css = preg_replace('/\}'.preg_quote($delete_target_selector, '/').'{/i', '}{', $css);
}
//カッコ{css codf}のみになっているCSSを削除
$css = preg_replace('/(\{.+?\})(\{.+?\})+/i', '$1', $css);
//余計なメディアクエリを削除
//$css = preg_replace('/@media screen and \(max-width:\d+px\)\{\}/i', '', $css);
// $css = preg_replace('/\}\{.+?\}/i', '}', $css);
// $css = preg_replace('/\}\{.+?\}/i', '}', $css);
// $css = preg_replace('/\}\{.+?\}/i', '}', $css);
// $css = preg_replace('/\}\{.+?\}/i', '}', $css);
// if (preg_match_all('/\}(\{.+?\})/i', $css, $m) && $m[1]) {
// //_v($m[1]);
// $delete_css_codes = $m[1];
// foreach ($delete_css_codes as $delete_css_code) {
// $css = str_replace($delete_css_code, '', $css);
// }
// }
// if (preg_match_all('/[\.#\-a-zA-Z0-9\s>,:@]+?\{.+?\}/i', $css, $m)) {
// _v($m[0]);
// }
}
//_v($css);
return $css;
}
endif;
//AMP化コールバックの開始
add_action( 'wp_loaded','wp_loaded_ampfy_html', 1 );
if ( !function_exists( 'wp_loaded_ampfy_html' ) ):
function wp_loaded_ampfy_html() {
ob_start('html_ampfy_call_back');
}
endif;
//AMP化処理
if ( !function_exists( 'html_ampfy_call_back' ) ):
function html_ampfy_call_back( $html ) {
if (is_admin()) {
return $html;
}
//_v('$html');
if (!is_amp()) {
return $html;
}
global $post;
//キャッシュの存在
$transient_id = TRANSIENT_AMP_PREFIX.$post->ID;
$transient_file = get_theme_amp_cache_dir().$transient_id;
$file_path_cache = get_transient( $transient_id );
if ($file_path_cache && DEBUG_CACHE_ENABLE && !is_user_administrator()) {
if (file_exists($transient_file)) {
$html_cache = get_file_contents($transient_file);
if ($html_cache) {
return $html_cache;
}
}
}
$head_tag = null;
$body_tag = null;
$style_amp_custom_tag = null;
//ヘッダータグの取得
if (preg_match('{<!doctype html>.+</head>}is', $html, $m)) {
if (isset($m[0])) {
$head_tag = $m[0];
}
}
//ボディータグの取得
if (preg_match('{<body .+</html>}is', $html, $m)) {
if (isset($m[0])) {
$body_tag = $m[0];
}
}
//AMP用CSSスタイルの取得
if (preg_match('{<style amp-custom>.+</style>}is', $head_tag, $m)) {
if (isset($m[0])) {
$default_style_amp_custom_tag = $m[0];
//_v($default_style_amp_custom_tag);
//不要なCSSを削除してサイズ削減
$dieted_style_amp_custom_tag = get_dieted_amp_css_tag($default_style_amp_custom_tag, $body_tag);
//_v($dieted_style_amp_custom_tag);
//ヘッダーの<style amp-custom>をサイズ削減したものに入れ替える
$head_tag = str_replace($default_style_amp_custom_tag, $dieted_style_amp_custom_tag, $head_tag);
}
}
if ($head_tag && $body_tag) {
//bodyタグ内をAMP化
$body_tag = convert_content_for_amp($body_tag);
//AMP用headタグ編集用のフック
$head_tag = apply_filters('amp_html_head_tag', $head_tag);
//AMP用bodyタグ編集用のフック
$body_tag = apply_filters('amp_html_body_tag', $body_tag);
$all_tag = $head_tag . $body_tag;
//AMPキャッシュの保存
$is_include_body = includes_string($all_tag, '</body>');
if ($is_include_body && DEBUG_CACHE_ENABLE && !is_user_administrator()) {
set_transient($transient_id, $transient_file, DAY_IN_SECONDS * 1);
put_file_contents($transient_file, $all_tag);
}
//AMP用全てのHTMLタグ編集用のフック
return $body_tag = apply_filters('amp_html_all_tag', $all_tag);
}
//_v($body);
//_v('$html');
return $html;
}
endif;
//AMPのデフォルト画像幅
if ( !function_exists( 'get_amp_default_image_width' ) ):
function get_amp_default_image_width(){
return 300;
}
endif;
//AMPのデフォルト画像高さ
if ( !function_exists( 'get_amp_default_image_height' ) ):
function get_amp_default_image_height(){
return 300;
}
endif;
//AMPのデフォルト商品画像幅
if ( !function_exists( 'get_amp_product_image_width' ) ):
function get_amp_product_image_width(){
return 75;
}
endif;
//AMPのデフォルト商品画像高さ
if ( !function_exists( 'get_amp_product_image_height' ) ):
function get_amp_product_image_height(){
return 75;
}
endif;