PluginProbe
codoc / 0.9.8.8
codoc v0.9.8.8
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.8.8, at class-codoc.php

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