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

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

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