PluginProbe
codoc / 0.9.12
codoc v0.9.12
0.9.8.8 0.9.8.9 0.9.9 0.9.9.1 trunk 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.8.1 0.8.2 0.8.3 0.8.4 0.8.6 0.8.7 0.8.8 0.8.9 0.9 0.9.1 0.9.10 0.9.11 All 114 releases
codoc / class-codoc.php

class-codoc.php in codoc 0.9.12, at class-codoc.php

883 lines 49.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 require_once(plugin_dir_path( __FILE__ ) .'class-codoc-util.php');
3 final class Codoc {
4
5 public function __construct() {
6 if (is_admin()) {
7 // setting
8 $this->add_settings();
9 }
10
11 // usercode, token はadminページのみDBから取得する
12 $this->util = new CodocUtil([ 'usercode' => null, 'token' => null, 'codoc_url' => $this->get_codoc_url() ]);
13
14 # the_content フィルタを実行しない状�
15
16 $this->do_not_filter_the_content = false;
17
18 // paywall用の本文非表示化とcodocタグへの属性追加
19 #$priority = 999999999;
20 $priority = 100000; # フィルターは最後に実施する default 10
21 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
22 if (isset($CODOC_SETTINGS["debug_params"])) {
23 $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
24 if (isset($params_decoded["the_content_filter_priority"])) {
25 $priority = $params_decoded["the_content_filter_priority"];
26 }
27 }
28 add_filter('the_content',[$this,'the_content'],$priority);
29
30 // 2020-07-25 excerpt対応
31 add_filter('excerpt_allowed_blocks',[$this,'excerpt_allowed_blocks']);
32
33 $auth_info = get_option(CODOC_AUTHINFO_OPTION_NAME);
34
35 if ($auth_info) {
36 // データ同期 (save_postはis_adminで実行されないケースがある)
37 add_action( 'save_post', [$this,'save_post'], 20, 3 );
38 add_action( 'added_post_meta', [$this,'updated_post_meta'], 10, 3 );
39 add_action( 'updated_post_meta',[$this,'updated_post_meta'], 10, 3 );
40 add_action( 'deleted_post_meta',[$this,'deleted_post_meta'], 10, 4 );
41 }
42 if (is_admin() and $auth_info) { //管理画面
43 // Gutenberg のサポートがない場合は何もしない
44 if ( function_exists( 'register_block_type' ) ) {
45 // gutenberg
46 require_once 'src/init.php';
47 add_action('wp_loaded', function() {
48 wp_localize_script('wordpress-cgb-block-js', 'OPTIONS', array(
49 'codoc_url' => $this->get_codoc_url(),
50 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
51 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
52 'codoc_sdk_path' => CODOC_SDK_PATH,
53 ));
54 });
55 }
56 // tinymce
57 $this->add_mce();
58 } else { // ブログ画面
59 // codocのJS登録
60 add_action( 'wp_enqueue_scripts', function() {
61 wp_enqueue_script( 'codoc-injector-js', $this->get_codoc_url() . '/js/cms.js' );
62 });
63 // 登録したscriptタグに属性をつける
64 add_filter('script_loader_tag', [$this,'modifier_script_tag'],10,2);
65 // tinymce用のショートコード
66 add_shortcode('codoc', [$this, 'injector_shortcode']);
67 }
68 return $this;
69 }
70 public function get_codoc_url() {
71 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
72 if (isset($CODOC_SETTINGS["debug_params"])) {
73 $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
74 if (isset($params_decoded["codoc_url"])) {
75 return $params_decoded["codoc_url"];
76 }
77 }
78 return CODOC_URL;
79 }
80 public function modifier_script_tag($tag,$handle) {
81 if($handle !== 'codoc-injector-js') {
82 return $tag;
83 }
84 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
85 $data_css = '';
86 if ($css_path = $CODOC_SETTINGS['css_path']) {
87 $data_css = sprintf(' data-css="%s" ',$css_path);
88 }
89 // connect用パラメータ
90 $connect_attributes = '';
91 if (isset($CODOC_SETTINGS["codoc_connect_code"])) {
92 $connect_code = $CODOC_SETTINGS["codoc_connect_code"];
93 $connect_attributes = sprintf(' data-connect-code="%s"',$connect_code);
94 $tag = preg_replace('/cms\.js/','cms-connect.js',$tag);
95 }
96 if (isset($CODOC_SETTINGS["debug_params"])) {
97 $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
98 if (isset($params_decoded["connect_registration_mode"])) {
99 $connect_attributes = $connect_attributes . sprintf(' data-connect-registration-mode="%s"',$params_decoded["connect_registration_mode"]);
100 }
101 }
102
103 //return str_replace(' src=', $data_css . ' defer src=', $tag);
104 return preg_replace('/(src=[^>]+)/',' ${1} ' . $data_css . $connect_attributes . ' defer',$tag);
105 }
106 public function injector_shortcode($atts) {
107 global $post;
108 ob_start();
109 require 'views/codoc-injector.php';
110 return ob_get_clean();
111 }
112 # settings / 設定関連
113 public function add_settings() {
114 global $CODOC_SETTINGS;
115 add_action( 'admin_menu' ,function(){
116 add_options_page(
117 'codoc の設定', //ページタイトル
118 'codoc', //設定メニューに表示されるメニュータイトル
119 'edit_users', //権限
120 'codoc', //設定ページのURL。options-general.php?page=codoc
121 function() {
122 echo '<div class="codoc-settings">';
123 echo '<form method="post" action="options.php">';
124 settings_fields( 'codoc_option_group' );
125 do_settings_sections( 'codoc' );
126 submit_button(); // 送信ボタン
127 echo '</form></div>';
128 }
129 );
130 });
131
132 add_action('admin_print_styles', 'codoc_admin_styles');
133 function codoc_admin_styles($hook) {
134 wp_enqueue_style('codoc-options-style', plugins_url( 'codoc/css/codoc-options.css', __DIR__ ));
135 }
136
137 add_action( "admin_init", function() {
138 // codocからの認証データ処理
139 if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['fetch_token_key'])) {
140 $key = sanitize_text_field($_GET['fetch_token_key']);
141 $usercode = sanitize_text_field($_GET['usercode']);
142 update_option(CODOC_USERCODE_OPTION_NAME,$usercode);
143 //$data = $this->callAPI('GET','/token',[ "fetch_token_key" => $key ]);
144 $data = $this->util->get_token([ "fetch_token_key" => $key ],["usercode" => $usercode, "token" => "1"]);
145 if ($data->status and $token = $data->token) {
146 update_option(CODOC_TOKEN_OPTION_NAME,$token);
147 //$data = $this->callAPI('GET','');
148 $data = $this->util->get_user_info([],["usercode" => $usercode, "token" => $token]);
149 if ($data->status and $user = $data->user) {
150 update_option(CODOC_AUTHINFO_OPTION_NAME,[
151 'email' => $user->email,
152 'name' => $user->name,
153 'profile_image_url' => $user->profile_image_url,
154 'cover_image_url' => $user->cover_image_url,
155 ]);
156 }
157 #$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
158 #$current_url = preg_replace('/(.*)fetch_token_key.*/','${1}&codoc_auth_finished=1',$current_url);
159 //add_settings_error( 'general', 'settings_updated', __( 'OK' ), 'success' );
160 $current_url = admin_url('options-general.php') . '?page=codoc&codoc_auth_finished=1';
161
162 wp_redirect( $current_url);
163 exit;
164 }
165 }
166 global $CODOC_USERCODE;
167 global $CODOC_SETTINGS;
168 global $CODOC_TOKEN;
169 global $CODOC_AUTHINFO;
170 $CODOC_USERCODE = get_option(CODOC_USERCODE_OPTION_NAME);
171 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
172 $CODOC_TOKEN = get_option(CODOC_TOKEN_OPTION_NAME);
173 $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
174 if( !$CODOC_SETTINGS ) {
175 //デフォルト値
176 $CODOC_SETTINGS = array(
177 'css_path' => '',
178 );
179 update_option( CODOC_SETTINGS_OPTION_NAME, $CODOC_SETTINGS );
180 }
181 if (!isset($CODOC_SETTINGS['str_replace_binded_url_from'])) {
182 $CODOC_SETTINGS['str_replace_binded_url_from'] = '';
183 }
184 if (!isset($CODOC_SETTINGS['str_replace_binded_url_to'])) {
185 $CODOC_SETTINGS['str_replace_binded_url_to'] = '';
186 }
187 if (!isset($CODOC_SETTINGS['str_before_codoc_tag'])) {
188 $CODOC_SETTINGS['str_before_codoc_tag'] = '';
189 }
190 if (!isset($CODOC_SETTINGS['str_after_codoc_tag'])) {
191 $CODOC_SETTINGS['str_after_codoc_tag'] = '';
192 }
193
194 if (!isset($CODOC_SETTINGS['always_show_support'])) {
195 $CODOC_SETTINGS['always_show_support'] = '0';
196 }
197 if (!isset($CODOC_SETTINGS['show_support_message'])) {
198 $CODOC_SETTINGS['show_support_message'] = '';
199 }
200 if (!isset($CODOC_SETTINGS['show_support_categories'])) {
201 $CODOC_SETTINGS['show_support_categories'] = '';
202 }
203 if (!isset($CODOC_SETTINGS['show_support_location'])) {
204 $CODOC_SETTINGS['show_support_location'] = 'bottom';
205 }
206 if (!isset($CODOC_SETTINGS['do_not_filter_the_content'])) {
207 $CODOC_SETTINGS['do_not_filter_the_content'] = '0';
208 }
209
210 if (!isset($CODOC_SETTINGS['entry_button_text'])) {
211 $CODOC_SETTINGS['entry_button_text'] = '';
212 }
213 if (!isset($CODOC_SETTINGS['subscription_button_text'])) {
214 $CODOC_SETTINGS['subscription_button_text'] = '';
215 }
216 if (!isset($CODOC_SETTINGS['support_button_text'])) {
217 $CODOC_SETTINGS['support_button_text'] = '';
218 }
219 if (!isset($CODOC_SETTINGS['subscription_message'])) {
220 $CODOC_SETTINGS['subscription_message'] = '';
221 }
222 if (!isset($CODOC_SETTINGS['support_message'])) {
223 $CODOC_SETTINGS['support_message'] = '';
224 }
225 if (!isset($CODOC_SETTINGS['show_like'])) {
226 $CODOC_SETTINGS['show_like'] = '1';
227 }
228 if (!isset($CODOC_SETTINGS['show_about_codoc'])) {
229 $CODOC_SETTINGS['show_about_codoc'] = '1';
230 }
231 if (!isset($CODOC_SETTINGS['show_powered_by'])) {
232 $CODOC_SETTINGS['show_powered_by'] = '1';
233 }
234
235 if (!isset($CODOC_SETTINGS['codoc_tag_attributes'])) {
236 $CODOC_SETTINGS['codoc_tag_attributes'] = '';
237 }
238 if (!isset($CODOC_SETTINGS['codoc_connect_code'])) {
239 $CODOC_SETTINGS['codoc_connect_code'] = '';
240 }
241 if (!isset($CODOC_SETTINGS['debug_params'])) {
242 $CODOC_SETTINGS['debug_params'] = '';
243 }
244 add_settings_section(
245 'setting_section_id', // id
246 'codoc 設定ページ', // title
247 function (){}, // callback
248 'codoc' // page
249 );
250 // 認証がある場合
251 if ($CODOC_AUTHINFO) {
252 // クリエイター�
253 報だけ更新 (POST時に同期をとる)
254 if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['settings-updated'])) {
255 error_log(print_r($_POST,true));
256 $data = $this->util->get_user_info([],[
257 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
258 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
259 ]);
260 if ($data->status and $user = $data->user) {
261 update_option(CODOC_AUTHINFO_OPTION_NAME,[
262 'email' => $user->email,
263 'name' => $user->name,
264 'profile_image_url' => $user->profile_image_url,
265 'cover_image_url' => $user->cover_image_url,
266 ]);
267 }
268 }
269
270 register_setting(
271 'codoc_option_group', // option group
272 CODOC_SETTINGS_OPTION_NAME // option name(DB)
273 );
274 add_settings_field(
275 'css_path', // id
276 'テーマ', // title
277 function() {
278 global $CODOC_SETTINGS;
279 echo '<div class="excerpt">テーマを指定してペイウォールのデザインを変えることができます。<br>パスを指定を選択することでCSSを直接指定するこもと可能です。</div>';
280 echo sprintf('<div class="inputGroup"><input type="text" name="%s[css_path]" value="%s" id="codoc_css_path" readonly>',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['css_path']);
281 echo '' .
282 '<script type="text/javascript"> ' .
283 ' function gen_css_path(select) { ' .
284 ' if (select.value == "dark") { ' .
285 ' document.getElementById("darkmode-caution").style.display="block";' .
286 ' } else { ' .
287 ' if (document.getElementById("darkmode-caution")) { ' .
288 ' document.getElementById("darkmode-caution").style.display="none";' .
289 ' } ' .
290 ' } ' .
291 ' if (select.value == "path") { ' .
292 ' document.getElementById("codoc_css_path").readOnly=false; ' .
293 ' if (!document.getElementById("codoc_css_path").value.match(/\//g)) {' .
294 ' document.getElementById("codoc_css_path").value=""; ' .
295 ' } ' .
296 ' } else { ' .
297 ' document.getElementById("codoc_css_path").readOnly=true; ' .
298 ' document.getElementById("codoc_css_path").value=select.value; ' .
299 ' } ' .
300 ' } ' .
301 '</script> ' ;
302
303 echo sprintf('<select name="theme_name" onChange="gen_css_path(this)" id="codoc_theme_select">');
304 foreach (["blue","red","green","black","dark","blue-square","red-square","green-square","black-square","dark-square"] as $theme) {
305 if ($theme == "blue") {
306 echo sprintf('<option value="%s" %s>青</option>', $theme, ($CODOC_SETTINGS["css_path"] == "blue" ? "selected" : ""));
307 }
308 if ($theme == "red") {
309 echo sprintf('<option value="%s" %s>赤</option>', $theme, ($CODOC_SETTINGS["css_path"] == "red" ? "selected" : ""));
310 }
311 if ($theme == "green") {
312 echo sprintf('<option value="%s" %s>緑</option>', $theme, ($CODOC_SETTINGS["css_path"] == "green" ? "selected" : ""));
313 }
314 if ($theme == "black") {
315 echo sprintf('<option value="%s" %s>黒</option>', $theme, ($CODOC_SETTINGS["css_path"] == "black" ? "selected" : ""));
316 }
317 if ($theme == "dark") {
318 echo sprintf('<option value="%s" %s>ダークモード</option>', $theme, ($CODOC_SETTINGS["css_path"] == "dark" ? "selected" : ""));
319 }
320 if ($theme == "blue-square") {
321 echo sprintf('<option value="%s" %s>青(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "blue-square" ? "selected" : ""));
322 }
323 if ($theme == "red-square") {
324 echo sprintf('<option value="%s" %s>赤(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "red-square" ? "selected" : ""));
325 }
326 if ($theme == "green-square") {
327 echo sprintf('<option value="%s" %s>緑(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "green-square" ? "selected" : ""));
328 }
329 if ($theme == "black-square") {
330 echo sprintf('<option value="%s" %s>黒(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "black-square" ? "selected" : ""));
331 }
332 if ($theme == "dark-square") {
333 echo sprintf('<option value="%s" %s>ダークモード(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "dark-square" ? "selected" : ""));
334 }
335 }
336 echo sprintf('<option value="path" %s>パス指定</option>', (preg_match("/\//",$CODOC_SETTINGS["css_path"]) ? "selected" : ""));
337 echo '<script type="text/javascript">gen_css_path(document.getElementById(\'codoc_theme_select\'))</script>';
338 echo sprintf('</select></div>');
339 echo '<p id="darkmode-caution" style="display:none">ダークモード向けテーマは文字色が白となり、背景色によっては文字が見えない状�
340 �となるためご注意ください。</p>';
341 },
342 'codoc', //page
343 'setting_section_id' //Section
344 );
345 add_settings_field(
346 'paywall_text', // id
347 '各種文言', // title
348 function() {
349 global $CODOC_SETTINGS;
350 echo '<div class="excerpt">ペイウォール�
351 の一部文言を変更できます。</div>';
352 echo '<table class="innerTable"><tbody>';
353 echo '<tr><th>いいねの表示</th><td>';
354 echo sprintf('<input type="radio" value="1" name="%s[show_like]" id="show_like_on" %s><label for="show_like_on">する</label> ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_like'] == '1' ? "checked" : ""));
355 echo sprintf('<input type="radio" value="0" name="%s[show_like]" id="show_like_off" %s><label for="show_like_off">しない</label> <br / >',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_like'] == '0' ? "checked" : ""));
356 echo '</td></tr>';
357
358 echo '<tr><th>codocについての表示</th><td>';
359 echo sprintf('<input type="radio" value="1" name="%s[show_about_codoc]" id="show_about_codoc_on" %s><label for="show_about_codoc_on">する</label> ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_about_codoc'] == '1' ? "checked" : ""));
360 echo sprintf('<input type="radio" value="0" name="%s[show_about_codoc]" id="show_about_codoc_off" %s><label for="show_about_codoc_off">しない</label> <br / >',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_about_codoc'] == '0' ? "checked" : ""));
361 echo '</td></tr>';
362
363 echo '<tr><th>PoweredByの表示</th><td>';
364 echo sprintf('<input type="radio" value="1" name="%s[show_powered_by]" id="show_powered_by_on" %s><label for="show_powered_by_on">する</label> ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_powered_by'] == '1' ? "checked" : ""));
365 echo sprintf('<input type="radio" value="0" name="%s[show_powered_by]" id="show_powered_by_off" %s><label for="show_powered_by_off">しない</label> <br / >',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_powered_by'] == '0' ? "checked" : ""));
366 echo '</td></tr>';
367
368 echo '<tr><th>記事購�
369 �ボタンのテキスト</th><td>';
370 echo sprintf('<input type="text" name="%s[entry_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['entry_button_text']));
371 echo '</td></tr>';
372
373 echo '<tr><th>サブスクリプション購�
374 �ボタンのテキスト</th><td>';
375 echo sprintf('<input type="text" name="%s[subscription_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_button_text']));
376 echo '</td></tr>';
377
378 echo '<tr><th>サポートボタンのテキスト</th><td>';
379 echo sprintf('<input type="text" name="%s[support_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_button_text']));
380 echo '</td></tr>';
381
382 echo '<tr><th>「サブスクリプションに含まれる記事」のテキスト</th><td>';
383 echo sprintf('<input type="text" name="%s[subscription_message]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_message']));
384 echo '</td></tr>';
385
386 echo '<tr><th>サポート説明のテキスト</th><td>';
387 echo sprintf('<input type="text" name="%s[support_message]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_message']));
388 echo '</td></tr>';
389
390 echo '</tbody></table>';
391 },
392 'codoc', //page
393 'setting_section_id' //Section
394 );
395
396 add_settings_field(
397 'codoc_tag_attributes', // id
398 'codocタグの属性', // title
399 function() {
400 global $CODOC_SETTINGS;
401 echo '<div class="excerpt">codocタグに特定の属性を追加することができます。</div>';
402 echo sprintf('<input type="text" name="%s[codoc_tag_attributes]" value="%s">',CODOC_SETTINGS_OPTION_NAME,htmlspecialchars($CODOC_SETTINGS['codoc_tag_attributes']));
403 },
404 'codoc', //page
405 'setting_section_id' //Section
406 );
407 add_settings_field(
408 'codoc_connect_code', // id
409 'サービス連携コード', // title
410 function() {
411 global $CODOC_SETTINGS;
412 echo '<div class="excerpt">サービス連携ウィジェットを利用するためにはアカウント設定でサービス連携を有効化し、サービス連携コードを指定してください</div>';
413 echo sprintf('<input type="text" name="%s[codoc_connect_code]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['codoc_connect_code']));
414 },
415 'codoc', //page
416 'setting_section_id' //Section
417 );
418
419 add_settings_field(
420 'str_replace_binded_url', // id
421 'パーマリンク', // title
422 function() {
423 global $CODOC_SETTINGS;
424 echo '<div class="excerpt">codoc側に登録するパーマリンクを置換することができます。</div>';
425 echo sprintf('<input type="text" name="%s[str_replace_binded_url_from]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['str_replace_binded_url_from']));
426 echo ('<span class="suptext"></span>');
427 echo sprintf('<input type="text" name="%s[str_replace_binded_url_to]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['str_replace_binded_url_to']));
428 echo ('に変換');
429 },
430 'codoc', //page
431 'setting_section_id' //Section
432 );
433
434 add_settings_field(
435 'str_around_codoc_tag', // id
436 'HTMLの挿�
437 �', // title
438 function() {
439 global $CODOC_SETTINGS;
440 echo '<div class="excerpt">codocタグの前後にHTMLを挿�
441 �することができます。</div>';
442 echo sprintf('<div class="inputRow"><textarea name="%s[str_before_codoc_tag]" cols="40">%s</textarea>',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['str_before_codoc_tag']));
443 echo ('を前に挿�
444 �</div>');
445 echo sprintf('<div class="inputRow"><textarea name="%s[str_after_codoc_tag]" cols="40">%s</textarea>',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['str_after_codoc_tag']));
446 echo ('を後に挿�
447 �</div>');
448
449 },
450 'codoc', //page
451 'setting_section_id' //Section
452 );
453
454 add_settings_field(
455 'always_show_support_tag', // id
456 'サポートの自動挿�
457 �', // title
458 function() {
459 global $CODOC_SETTINGS;
460 echo '<div class="excerpt">codocブロックを挿�
461 �することなく投稿にサポート機能を追加します</div>';
462 echo '<table class="innerTable"><tbody>';
463 echo '<tr><th>自動挿�
464 �</th><td>';
465 echo sprintf('<input type="radio" value="1" name="%s[always_show_support]" id="always_show_support_on" %s><label for="always_show_support_on">する</label> ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['always_show_support'] == '1' ? "checked" : ""));
466 echo sprintf('<input type="radio" value="0" name="%s[always_show_support]" id="always_show_support_off" %s><label for="always_show_support_off">しない</label> <br / >',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['always_show_support'] == '0' ? "checked" : ""));
467 echo '</td></tr>';
468 echo '<tr><th>表示位置</th><td>';
469 echo sprintf('<input type="radio" value="top" name="%s[show_support_location]" id="show_support_location_top" %s><label for="show_support_location_top">冒頭</label> ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_support_location'] == 'top' ? "checked" : ""));
470 echo sprintf('<input type="radio" value="bottom" name="%s[show_support_location]" id="show_support_location_bottom" %s><label for="show_support_location_bottom">末尾</label> <br / >',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_support_location'] == 'bottom' ? "checked" : ""));
471 echo '</td></tr>';
472 echo '<tr><th>説明文</th><td>';
473 echo sprintf('<input type="text" placeholder="サポートの説明文をカスタマイズできます" size="50%%" name="%s[show_support_message]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['show_support_message']));
474 echo '</td></tr>';
475 echo '<tr><th>対象カテゴリ名</th><td>';
476 echo sprintf('<input placeholder="&quot;|&quot;区切りで複数指定できます" type="text" size="50%%" name="%s[show_support_categories]" value="%s"><br />',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['show_support_categories']));
477 echo '</td></tr>';
478 echo '</tbody></table>';
479
480 },
481 'codoc', //page
482 'setting_section_id' //Section
483 );
484 add_settings_field(
485 'do_not_filter_the_content', // id
486 '支障が出る処理を無効化', // title
487 function() {
488 global $CODOC_SETTINGS;
489 echo '<div class="excerpt">codocの動作に支障が出る他のプラグインによる<strong>フィルター処理</strong>を無効化できます。codocが上手く動かない場合のみ利用してください。</div>';
490 echo sprintf('<input type="radio" value="1" name="%s[do_not_filter_the_content]" id="do_not_filter_the_content_on" %s><label for="do_not_filter_the_content_on">する</label> ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['do_not_filter_the_content'] == '1' ? "checked" : ""));
491 echo sprintf('<input type="radio" value="0" name="%s[do_not_filter_the_content]" id="do_not_filter_the_content_off" %s><label for="do_not_filter_the_content_off">しない</label> ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['do_not_filter_the_content'] == '0' ? "checked" : ""));
492 },
493 'codoc', //page
494 'setting_section_id' //Section
495 );
496 add_settings_field(
497 'debug_params', // id
498 'デバック用', // title
499 function() {
500 global $CODOC_SETTINGS;
501 echo '<div class="excerpt">デバック用のパラメーターを指定できます。codocサポートから依頼がある場合のみ利用してください。</div>';
502 echo sprintf('<input placeholder="" type="text" size="50%%" name="%s[debug_params]" value="%s"><br />',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['debug_params']));
503 },
504 'codoc', //page
505 'setting_section_id' //Section
506 );
507
508 add_settings_field(
509 'cretor_info', // id
510 'クリエイター�
511 ', // title
512 function() {
513 global $CODOC_AUTHINFO;
514 echo sprintf('<p><font id="codoc-update-creator-info-message"></font></p>',"");
515 // 変更を保存時に常に同期するのでこの表示は�
516 要ないがUI上保持しておく
517 $script = "document.getElementById('codoc-update-creator-info-message').innerText='�
518 報を更新するには変更を保存してください';document.getElementById('codoc-update-creator-info-message').color='red';";
519 if (isset($CODOC_AUTHINFO['profile_image_url'])) {
520 echo sprintf('<img src="%s" width="40" height="40" />',$CODOC_AUTHINFO['profile_image_url']);
521 }
522 echo sprintf('%s',$CODOC_AUTHINFO['name']);
523 echo sprintf('<p>�
524 報を<a href="javascript:void(0);" onClick="' . $script . '">更新する</p>');
525 },
526 'codoc', //page
527 'setting_section_id' //Section
528 );
529
530 register_setting(
531 'codoc_option_group', // option group
532 CODOC_USERCODE_OPTION_NAME
533 );
534 register_setting(
535 'codoc_option_group', // option group
536 CODOC_TOKEN_OPTION_NAME
537 );
538
539 if (isset($_GET['codoc_auth_finished']) and $_GET['codoc_auth_finished']) {
540 add_settings_error( 'general', 'settings_updated', __( 'codocの認証が完了しました' ), 'success' );
541 }
542
543 add_settings_field(
544 'codoc_auth',
545 '認証',
546 function() {
547 global $CODOC_USERCODE;
548 global $CODOC_TOKEN;
549 global $CODOC_AUTHINFO;
550 $script = "javascript:document.getElementById('codoc-usercode').value='-';document.getElementById('codoc-token').value='-';document.getElementById('codoc-auth-message').innerText='解除を完了するには変更を保存してください';document.getElementById('codoc-auth-message').color='red';";
551
552 echo sprintf('<p><font color="green" id="codoc-auth-message"><strong>%s</strong> で認証済</font></p>',$CODOC_AUTHINFO['email']);
553
554 echo sprintf('<input id="codoc-usercode" type="hidden" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
555 echo sprintf('<input id="codoc-token" type="hidden" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
556 echo sprintf('<p>認証を<a href="javascript:void(0);" onClick="' . $script . '">解除する</p>');
557 },
558 'codoc',
559 'setting_section_id'
560 );
561
562 }
563
564 // ない場合
565 if (!$CODOC_AUTHINFO and !isset($_GET['auth_by_myself'])) {
566 add_settings_field(
567 'codoc_auth',
568 '認証',
569 function() {
570 //$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
571 $current_url = admin_url('options-general.php') . '?page=codoc';
572 $login_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/me/token?from=wp&return_url=' . urlencode($current_url));
573 $register_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/register?from=wp&return_url=' . urlencode($current_url));
574 // submitを消しておく
575 echo ('<script type="text/javascript">window.onload=function(){document.getElementById(\'submit\').style.display = \'none\'}</script>');
576 echo ('codocをWordPressでご利用いただくには認証が�
577 要です。<br />');
578 echo sprintf('ユーザーコードとAPIトークンを<a href="%s&auth_by_myself=1">直接�
579 �力</a>することでも認証できます。<br /><br />',$current_url);
580 echo sprintf('<input type="button" class="button button-primary" value="ログインして認証" onClick="%s"> <input type="button" class="button button-primary" value="登録して認証" onClick="%s"><br /><br />',$login_url,$register_url);
581
582
583 },
584 'codoc',
585 'setting_section_id'
586 );
587 }
588 // ない場合かつ自分で認証する場合
589 if (!$CODOC_AUTHINFO and (
590 (isset($_GET['auth_by_myself']) and $_GET['auth_by_myself']) or
591 (isset($_POST['auth_by_myself']) and $_POST['auth_by_myself'])
592 )) {
593 register_setting(
594 'codoc_option_group', // option group
595 CODOC_USERCODE_OPTION_NAME
596 );
597 register_setting(
598 'codoc_option_group', // option group
599 CODOC_TOKEN_OPTION_NAME
600 );
601 add_settings_field(
602 'codoc_usercode',
603 'ユーザーコード',
604 function() {
605 global $CODOC_USERCODE;
606 echo '<input type="hidden" name="auth_by_myself" value="1">';
607 echo sprintf('<input type="text" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
608 },
609 'codoc',
610 'setting_section_id'
611 );
612 add_settings_field(
613 'codoc_token',
614 'APIトークン',
615 function() {
616 global $CODOC_TOKEN;
617 echo sprintf('<input type="text" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
618 },
619 'codoc',
620 'setting_section_id'
621 );
622 }
623
624 // 認証�
625 報を保存
626 add_action( 'update_option_' . CODOC_USERCODE_OPTION_NAME, function( $old_value, $new_value ) {
627 global $CODOC_RE_AUTHORIZE;
628 $CODOC_RE_AUTHORIZE = 1;
629 },9,2); // $hook, $function_to_add, $priority, $accepted_args
630 add_action( 'update_option_' . CODOC_TOKEN_OPTION_NAME, function( $old_value, $new_value ) {
631 global $CODOC_RE_AUTHORIZE;
632 $CODOC_RE_AUTHORIZE = 1;
633 },10,2);
634
635 add_action('update_option_' . CODOC_SETTINGS_OPTION_NAME,function(){
636 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
637 if (isset($CODOC_SETTINGS['always_show_support']) and $CODOC_SETTINGS['always_show_support']) {
638 $data = $this->util->get_support_entry([],[
639 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
640 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
641 ]);
642 if ($data->status and $entry = $data->entry) {
643 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,$entry->code);
644 } else {
645 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
646 }
647 } elseif(isset($CODOC_SETTINGS['always_show_support']) and !$CODOC_SETTINGS['always_show_support']) {
648 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
649 }
650 });
651
652 add_action('updated_option',function(){
653 global $CODOC_RE_AUTHORIZE;
654 if ($CODOC_RE_AUTHORIZE) {
655 //$data = $this->callAPI('GET','');
656 $data = $this->util->get_user_info([],[
657 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
658 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
659 ]);
660 if ($data->status and $user = $data->user) {
661 update_option(CODOC_AUTHINFO_OPTION_NAME,[
662 'email' => $user->email,
663 'name' => $user->name,
664 'profile_image_url' => $user->profile_image_url,
665 'cover_image_url' => $user->cover_image_url,
666 ]);
667 } else {
668 update_option(CODOC_AUTHINFO_OPTION_NAME,'');
669 }
670 }
671 });
672
673 });
674 // プラグイン一覧に設定のリンクをいれる
675 add_filter( 'plugin_action_links_' . plugin_basename( plugin_dir_path( __FILE__ ) . 'codoc' . '.php' ),
676 function( $links ) {
677 $setting_link = sprintf( '<a href="%s">%s</a>', esc_url( add_query_arg( 'page', 'codoc', admin_url( 'options-general.php' ) ) ), esc_html( '設定' ) );
678 array_unshift( $links, $setting_link );
679
680 return $links;
681 }
682 );
683
684 }
685 public function add_mce() {
686 add_action( 'admin_enqueue_scripts', function() {
687 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
688 return;
689 }
690 $current_screen = get_current_screen();
691 if ( ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) || ( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) ) {
692 // Gutenberg Editor
693 // なにもしない
694 } else {
695 // tinymce
696 if ( get_user_option( 'rich_editing' ) == 'true' ) {
697 // プラグイン�
698 で使うCSRF を生成
699 $path = plugins_url( 'codoc/src_mce/codoc-editor-onload.js', __DIR__ );
700 wp_enqueue_script( 'codoc-editor-onload', $path, array('jquery'), '', true );
701 // I just want to insert this global variables but i don't know how i can do it..
702 wp_localize_script(
703 'codoc-editor-onload',
704 'CODOCEDITOR',
705 array(
706 'action' => 'codoc_shortcodes',
707 'nonce' => wp_create_nonce( 'codoc_shortcodes' ),
708
709 'codoc_url' => $this->get_codoc_url(),
710 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
711 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
712 'codoc_sdk_path' => CODOC_SDK_PATH,
713 )
714 );
715
716 // ここでtinymceのプラグイン追加
717 //wp_enqueue_style( 'codoc-admin-style', plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
718 //add_editor_style( plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
719 wp_enqueue_style( 'codoc-admin-style', $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.css?c=' . date('Ymd') );
720 add_editor_style( $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.css' );
721
722 add_filter( 'mce_external_plugins', function( $plugin_array ) {
723 //$plugin_array['codoc'] = plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ );
724 $plugin_array['codoc'] = $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.js?c=' . date('Ymd');
725 return $plugin_array;
726 } );
727 add_filter( 'mce_buttons', function( $buttons ) {
728 array_push( $buttons, "|", "codoc" );
729 return $buttons;
730 } );
731
732 }
733 }
734 } );
735 }
736 public function get_filtered_content($post_emulated) {
737 // 記事ページであることをエミュレートしてフィルター実行
738 $post_backuped = null;
739 if (isset($GLOBALS['post'])) {
740 $post_backuped = $GLOBALS['post'];
741 }
742 $GLOBALS['post'] = $post_emulated;
743
744 $wp_query_backuped = null;
745 if (isset($GLOBALS['wp_query'])) {
746 $wp_query_backuped = $GLOBALS['wp_query'];
747 $wp_query = $GLOBALS['wp_query'];
748 $wp_query->is_single = true;
749 $wp_query->is_singular = true;
750 # in_the_loop は記事ページでは通常有効っぽいので true指定 ex: wp_ulike
751 $wp_query->in_the_loop = true;
752 # これも追加しておく
753 $wp_query->is_main_query = true;
754
755 $wp_query->post = $post_emulated;
756 $wp_query->queried_object = $post_emulated;
757 $wp_query->queried_object_id = $post_emulated->id;
758
759 $GLOBALS['wp_query'] = $wp_query;
760 }
761 // $this->the_content でオリジナルを返してもらうため
762 $this->do_not_filter_the_content = true;
763 $content = preg_replace(
764 '/ (\/)?wp:codoc\/codoc-block /',' \\1wptmp:codoc/codoc-block ',
765 $post_emulated->post_content
766 );
767 #$content = do_shortcode( $content );
768 $content_filtered = apply_filters( 'the_content', $content);
769 $this->do_not_filter_the_content = false;
770
771 $GLOBALS['post'] = $post_backuped;
772
773 if ($wp_query_backuped) {
774 $GLOBALS['wp_query'] = $wp_query_backuped;
775 }
776
777 $content_filtered = preg_replace(
778 '/ (\/)?wptmp:codoc\/codoc-block /',' \\1wp:codoc/codoc-block ',
779 $content_filtered
780 );
781 return $content_filtered;
782 }
783
784 public function save_post($post_ID,$post,$update) {
785 if (preg_match('/^(auto-draft|inherit)$/',$post->post_status)) {
786 return;
787 }
788 $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
789 $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME);
790 $post_content = (isset($codoc_settings['do_not_filter_the_content']) and $codoc_settings['do_not_filter_the_content']) ?
791 $post->post_content : $this->get_filtered_content($post);
792 $res = $this->util->sync_entry([
793 "post_title" => $post->post_title,
794 "post_content" => $post_content,
795 "post_status" => ($post->post_status == 'publish' ? 1 : 0),
796 "post_permalink" => get_permalink($post_ID),
797 "codoc_entry_code" => $entryCode,
798 "codoc_settings" => $codoc_settings,
799 ],[
800 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
801 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
802 ]);
803
804 if (is_object($res) and $res->status and !$entryCode) {
805 update_post_meta($post_ID,'codoc_entry_code',$res->entry->code);
806 }
807 return true;
808 }
809 function updated_post_meta( $meta_ID, $post_ID, $meta_key ) {
810 // スルーされてる場合は他のメタ�
811 報更新のタイミングにサムネイルをアップロード
812 $has_to_resend = get_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',true);
813 $has_to_resendi = get_post_meta($post_ID,'icodoc_post_thumbnail_invoking_entry_code',true);
814 if ($has_to_resend != 1 and $meta_key != '_thumbnail_id') {
815 return;
816 }
817 if ( has_post_thumbnail($post_ID) ) {
818 // 新規投稿の場合、タイミングによってはcodocEntryCodeが取得できないので一旦スルーする
819 if (!get_post_meta($post_ID,'codoc_entry_code',true)) {
820 update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',1);
821 return;
822 } else {
823 update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',0);
824 }
825 $attachment = wp_get_attachment_metadata( get_post_thumbnail_id($post_ID));
826 $upload_dir = wp_upload_dir();
827 $file_path = sprintf ('%s/%s',$upload_dir['basedir'],$attachment['file']);
828
829 return $this->util->post_thumbnail([
830 "file_path" => $file_path,
831 "boundary" => wp_generate_password(24),
832 "codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true),
833 ],[
834 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
835 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
836 ]);
837 }
838 }
839 function deleted_post_meta( $meta_ids, $post_ID, $meta_key,$meta_value ) {
840 if ($meta_key != '_thumbnail_id') {
841 return;
842 }
843 return $this->util->reset_thumbnail(
844 ["codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true)],
845 [
846 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
847 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
848 ]
849 );
850 }
851
852 function the_content( $post_content ) {
853 if ( is_single() && in_the_loop() && is_main_query() ) {
854 }
855 // get_filtered_content から do_not_filter_the_contentを有効にされるパターン
856 // オプションの設定値の意味合い(他のフィルタを無視)とは違うため注意
857 if ($this->do_not_filter_the_content) {
858 return $post_content;
859 }
860 $post = get_post();
861 # is_amp で実�
862 しているテンプレート用
863 $is_amp_endpoint = (function_exists('is_amp_endpoint') && is_amp_endpoint()) ? true :
864 ((function_exists('is_amp') && is_amp()) ? true : false);
865 return $this->util->filter_content([
866 "post_content" => $post_content,
867 "preview" => is_preview(),
868 "codoc_entry_code" => get_post_meta($post->ID,'codoc_entry_code',true),
869 "codoc_settings" => get_option(CODOC_SETTINGS_OPTION_NAME),
870 "is_amp_endpoint" => $is_amp_endpoint,
871 "post_permalink" => get_permalink($post->ID),
872 "codoc_support_entry_code" => get_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME),
873 ]);
874 }
875
876 function excerpt_allowed_blocks ($allowed_blocks) {
877 if (is_array($allowed_blocks)) {
878 array_push($allowed_blocks,'codoc/codoc-block');
879 }
880 return $allowed_blocks;
881 }
882 }
883