PluginProbe
codoc / 0.9.9.1
codoc v0.9.9.1
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.1, at class-codoc.php

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