PluginProbe
codoc / 0.9.11
codoc v0.9.11
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.11, at class-codoc.php

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