PluginProbe
codoc / 0.9.9
codoc v0.9.9
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.9, at class-codoc.php

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