Pz-LinkCard - Version 2.4.6

Version Description

= * WordPress 6.0 Compatible with WordPress 6.0. * CDNThanks @in_seki on Twitter Modified: Support for image URL redirects in CDNs, etc. * AMPThanks @360bpk on Twitter Fixed: Fixed a bug that caused misidentification as AMP when combined with certain themes.

Download this release

Release Info

Developer poporon
Plugin Icon 128x128 Pz-LinkCard
Version 2.4.6
Comparing to
See all releases

Code changes from version 2.4.5.4 to 2.4.6

Files changed (3) hide show
  1. js/mce-button.js +18 -1
  2. pz-linkcard.php +68 -57
  3. readme.txt +8 -2
js/mce-button.js CHANGED
@@ -22,6 +22,23 @@
22
  $("#pz-lkc-url").val("");
23
  var st = tinymce.activeEditor.selection.getContent();
24
  var ur = cut_url(st);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  if (ur != null) {
26
  ur = ur[1];
27
  } else {
@@ -101,7 +118,7 @@
101
  var mh = $("#pz-lkc-modal").outerHeight();
102
  $("#pz-lkc-modal").css( {"left": ((w - mw)/2) + "px","top": ((h - mh)/2) + "px"} );
103
  }
104
-
105
  // 文字列からURLを切り出す
106
  function cut_url(s) {
107
  var reg = '((https?|file|ftp|data|ogg):\/\/[^ \'"<]+)';
22
  $("#pz-lkc-url").val("");
23
  var st = tinymce.activeEditor.selection.getContent();
24
  var ur = cut_url(st);
25
+
26
+
27
+ // alert( 'data=' + window.clipboardData );
28
+ // alert( 'get=' + window.clipboardData.getData );
29
+
30
+ //alert(
31
+ //navigator.clipboard.readText().then(t=>{
32
+ // alert( t ) ;
33
+ //}) );
34
+
35
+ // navigator.clipboard.readText().then(text=>{
36
+ // document.getElementById("displayText").innerHTML = text;
37
+ // });
38
+
39
+ // alert( window.clipboardData.getData('Text'); );
40
+
41
+
42
  if (ur != null) {
43
  ur = ur[1];
44
  } else {
118
  var mh = $("#pz-lkc-modal").outerHeight();
119
  $("#pz-lkc-modal").css( {"left": ((w - mw)/2) + "px","top": ((h - mh)/2) + "px"} );
120
  }
121
+
122
  // 文字列からURLを切り出す
123
  function cut_url(s) {
124
  var reg = '((https?|file|ftp|data|ogg):\/\/[^ \'"<]+)';
pz-linkcard.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Pz-LinkCard
4
  Plugin URI: http://poporon.poponet.jp/pz-linkcard
5
  Description: リンクをカード形式で表示します。
6
- Version: 2.4.5.4
7
  Author: Poporon
8
  Author URI: http://poporon.poponet.jp
9
  Text Domain: pz-linkcard
@@ -16,7 +16,7 @@ class class_pz_linkcard {
16
  // 設定値
17
  protected $defaults =
18
  array(
19
- 'plugin-version' => '2.4.5.4',
20
  'plugin-name' => 'Pz-LinkCard',
21
  'plugin-abbreviation' => 'Pz-LkC',
22
  'plugin-path' => '/pz-linkcard',
@@ -198,7 +198,7 @@ class class_pz_linkcard {
198
  private $slug; // スラッグ
199
  private $text_domain; // テキスト ドメイン(スラッグと同じ内容)
200
  private $charset; // 文字セット
201
- private $amp; // Google AMP
202
  private $datetime_format; // 日時の書式
203
  private $now; // 現在日時(ローカル時間)
204
  private $home_url; // 自サイトのURL
@@ -222,7 +222,7 @@ class class_pz_linkcard {
222
  $this->slug = basename(dirname(__FILE__ ) ); // スラッグ
223
  $this->text_domain = $this->slug; // テキストドメイン(スラッグと同じ)
224
  $this->charset = get_bloginfo('charset' ); // 文字セット
225
- $this->amp = true; // 今がAMP表示かどうか判定
226
  $this->datetime_format = get_option('date_format' ).' '.get_option('time_format' ); // 日時の書式
227
  $this->now = current_time('timestamp', false ); // 現在日時(ローカル時間)
228
  $this->db_name = $wpdb->prefix.'pz_linkcard'; // DBのテーブル名
@@ -923,44 +923,40 @@ class class_pz_linkcard {
923
  }
924
  $domain_info = '<div class="lkc-info">'.$html_a_op.$html_favicon.'<div class="lkc-domain"'.$site_title.'>'.$site_name.'</div>'.$added_info.$html_a_cl.$html_sns_info.$html_url2.$info_date.'</div>';
925
 
926
- // Google AMPに対応
927
- if
928
- (
929
- ($this->amp )
930
- ||
931
- (function_exists('ampforwp_is_amp_endpoint' ) && ampforwp_is_amp_endpoint() )
932
- ||
933
- (function_exists('is_amp_endpoint' ) && is_amp_endpoint() )
934
- ||
935
- (function_exists('is_amp' ) && is_amp() )
936
- ||
937
- (
938
- $this->options['flg-amp-url']
939
- &&
940
- (
941
- preg_match('/\/amp\/?$/i', $_SERVER["REQUEST_URI"] )
942
- ||
943
- preg_match('/\?amp=1$/i', $_SERVER["REQUEST_URI"] )
944
- )
945
- )
946
- ) {
947
- // 簡易タグ作成
948
- $tag = '<table border="1" cellspacing="0" cellpadding="4"><tbody></tr><tr><td>'.$excerpt.'<br>'.$html_a_op_all.$html_a_op.$title.$html_a_cl.$html_a_cl_all.' - '.$site_name.'</td></tr></tbody></table>';
949
- } else {
950
- // HTMLタグ作成
951
- switch ($this->options['info-position'] ) {
952
- case 1:
953
- $tag = $html_wrap_op.$html_a_op_all.'<div class="lkc-card">'.$domain_info.'<div class="lkc-content">'.$html_a_op.$html_thumbnail.'<div class="lkc-title"><div class="lkc-title-text">'.$title.'</div>'.$html_a_cl.$html_sns_title.'</div>'.$html_url1.'<div class="lkc-excerpt">'.$excerpt.'</div>'.$html_moretag.'</div><div class="clear"></div></div>'.$html_a_cl_all.$html_wrap_cl;
954
- break;
955
- case 2:
956
- $tag = $html_wrap_op.$html_a_op_all.'<div class="lkc-card"><div class="lkc-content">'.$html_a_op.$html_thumbnail.'<div class="lkc-title"><div class="lkc-title-text">'.$title.'</div>'.$html_a_cl.$html_sns_title.'</div>'.$html_url1.'<div class="lkc-excerpt">'.$excerpt.'</div>'.$html_moretag.'</div>'.$domain_info.'<div class="clear"></div></div>'.$html_a_cl_all.$html_wrap_cl;
957
- break;
958
- case 3:
959
- $tag = $html_wrap_op.$html_a_op_all.'<div class="lkc-card"><div class="lkc-content">'.$html_a_op.$html_thumbnail.$domain_info.'<div class="lkc-title"><div class="lkc-title-text">'.$title.'</div>'.$html_a_cl.$html_sns_title.$html_url1.'</div><div class="lkc-excerpt">'.$excerpt.'</div>'.$html_moretag.'</div><div class="clear"></div></div>'.$html_a_cl_all.$html_wrap_cl;
960
- break;
961
- default:
962
- $tag = $html_wrap_op.$html_a_op_all.'<div class="lkc-card"><div class="lkc-content">'.$html_a_op.$html_thumbnail.'<div class="lkc-title"><div class="lkc-title-text">'.$title.'</div>'.$html_a_cl.$html_sns_title.'</div>'.$html_url1.'<div class="lkc-excerpt">'.$excerpt.'</div>'.$html_moretag.'</div><div class="clear"></div></div>'.$html_a_cl_all.$html_wrap_cl;
963
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
964
  }
965
 
966
  // 引用文扱い
@@ -2038,8 +2034,8 @@ class class_pz_linkcard {
2038
  }
2039
 
2040
  // サムネイル取得(外部リンクOGP画像取得)
2041
- private function pz_GetThumbnail($url, $force = false ) {
2042
- if (!isset($url ) || !$url || $url == 'https://s0.wp.com/i/blank.jpg' ) {
2043
  return null;
2044
  }
2045
 
@@ -2051,40 +2047,50 @@ class class_pz_linkcard {
2051
  }
2052
 
2053
  // 画像URLを元にしてファイル名を生成
2054
- $file_name = bin2hex(hash('sha256', esc_url($url ), true ) ); // ファイル名(URLをハッシュしてファイル名にする)
2055
  $file_ext = '.jpeg'; // 拡張子
2056
- $file_path_old = $file_dir.$file_name; // ファイルのフルパス
2057
  $file_path_jpeg = $file_dir.$file_name.$file_ext; // ファイルのフルパス
2058
  $file_url = $file_dir_url.$file_name.$file_ext; // 画像URL
2059
 
2060
  // ファイル名が見つかったときの処理
2061
  if (!$force ) { // 強制取得の指定なし
2062
- if (file_exists ($file_path_jpeg ) ) { // ファイルが見つかった(拡張子あり)
2063
- if (filesize($file_path_jpeg ) < 34 ) { // JPEGのヘッダが34バイトなので、それ未満は取得できていないファイル
2064
  return null;
2065
  }
 
 
 
2066
  return $file_url;
2067
  }
2068
- if (file_exists ($file_path_old ) ) { // ファイルが見つかった(拡張子なし)
2069
- rename ($file_path_old, $file_path_jpeg ); // 拡張子ありにリネーム
2070
- if (filesize($file_path_jpeg ) < 34 ) { // JPEGのヘッダが34バイトなので、それ未満は取得できていないファイル
 
2071
  return null;
2072
  }
 
 
 
2073
  return $file_url;
2074
  }
2075
  }
2076
 
2077
  // cURLで画像取得
2078
  $ch = curl_init();
2079
- curl_setopt($ch, CURLOPT_URL, $url );
2080
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
2081
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false );
 
 
 
 
2082
  curl_setopt($ch, CURLOPT_TIMEOUT, 10 );
2083
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3 );
2084
  $body = curl_exec($ch );
2085
  $header = curl_getinfo($ch );
2086
  curl_close($ch );
2087
- if ($header['http_code'] <> 200 ) { // 指定されたURLの画像が存在しない
2088
  touch($file_path_jpeg ); // 空ファイル作成
2089
  return null;
2090
  }
@@ -2129,21 +2135,26 @@ class class_pz_linkcard {
2129
  $new_width = intval($image_width * ($new_height / $image_height ) ); // 高さに合わせる
2130
  }
2131
  if ($new_width <= 1 || $new_height <= 1 ) {
2132
- touch($file_path_jpeg ); // 空ファイル作成
2133
  return null;
2134
  }
2135
 
2136
  // パレットを用意
2137
  $image_pallet = imagecreatetruecolor($new_width, $new_height );
2138
  if (!$image_pallet ) {
2139
- touch($file_path_jpeg ); // 空ファイル作成
2140
  return null;
2141
  }
2142
 
2143
  // 画像ファイルを保存
2144
  imagecopyresampled($image_pallet, $image, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height ); // サイズ変更してコピー
2145
- imagejpeg($image_pallet, $file_path_jpeg ); // JPEGで保存
2146
- return $file_url; // 画像URLを返す
 
 
 
 
 
2147
  }
2148
 
2149
  // 設定を取得する
3
  Plugin Name: Pz-LinkCard
4
  Plugin URI: http://poporon.poponet.jp/pz-linkcard
5
  Description: リンクをカード形式で表示します。
6
+ Version: 2.4.6
7
  Author: Poporon
8
  Author URI: http://poporon.poponet.jp
9
  Text Domain: pz-linkcard
16
  // 設定値
17
  protected $defaults =
18
  array(
19
+ 'plugin-version' => '2.4.6',
20
  'plugin-name' => 'Pz-LinkCard',
21
  'plugin-abbreviation' => 'Pz-LkC',
22
  'plugin-path' => '/pz-linkcard',
198
  private $slug; // スラッグ
199
  private $text_domain; // テキスト ドメイン(スラッグと同じ内容)
200
  private $charset; // 文字セット
201
+ private $amp; // Google AMP 0:不明 1:AMP 2:通常
202
  private $datetime_format; // 日時の書式
203
  private $now; // 現在日時(ローカル時間)
204
  private $home_url; // 自サイトのURL
222
  $this->slug = basename(dirname(__FILE__ ) ); // スラッグ
223
  $this->text_domain = $this->slug; // テキストドメイン(スラッグと同じ)
224
  $this->charset = get_bloginfo('charset' ); // 文字セット
225
+ $this->amp = 0; // 今がAMP表示かどうか判定
226
  $this->datetime_format = get_option('date_format' ).' '.get_option('time_format' ); // 日時の書式
227
  $this->now = current_time('timestamp', false ); // 現在日時(ローカル時間)
228
  $this->db_name = $wpdb->prefix.'pz_linkcard'; // DBのテーブル名
923
  }
924
  $domain_info = '<div class="lkc-info">'.$html_a_op.$html_favicon.'<div class="lkc-domain"'.$site_title.'>'.$site_name.'</div>'.$added_info.$html_a_cl.$html_sns_info.$html_url2.$info_date.'</div>';
925
 
926
+ // Google AMP用 簡易タグ作成
927
+ if ($this->amp <> 2 ) {
928
+ if ($this->amp === 0 ) {
929
+ $this->amp = 2; // 仮に 2:通常(非AMP)とする
930
+ if ((function_exists('ampforwp_is_amp_endpoint' ) && ampforwp_is_amp_endpoint() ) || (function_exists('is_amp_endpoint' ) && is_amp_endpoint() ) || (function_exists('is_amp' ) && is_amp() ) ) {
931
+ $this->amp = 1; // 1:AMP
932
+ } else {
933
+ if ($this->options['flg-amp-url'] ) {
934
+ $url_now = $_SERVER["REQUEST_URI"];
935
+ if ((substr($url_now, 4 ) === '/amp' ) || (substr($url_now, 5 ) === '/amp/' ) || (substr($url_now, 6 ) === '?amp=1' ) || (substr($url_now, 8 ) === 'type=AMP' ) ) {
936
+ $this->amp = 1; // 1:AMP
937
+ }
938
+ }
939
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
940
  }
941
+ if ($this->amp === 1 ) {
942
+ $html_tag = '<div class="lkc-external amp"><table border="1" cellspacing="0" cellpadding="4"><tr><td>'.$excerpt.'<br/><a href="'.esc_url($url ).'"'.$target.$rel.'>'.$title.'</a>&nbsp;-&nbsp;'.$site_name.'</td></tr></table></div>';
943
+ return $html_tag; // タグを出力して終了
944
+ }
945
+ }
946
+
947
+ // HTMLタグ作成
948
+ switch ($this->options['info-position'] ) {
949
+ case 1:
950
+ $tag = $html_wrap_op.$html_a_op_all.'<div class="lkc-card">'.$domain_info.'<div class="lkc-content">'.$html_a_op.$html_thumbnail.'<div class="lkc-title"><div class="lkc-title-text">'.$title.'</div>'.$html_a_cl.$html_sns_title.'</div>'.$html_url1.'<div class="lkc-excerpt">'.$excerpt.'</div>'.$html_moretag.'</div><div class="clear"></div></div>'.$html_a_cl_all.$html_wrap_cl;
951
+ break;
952
+ case 2:
953
+ $tag = $html_wrap_op.$html_a_op_all.'<div class="lkc-card"><div class="lkc-content">'.$html_a_op.$html_thumbnail.'<div class="lkc-title"><div class="lkc-title-text">'.$title.'</div>'.$html_a_cl.$html_sns_title.'</div>'.$html_url1.'<div class="lkc-excerpt">'.$excerpt.'</div>'.$html_moretag.'</div>'.$domain_info.'<div class="clear"></div></div>'.$html_a_cl_all.$html_wrap_cl;
954
+ break;
955
+ case 3:
956
+ $tag = $html_wrap_op.$html_a_op_all.'<div class="lkc-card"><div class="lkc-content">'.$html_a_op.$html_thumbnail.$domain_info.'<div class="lkc-title"><div class="lkc-title-text">'.$title.'</div>'.$html_a_cl.$html_sns_title.$html_url1.'</div><div class="lkc-excerpt">'.$excerpt.'</div>'.$html_moretag.'</div><div class="clear"></div></div>'.$html_a_cl_all.$html_wrap_cl;
957
+ break;
958
+ default:
959
+ $tag = $html_wrap_op.$html_a_op_all.'<div class="lkc-card"><div class="lkc-content">'.$html_a_op.$html_thumbnail.'<div class="lkc-title"><div class="lkc-title-text">'.$title.'</div>'.$html_a_cl.$html_sns_title.'</div>'.$html_url1.'<div class="lkc-excerpt">'.$excerpt.'</div>'.$html_moretag.'</div><div class="clear"></div></div>'.$html_a_cl_all.$html_wrap_cl;
960
  }
961
 
962
  // 引用文扱い
2034
  }
2035
 
2036
  // サムネイル取得(外部リンクOGP画像取得)
2037
+ private function pz_GetThumbnail($thumbnail_url, $force = false, $stamp = false ) {
2038
+ if (!isset($thumbnail_url ) || !$thumbnail_url || $thumbnail_url == 'https://s0.wp.com/i/blank.jpg' ) {
2039
  return null;
2040
  }
2041
 
2047
  }
2048
 
2049
  // 画像URLを元にしてファイル名を生成
2050
+ $file_name = bin2hex(hash('sha256', esc_url($thumbnail_url ), true ) ); // ファイル名(URLをハッシュしてファイル名にする)
2051
  $file_ext = '.jpeg'; // 拡張子
 
2052
  $file_path_jpeg = $file_dir.$file_name.$file_ext; // ファイルのフルパス
2053
  $file_url = $file_dir_url.$file_name.$file_ext; // 画像URL
2054
 
2055
  // ファイル名が見つかったときの処理
2056
  if (!$force ) { // 強制取得の指定なし
2057
+ if (file_exists ($file_path_jpeg ) ) { // ファイルが見つかった(拡張子あり)
2058
+ if (filesize($file_path_jpeg ) < 34 ) { // JPEGのヘッダが34バイトなので、それ未満は取得できていないファイル
2059
  return null;
2060
  }
2061
+ if ($stamp === true ) {
2062
+ $file_url .= '?'.date('yyyymmdd-his', filemtime($file_path_jpeg ) ); // ファイルスタンプ
2063
+ }
2064
  return $file_url;
2065
  }
2066
+ $file_path_old = $file_dir.$file_name; // ファイルのフルパス(旧バージョン)
2067
+ if (file_exists ($file_path_old ) ) { // ファイルが見つかった(拡張子なし)
2068
+ rename ($file_path_old, $file_path_jpeg ); // 拡張子ありにリネーム
2069
+ if (filesize($file_path_jpeg ) < 34 ) { // JPEGのヘッダが34バイトなので、それ未満は取得できていないファイル
2070
  return null;
2071
  }
2072
+ if ($stamp === true ) {
2073
+ $file_url .= '?'.date('yyyymmdd-his', filemtime($file_path_jpeg ) ); // ファイルスタンプ
2074
+ }
2075
  return $file_url;
2076
  }
2077
  }
2078
 
2079
  // cURLで画像取得
2080
  $ch = curl_init();
2081
+ curl_setopt($ch, CURLOPT_URL, $thumbnail_url );
2082
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
2083
+
2084
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true ); // リダイレクトを処理する
2085
+ curl_setopt($ch, CURLOPT_MAXREDIRS, 8 ); // リダイレクトを処理する階層
2086
+ curl_setopt($ch, CURLOPT_AUTOREFERER, true ); // リダイレクト用リファラを自動セット
2087
+
2088
  curl_setopt($ch, CURLOPT_TIMEOUT, 10 );
2089
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3 );
2090
  $body = curl_exec($ch );
2091
  $header = curl_getinfo($ch );
2092
  curl_close($ch );
2093
+ if ($header['http_code'] >= 400 ) { // 指定されたURLの画像が存在しない
2094
  touch($file_path_jpeg ); // 空ファイル作成
2095
  return null;
2096
  }
2135
  $new_width = intval($image_width * ($new_height / $image_height ) ); // 高さに合わせる
2136
  }
2137
  if ($new_width <= 1 || $new_height <= 1 ) {
2138
+ touch($file_path_jpeg ); // 空ファイル作成
2139
  return null;
2140
  }
2141
 
2142
  // パレットを用意
2143
  $image_pallet = imagecreatetruecolor($new_width, $new_height );
2144
  if (!$image_pallet ) {
2145
+ touch($file_path_jpeg ); // 空ファイル作成
2146
  return null;
2147
  }
2148
 
2149
  // 画像ファイルを保存
2150
  imagecopyresampled($image_pallet, $image, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height ); // サイズ変更してコピー
2151
+ imagejpeg($image_pallet, $file_path_jpeg ); // JPEGで保存
2152
+
2153
+ if ($stamp === true ) {
2154
+ $file_url .= '?'.date('yyyymmdd-his', filemtime($file_path_jpeg ) ); // ファイルスタンプ
2155
+ }
2156
+
2157
+ return $file_url; // 画像URLを返す
2158
  }
2159
 
2160
  // 設定を取得する
readme.txt CHANGED
@@ -151,6 +151,14 @@ Ver.2.1.2から200px四方に変更、Ver.2.4.1から自由に指定できるよ
151
 
152
  == Changelog ==
153
 
 
 
 
 
 
 
 
 
154
  = 2.4.5.4 =
155
  * プラグインのアンインストールが失敗する不具合を修正。
156
  Fixed: Fixed a bug that caused uninstallation to fail.
@@ -182,8 +190,6 @@ Ver.2.1.2から200px四方に変更、Ver.2.4.1から自由に指定できるよ
182
  Compatible with WordPress 5.9.2.
183
  * WordPress 5.9.3 での動作確認。
184
  Compatible with WordPress 5.9.3.
185
- * WordPress 6.0 での動作確認。
186
- Compatible with WordPress 6.0.
187
  * PHP 7.3 での動作確認。
188
  Compatible with PHP 7.3.
189
  * PHP 7.4 での動作確認。
151
 
152
  == Changelog ==
153
 
154
+ = 2.4.6 ==
155
+ * WordPress 6.0 での動作確認。
156
+ Compatible with WordPress 6.0.
157
+ * 画像のリダイレクトに対応。(CDN対応)(Thanks @in_seki on Twitter)
158
+ Modified: Support for image URL redirects in CDNs, etc.
159
+ * 特定のテーマでAMPと誤判定してしまう不具合を修正。(Thanks @360bpk on Twitter)
160
+ Fixed: Fixed a bug that caused misidentification as AMP when combined with certain themes.
161
+
162
  = 2.4.5.4 =
163
  * プラグインのアンインストールが失敗する不具合を修正。
164
  Fixed: Fixed a bug that caused uninstallation to fail.
190
  Compatible with WordPress 5.9.2.
191
  * WordPress 5.9.3 での動作確認。
192
  Compatible with WordPress 5.9.3.
 
 
193
  * PHP 7.3 での動作確認。
194
  Compatible with PHP 7.3.
195
  * PHP 7.4 での動作確認。