PluginProbe
codoc / 0.9.59
codoc v0.9.59
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.59, at class-codoc.php

1,214 lines 74.5 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 public function __construct() {
5 add_action('plugins_loaded', [$this,'codoc_load_textdomain']);
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 // ショーココードの退避
29 if (isset($CODOC_SETTINGS['shortcode_evacuation']) and $CODOC_SETTINGS['shortcode_evacuation']) {
30 add_filter('the_content',[$this,'the_content_shortcode_evacuations'],0);
31 }
32 add_filter('the_content',[$this,'the_content'],$priority);
33 // 2021-09-24 the_content を利用しない場合は個別に呼び出ししてもらう
34 add_filter('codoc_the_content',[$this,'the_content'],$priority);
35
36 // 2020-07-25 excerpt対応
37 add_filter('excerpt_allowed_blocks',[$this,'excerpt_allowed_blocks']);
38
39 // テーマが allowed_block_types_all で制限している場合に codoc ブロックを許可リストに追加
40 add_filter('allowed_block_types_all', [$this,'allowed_block_types_all'], 100, 2);
41
42 $auth_info = get_option(CODOC_AUTHINFO_OPTION_NAME);
43
44 if ($auth_info) {
45 // データ同期 (save_postはis_adminで実行されないケースがある)
46 add_action( 'save_post', [$this,'save_post'], 20, 3 );
47 add_action( 'added_post_meta', [$this,'updated_post_meta'], 10, 3 );
48 add_action( 'updated_post_meta',[$this,'updated_post_meta'], 10, 3 );
49 add_action( 'deleted_post_meta',[$this,'deleted_post_meta'], 10, 4 );
50 }
51 global $pagenow;
52 //管理画面でcodoc認証があり投稿画面の場合
53 if (is_admin() and $auth_info and preg_match('/^post/',$pagenow)) {
54 // Gutenberg のサポートがない場合は何もしない
55 if ( function_exists( 'register_block_type' ) ) {
56 // gutenberg - init.php handles all block registration and script enqueuing
57 require_once 'src/init.php';
58 }
59 // tinymce
60 $this->add_mce();
61 } elseif(is_admin() and $auth_info and preg_match('/^edit/',$pagenow)) {
62 // 記事編集ページ
63 } elseif(!is_admin()) { // ブログ画面
64 // codocのJS登録
65 add_action( 'wp_enqueue_scripts', function() {
66 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
67 $load_script_condition = '';
68 if (isset($CODOC_SETTINGS["debug_params"]) and
69 $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true) and
70 isset($params_decoded["load_script_condition"])
71 ) {
72 $load_script_condition = $params_decoded["load_script_condition"];
73 }
74 if ($load_script_condition == 'not_list_page') {
75 // not_list_pageの場合はトップページ等でスクリプトをロードしない
76 if (!(is_archive() or is_category() or is_home() or is_front_page())) {
77 wp_enqueue_script( 'codoc-injector-js', $this->get_codoc_url() . '/js/cms.js' );
78 }
79 } else {
80 wp_enqueue_script( 'codoc-injector-js', $this->get_codoc_url() . '/js/cms.js' );
81 }
82 });
83 //登録したscriptタグに属性をつける
84 add_filter('script_loader_tag', [$this,'modifier_script_tag'],10,2);
85 // tinymce用のショートコード
86 add_shortcode('codoc', [$this, 'injector_shortcode']);
87 // テーマをbodyにも反映
88 add_filter('body_class', function($classes) {
89 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
90 // デフォルトを変更
91 $css_path = 'rainbow-square';
92 if (isset($CODOC_SETTINGS["css_path"]) and $CODOC_SETTINGS["css_path"]) {
93 $css_path = $CODOC_SETTINGS["css_path"];
94 }
95 array_push($classes,sprintf( "codoc-theme-%s",$css_path));
96 return $classes;
97 });
98
99 }
100 return $this;
101 }
102 function codoc_load_textdomain() {
103 load_plugin_textdomain('codoc', false, dirname(plugin_basename( __FILE__ )) . '/languages/');
104 }
105 public function get_codoc_url() {
106 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
107 if (isset($CODOC_SETTINGS["debug_params"])) {
108 $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
109 if (isset($params_decoded["codoc_url"])) {
110 return $params_decoded["codoc_url"];
111 }
112 }
113 return CODOC_URL;
114 }
115 public function modifier_script_tag($tag,$handle) {
116 if($handle !== 'codoc-injector-js') {
117 return $tag;
118 }
119 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
120 $data_css = '';
121 if ($css_path = $CODOC_SETTINGS['css_path']) {
122 $data_css = sprintf(' data-css="%s" ',$css_path);
123 }
124 // connect用パラメータ
125 $connect_attributes = '';
126 if (isset($CODOC_SETTINGS["codoc_connect_code"])) {
127 $connect_code = $CODOC_SETTINGS["codoc_connect_code"];
128 $connect_attributes = sprintf(' data-connect-code="%s"',$connect_code);
129 $tag = preg_replace('/cms\.js/','cms-connect.js',$tag);
130 }
131 if (isset($CODOC_SETTINGS["codoc_connect_registration_mode"]) and $CODOC_SETTINGS["codoc_connect_registration_mode"]) {
132 $connect_attributes = $connect_attributes .
133 sprintf(' data-connect-registration-mode="%s"',$CODOC_SETTINGS["codoc_connect_registration_mode"]);
134 }
135
136 $usercode_attributes = '';
137 $user_code = get_option(CODOC_USERCODE_OPTION_NAME);
138 if ($user_code) {
139 $usercode_attributes = sprintf(' data-usercode="%s"',$user_code);
140 }
141
142 $setting_attributes = '';
143 if (isset($CODOC_SETTINGS['codoc_script_tag_attributes']) and $CODOC_SETTINGS['codoc_script_tag_attributes']) {
144 $setting_attributes = $CODOC_SETTINGS['codoc_script_tag_attributes'];
145 }
146 //return str_replace(' src=', $data_css . ' defer src=', $tag);
147 return preg_replace('/(src=[^>]+)/',' ${1} ' . $data_css . $connect_attributes . $usercode_attributes . $setting_attributes . ' defer',$tag);
148 }
149 public function injector_shortcode($atts) {
150 global $post;
151 ob_start();
152 require 'views/codoc-injector.php';
153 return ob_get_clean();
154 }
155 # settings / 設定関連
156 public function add_settings() {
157 global $CODOC_SETTINGS;
158 add_action( 'admin_menu' ,function(){
159 add_options_page(
160 __('codoc Settings','codoc'), //ページタイトル
161 'codoc', //設定メニューに表示されるメニュータイトル
162 'edit_users', //権限
163 'codoc', //設定ページのURL。options-general.php?page=codoc
164 function() {
165 echo '<div class="codoc-settings">';
166 echo '<form method="post" action="options.php">';
167 settings_fields( 'codoc_option_group' );
168 do_settings_sections( 'codoc' );
169 submit_button(); // 送信ボタン
170 echo '</form></div>';
171 }
172 );
173 });
174
175 add_action('admin_print_styles', 'codoc_admin_styles');
176 function codoc_admin_styles($hook) {
177 wp_enqueue_style('codoc-options-style', plugins_url( 'codoc/css/codoc-options.css', __DIR__ ));
178 }
179
180 // notification を削除する Ajax 処理
181 add_action('wp_ajax_dismiss_codoc_notification', function() {
182 delete_transient('codoc_api_notification');
183 wp_die();
184 });
185
186 // 管理画面で notification の dismiss を処理する JavaScript
187 add_action('admin_footer', function() {
188 ?>
189 <script type="text/javascript">
190 jQuery(document).ready(function($) {
191 // codoc notification の×ボタンがクリックされたときの処理
192 $(document).on('click', '.codoc-notification .notice-dismiss', function() {
193 $.post(ajaxurl, {
194 action: 'dismiss_codoc_notification'
195 });
196 });
197 });
198 </script>
199 <?php
200 });
201
202 add_action( "admin_init", function() {
203 global $CODOC_USERCODE;
204 global $CODOC_SETTINGS;
205 global $CODOC_TOKEN;
206 global $CODOC_AUTHINFO;
207 // codocからの認証データ処理
208 if (current_user_can('edit_posts') && !isset($_GET['confirm_token']) and isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['fetch_token_key'])) {
209 $current_url = admin_url('options-general.php') . '?page=codoc';
210 $key = sanitize_text_field($_GET['fetch_token_key']);
211 $usercode = sanitize_text_field($_GET['usercode']);
212
213 // 確認画面の表示
214 if (
215 !isset($_GET['_wpnonce']) or
216 (isset($_GET['_wpnonce']) and !wp_verify_nonce($_GET['_wpnonce'],'fetch_token_nonce'))
217 ) {
218 wp_redirect($current_url .
219 sprintf("&confirm_token=1&fetch_token_key=%s&usercode=%s",$key,$usercode));
220 exit;
221 }
222 update_option(CODOC_USERCODE_OPTION_NAME,$usercode);
223 //$data = $this->callAPI('GET','/token',[ "fetch_token_key" => $key ]);
224 $data = $this->util->get_token([ "fetch_token_key" => $key ],["usercode" => $usercode, "token" => "1"]);
225 if ($data->status and property_exists($data,'token') and $token = $data->token) {
226 update_option(CODOC_TOKEN_OPTION_NAME,$token);
227 //$data = $this->callAPI('GET','');
228 $data = $this->util->get_user_info([],["usercode" => $usercode, "token" => $token]);
229
230 if ($data->status and $user = $data->user) {
231 $this->update_codoc_authinfo($user);
232 }
233 #$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
234 #$current_url = preg_replace('/(.*)fetch_token_key.*/','${1}&codoc_auth_finished=1',$current_url);
235 //add_settings_error( 'general', 'settings_updated', __( 'OK' ), 'success' );
236
237 $current_url = $current_url . '&codoc_auth_finished=1';
238 wp_redirect( $current_url);
239 exit;
240 }
241 }
242 $CODOC_USERCODE = get_option(CODOC_USERCODE_OPTION_NAME);
243 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
244 $CODOC_TOKEN = get_option(CODOC_TOKEN_OPTION_NAME);
245 $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
246 if( !$CODOC_SETTINGS ) {
247 //デフォルト値
248 $CODOC_SETTINGS = array(
249 'css_path' => '',
250 );
251 update_option( CODOC_SETTINGS_OPTION_NAME, $CODOC_SETTINGS );
252 }
253 if (!isset($CODOC_SETTINGS['str_replace_binded_url_from'])) {
254 $CODOC_SETTINGS['str_replace_binded_url_from'] = '';
255 }
256 if (!isset($CODOC_SETTINGS['str_replace_binded_url_to'])) {
257 $CODOC_SETTINGS['str_replace_binded_url_to'] = '';
258 }
259 if (!isset($CODOC_SETTINGS['str_before_codoc_tag'])) {
260 $CODOC_SETTINGS['str_before_codoc_tag'] = '';
261 }
262 if (!isset($CODOC_SETTINGS['str_after_codoc_tag'])) {
263 $CODOC_SETTINGS['str_after_codoc_tag'] = '';
264 }
265
266 if (!isset($CODOC_SETTINGS['always_show_support'])) {
267 $CODOC_SETTINGS['always_show_support'] = '0';
268 }
269 if (!isset($CODOC_SETTINGS['show_support_message'])) {
270 $CODOC_SETTINGS['show_support_message'] = '';
271 }
272 if (!isset($CODOC_SETTINGS['show_support_categories'])) {
273 $CODOC_SETTINGS['show_support_categories'] = '';
274 }
275 if (!isset($CODOC_SETTINGS['show_support_location'])) {
276 $CODOC_SETTINGS['show_support_location'] = 'bottom';
277 }
278 if (!isset($CODOC_SETTINGS['do_not_filter_the_content'])) {
279 $CODOC_SETTINGS['do_not_filter_the_content'] = '0';
280 }
281 if (!isset($CODOC_SETTINGS['shortcode_evacuation'])) {
282 $CODOC_SETTINGS['shortcode_evacuation'] = '0';
283 }
284
285 if (!isset($CODOC_SETTINGS['entry_button_text'])) {
286 $CODOC_SETTINGS['entry_button_text'] = '';
287 }
288 if (!isset($CODOC_SETTINGS['subscription_button_text'])) {
289 $CODOC_SETTINGS['subscription_button_text'] = '';
290 }
291 if (!isset($CODOC_SETTINGS['support_button_text'])) {
292 $CODOC_SETTINGS['support_button_text'] = '';
293 }
294 if (!isset($CODOC_SETTINGS['subscription_message'])) {
295 $CODOC_SETTINGS['subscription_message'] = '';
296 }
297 if (!isset($CODOC_SETTINGS['support_message'])) {
298 $CODOC_SETTINGS['support_message'] = '';
299 }
300 if (!isset($CODOC_SETTINGS['show_like'])) {
301 $CODOC_SETTINGS['show_like'] = '1';
302 }
303 if (!isset($CODOC_SETTINGS['show_about_codoc'])) {
304 $CODOC_SETTINGS['show_about_codoc'] = '1';
305 }
306 if (!isset($CODOC_SETTINGS['show_powered_by'])) {
307 $CODOC_SETTINGS['show_powered_by'] = '1';
308 }
309 if (!isset($CODOC_SETTINGS['show_created_by'])) {
310 $CODOC_SETTINGS['show_created_by'] = '1';
311 }
312 if (!isset($CODOC_SETTINGS['show_copyright'])) {
313 $CODOC_SETTINGS['show_copyright'] = '1';
314 }
315 if (!isset($CODOC_SETTINGS['codoc_tag_attributes'])) {
316 $CODOC_SETTINGS['codoc_tag_attributes'] = '';
317 }
318 if (!isset($CODOC_SETTINGS['codoc_script_tag_attributes'])) {
319 $CODOC_SETTINGS['codoc_script_tag_attributes'] = '';
320 }
321 if (!isset($CODOC_SETTINGS['codoc_connect_code'])) {
322 $CODOC_SETTINGS['codoc_connect_code'] = '';
323 }
324 if (!isset($CODOC_SETTINGS['codoc_connect_registration_mode'])) {
325 $CODOC_SETTINGS['codoc_connect_registration_mode'] = '';
326 }
327 if (!isset($CODOC_SETTINGS['debug_params'])) {
328 $CODOC_SETTINGS['debug_params'] = '';
329 }
330 if (!isset($CODOC_SETTINGS['block_defaults'])) {
331 $CODOC_SETTINGS['block_defaults'] = '';
332 }
333 add_settings_section(
334 'setting_section_id', // id
335 __('codoc Settings','codoc'), // title
336 [$this,'show_tadv_notice'],
337 'codoc' // page
338 );
339
340 // 認証がある場合
341 if ($CODOC_AUTHINFO) {
342 // クリエイター�
343 報だけ更新 (POST時に同期をとる)
344 if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['settings-updated'])) {
345 $data = $this->util->get_user_info([],[
346 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
347 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
348 ]);
349 if ($data->status and $user = $data->user) {
350 $this->update_codoc_authinfo($user);
351 // 一度get_optionしてるのでリロードする
352 $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
353 }
354 }
355
356 register_setting(
357 'codoc_option_group', // option group
358 CODOC_SETTINGS_OPTION_NAME, // option name(DB)
359 array('sanitize_callback' => function($input) {
360 if (isset($input['block_defaults']) && $input['block_defaults'] !== '') {
361 if (json_decode($input['block_defaults'], true) === null && $input['block_defaults'] !== 'null') {
362 $old = get_option(CODOC_SETTINGS_OPTION_NAME);
363 $input['block_defaults'] = isset($old['block_defaults']) ? $old['block_defaults'] : '';
364 add_settings_error('block_defaults', 'invalid_json', esc_html(__('Block Default Values: Invalid JSON format. The value was not saved.','codoc')), 'error');
365 }
366 }
367 return $input;
368 })
369 );
370 add_settings_field(
371 'css_path', // id
372 __('Theme','codoc'), // title
373 function() {
374 global $CODOC_SETTINGS;
375 echo '<div class="excerpt">' . esc_html(__('You can change the design of the paywall by specifying a theme.<br />You can also specify CSS directly by selecting "Path Specification"','codoc')) . '</div>';
376 echo sprintf('<div class="inputGroup"><input type="text" name="%s[css_path]" value="%s" id="codoc_css_path" readonly>',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['css_path']));
377 echo '' .
378 '<script type="text/javascript"> ' .
379 ' function gen_css_path(select) { ' .
380 ' if (select.value == "dark" || select.value == "dark-square") { ' .
381 ' document.getElementById("darkmode-caution").style.display="block";' .
382 ' } else { ' .
383 ' if (document.getElementById("darkmode-caution")) { ' .
384 ' document.getElementById("darkmode-caution").style.display="none";' .
385 ' } ' .
386 ' } ' .
387 ' if (select.value == "path") { ' .
388 ' document.getElementById("codoc_css_path").readOnly=false; ' .
389 ' if (!document.getElementById("codoc_css_path").value.match(/\//g)) {' .
390 ' document.getElementById("codoc_css_path").value=""; ' .
391 ' } ' .
392 ' } else { ' .
393 ' document.getElementById("codoc_css_path").readOnly=true; ' .
394 ' document.getElementById("codoc_css_path").value=select.value; ' .
395 ' } ' .
396 ' } ' .
397 '</script> ' ;
398
399 echo sprintf('<select name="theme_name" onChange="gen_css_path(this)" id="codoc_theme_select">');
400 foreach (["rainbow","blue","red","green","black","dark","rainbow-square","blue-square","red-square","green-square","black-square","dark-square"] as $theme) {
401 if ($theme == "rainbow") {
402 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "rainbow" ? "selected" : ""),esc_attr(__('Rainbow colors','codoc')));
403 }
404 if ($theme == "blue") {
405 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "blue" ? "selected" : ""),esc_attr(__('Blue','codoc')));
406 }
407 if ($theme == "red") {
408 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "red" ? "selected" : ""),esc_attr(__('Red','codoc')));
409 }
410 if ($theme == "green") {
411 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "green" ? "selected" : ""),esc_attr(__('Green','codoc')));
412 }
413 if ($theme == "black") {
414 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "black" ? "selected" : ""),esc_attr(__('Black','codoc')));
415 }
416 if ($theme == "dark") {
417 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "dark" ? "selected" : ""),esc_attr(__('Dark mode','codoc')));
418 }
419 if ($theme == "rainbow-square") {
420 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "rainbow-square" ? "selected" : ""),esc_attr(__("Rainbow Colors / Square design",'codoc')));
421 }
422 if ($theme == "blue-square") {
423 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "blue-square" ? "selected" : ""),esc_attr(__('Blue / Square design','codoc')));
424 }
425 if ($theme == "red-square") {
426 echo sprintf('<option value="%s" %s>%s/option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "red-square" ? "selected" : ""),esc_attr(__('Red / Square design','codoc')));
427 }
428 if ($theme == "green-square") {
429 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "green-square" ? "selected" : ""),esc_attr(__('Green / Square design','codoc')));
430 }
431 if ($theme == "black-square") {
432 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "black-square" ? "selected" : ""),esc_attr(__('Black / Square design','codoc')));
433 }
434 if ($theme == "dark-square") {
435 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "dark-square" ? "selected" : ""),esc_attr(__('Dark mode / Square design','codoc')));
436 }
437 }
438 echo sprintf('<option value="path" %s>%s</option>', esc_attr(preg_match("/\//",$CODOC_SETTINGS["css_path"]) ? "selected" : ""),esc_attr(__('Path Specification','codoc')));
439 echo '<script type="text/javascript">gen_css_path(document.getElementById(\'codoc_theme_select\'))</script>';
440 echo sprintf('</select></div>');
441 echo '<p id="darkmode-caution" style="display:none">' . esc_attr(__('Please note that the theme for dark mode has white text color, and depending on the background color, the text may not be visible.','codoc')). '</p>';
442 },
443 'codoc', //page
444 'setting_section_id' //Section
445 );
446 add_settings_field(
447 'paywall_text', // id
448 __('Texts in paywall','codoc'), // title
449 function() {
450 global $CODOC_SETTINGS;
451 global $CODOC_AUTHINFO;
452 echo '<div class="excerpt">' . esc_html(__('You can change, show and hide texts in your paywall.','codoc')) . '</div>';
453 echo '<table class="innerTable"><tbody>';
454 echo '<tr><th>' . esc_html(__('Display of likes','codoc')) . '</th><td>';
455 echo sprintf('<input type="radio" value="1" name="%s[show_like]" id="show_like_on" %s><label for="show_like_on">' . esc_html(__('Enable','codoc')) . '</label> ',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['show_like'] == '1' ? "checked" : ""));
456 echo sprintf('<input type="radio" value="0" name="%s[show_like]" id="show_like_off" %s><label for="show_like_off">' . esc_html(__('Disable','codoc')) . '</label> <br / >',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['show_like'] == '0' ? "checked" : ""));
457 echo '</td></tr>';
458
459 echo '<tr><th>' . esc_html(__('Display of PoweredBy','codoc')) . '</th><td>';
460 echo sprintf('<input type="hidden" value="1" name="%s[show_about_codoc]">',esc_attr(CODOC_SETTINGS_OPTION_NAME));
461 echo sprintf('<input type="hidden" value="1" name="%s[show_created_by]">',esc_attr(CODOC_SETTINGS_OPTION_NAME));
462 echo sprintf('<input type="hidden" value="1" name="%s[show_powered_by]">',esc_attr(CODOC_SETTINGS_OPTION_NAME));
463 if (isset($CODOC_AUTHINFO['account_is_pro']) and $CODOC_AUTHINFO['account_is_pro']) {
464 echo sprintf('<input type="radio" value="1" name="%s[show_copyright]" id="show_copyright_on" %s><label for="show_copyright_on">' . esc_html(__('Enable','codoc')) . '</label> ',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['show_copyright'] == '1' ? "checked" : ""));
465 echo sprintf('<input type="radio" value="0" name="%s[show_copyright]" id="show_copyright_off" %s><label for="show_copyright_off">' . esc_html(__('Disable','codoc')) . '</label> <br / >',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['show_copyright'] == '0' ? "checked" : ""));
466 } else {
467 echo esc_html(__('Only PRO accounts can be disabled.','codoc'));
468 }
469 echo '</td></tr>';
470
471 echo '<tr><th>' . esc_html(__('"Purchase Article" button text','codoc')) . '</th><td>';
472 echo sprintf('<input type="text" name="%s[entry_button_text]" value="%s">',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['entry_button_text']));
473 echo '</td></tr>';
474
475 echo '<tr><th>' . esc_html(__('"Purchase Subscription" button text.','codoc')) . '</th><td>';
476 echo sprintf('<input type="text" name="%s[subscription_button_text]" value="%s">',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['subscription_button_text']));
477 echo '</td></tr>';
478
479 echo '<tr><th>' . esc_html(__('Support button text','codoc')) . '</th><td>';
480 echo sprintf('<input type="text" name="%s[support_button_text]" value="%s">',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['support_button_text']));
481 echo '</td></tr>';
482
483 echo '<tr><th>' . esc_html(__('Text for "Articles Included in Subscription".','codoc')) . '</th><td>';
484 echo sprintf('<input type="text" name="%s[subscription_message]" value="%s">',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['subscription_message']));
485 echo '</td></tr>';
486
487 echo '<tr><th>' . esc_html(__('Text for support description','codoc')) . '</th><td>';
488 echo sprintf('<input type="text" name="%s[support_message]" value="%s">',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['support_message']));
489 echo '</td></tr>';
490
491 echo '</tbody></table>';
492 },
493 'codoc', //page
494 'setting_section_id' //Section
495 );
496
497 add_settings_field(
498 'codoc_tag_attributes', // id
499 __('Attributes for codoc tag','codoc'), // title
500 function() {
501 global $CODOC_SETTINGS;
502 echo '<div class="excerpt">' . esc_html(__('You can add specific attributes to codoc tags.','codoc')) . '</div>';
503 echo sprintf('<input type="text" name="%s[codoc_tag_attributes]" value="%s">',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['codoc_tag_attributes']));
504 },
505 'codoc', //page
506 'setting_section_id' //Section
507 );
508 add_settings_field(
509 'codoc_script_tag_attributes', // id
510 __('Attributes for codoc script tag','codoc'), // title
511 function() {
512 global $CODOC_SETTINGS;
513 echo '<div class="excerpt">' . esc_html(__('You can add specific attributes to codoc script tags.','codoc')) . '</div>';
514 echo sprintf('<input type="text" name="%s[codoc_script_tag_attributes]" value="%s">',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['codoc_script_tag_attributes']));
515 },
516 'codoc', //page
517 'setting_section_id' //Section
518 );
519 add_settings_field(
520 'str_replace_binded_url', // id
521 __('Permalink','codoc'), // title
522 function() {
523 global $CODOC_SETTINGS;
524 echo '<div class="excerpt">' . esc_html(__('You can replace the part of permalink registered on the codoc.','codoc')) . '</div>';
525 echo sprintf('<input type="text" name="%s[str_replace_binded_url_from]" value="%s">',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['str_replace_binded_url_from']));
526 echo ('<span class="suptext">→</span>');
527 echo sprintf('<input type="text" name="%s[str_replace_binded_url_to]" value="%s">',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['str_replace_binded_url_to']));
528
529 },
530 'codoc', //page
531 'setting_section_id' //Section
532 );
533
534 add_settings_field(
535 'str_around_codoc_tag', // id
536 __('HTML insertion','codoc'), // title
537 function() {
538 global $CODOC_SETTINGS;
539 echo '<div class="excerpt">' . esc_html(__('You can insert HTML before and after the codoc tag.','codoc')) . '</div>';
540 echo sprintf('<div class="inputRow"><p>%s</p><textarea name="%s[str_before_codoc_tag]" cols="40">%s</textarea></div>',esc_html(__('Before HTML','codoc')),esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_html($CODOC_SETTINGS['str_before_codoc_tag']));
541 echo sprintf('<div class="inputRow"><p>%s</p><textarea name="%s[str_after_codoc_tag]" cols="40">%s</textarea></div>',esc_html(__('After HTML','codoc')),esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_html($CODOC_SETTINGS['str_after_codoc_tag']));
542
543 },
544 'codoc', //page
545 'setting_section_id' //Section
546 );
547
548 add_settings_field(
549 'always_show_support_tag', // id
550 __('Automatic support insertion','codoc'), // title
551 function() {
552 global $CODOC_SETTINGS;
553 echo '<div class="excerpt">' . esc_html(__('It adds support functions to the post without inserting a codoc block.','codoc')) . '</div>';
554 echo '<table class="innerTable"><tbody>';
555 echo '<tr><th>' . esc_html(__('Automatic insertion','codoc')) . '</th><td>';
556 echo sprintf('<input type="radio" value="1" name="%s[always_show_support]" id="always_show_support_on" %s><label for="always_show_support_on">' . esc_html(__('Enable','codoc')) . '</label> ',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['always_show_support'] == '1' ? "checked" : ""));
557 echo sprintf('<input type="radio" value="0" name="%s[always_show_support]" id="always_show_support_off" %s><label for="always_show_support_off">' . esc_html(__('Disable','codoc')) . '</label> <br / >',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['always_show_support'] == '0' ? "checked" : ""));
558 echo '</td></tr>';
559 echo '<tr><th>'. esc_html(__('Position','codoc')) . '</th><td>';
560 echo sprintf('<input type="radio" value="top" name="%s[show_support_location]" id="show_support_location_top" %s><label for="show_support_location_top">' . esc_html(__('TOP','codoc')) . '</label> ',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['show_support_location'] == 'top' ? "checked" : ""));
561 echo sprintf('<input type="radio" value="bottom" name="%s[show_support_location]" id="show_support_location_bottom" %s><label for="show_support_location_bottom">' . esc_html(__('Bottom','codoc')) . '</label> <br / >',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['show_support_location'] == 'bottom' ? "checked" : ""));
562 echo '</td></tr>';
563 echo '<tr><th>' . esc_html(__('Description','codoc')) . '</th><td>';
564 echo sprintf('<input type="text" placeholder="' . esc_html(__('You can customize the description of the support.','codoc')) . '" size="50%%" name="%s[show_support_message]" value="%s">',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_html($CODOC_SETTINGS['show_support_message']));
565 echo '</td></tr>';
566 echo '<tr><th>' . esc_html(__('Category names','codoc')) . '</th><td>';
567 echo sprintf('<input placeholder="' . esc_html(__('Inserted into articles of categories, divided by &quot;|&quot;','codoc')) . '" type="text" size="50%%" name="%s[show_support_categories]" value="%s"><br />',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_html($CODOC_SETTINGS['show_support_categories']));
568 echo '</td></tr>';
569 echo '</tbody></table>';
570
571 },
572 'codoc', //page
573 'setting_section_id' //Section
574 );
575 add_settings_field(
576 'do_not_filter_the_content', // id
577 __('Disable plugin filter','codoc'), // title
578 function() {
579 global $CODOC_SETTINGS;
580 echo '<div class="excerpt">' . esc_html(__('You can disable filter processing that includes shortcodes from other plugins that interfere with the operation of codoc. Please use this only if codoc is not functioning properly.','codoc')) . '</div>';
581 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">' . esc_html(__('Enable','codoc')) .'</label> ',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['do_not_filter_the_content'] == '1' ? "checked" : ""));
582 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">' . esc_html(__('Disable','codoc')) . '</label> ',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['do_not_filter_the_content'] == '0' ? "checked" : ""));
583 },
584 'codoc', //page
585 'setting_section_id' //Section
586 );
587
588 add_settings_field(
589 'shortcode_evacuation', // id
590 __('Shortcode evacuation','codoc'), // title
591 function() {
592 global $CODOC_SETTINGS;
593 echo '<div class="excerpt">' . esc_html(__('The execution results of shortcodes written in the paid part are moved to the free part, and are used and displayed on the HTML during viewing of the paid part. Please use this if the shortcode does not work as expected in the paid part. Please note that the execution results of shortcodes in the paid part will be written in the source code.','codoc')). '</div>';
594 echo sprintf('<input type="radio" value="1" name="%s[shortcode_evacuation]" id="shortcode_evacuation_on" %s><label for="shortcode_evacuation_on">' . esc_html(__('Enable','codoc')) . '</label> ',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['shortcode_evacuation'] == '1' ? "checked" : ""));
595 echo sprintf('<input type="radio" value="0" name="%s[shortcode_evacuation]" id="shortcode_evacuation_off" %s><label for="shortcode_evacuation_off">' . esc_html(__('Disable','codoc')) . '</label> ',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['shortcode_evacuation'] == '0' ? "checked" : ""));
596 },
597 'codoc', //page
598 'setting_section_id' //Section
599 );
600
601 add_settings_field(
602 'debug_params', // id
603 __('Debug Parameters','codoc'), // title
604 function() {
605 global $CODOC_SETTINGS;
606 echo '<div class="excerpt">' . esc_html(__('You can specify parameters for debugging. Please use this only upon request from codoc support.','codoc')) . '</div>';
607 echo sprintf('<input placeholder="" type="text" size="50%%" name="%s[debug_params]" value="%s"><br />',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_html($CODOC_SETTINGS['debug_params']));
608 },
609 'codoc', //page
610 'setting_section_id' //Section
611 );
612
613 add_settings_field(
614 'block_defaults', // id
615 __('Block Default Values','codoc'), // title
616 function() {
617 global $CODOC_SETTINGS;
618 echo '<div class="excerpt">' . esc_html(__('You can specify default values for new codoc blocks in JSON format.','codoc')) . '</div>';
619 echo sprintf('<textarea placeholder=\'{"showPrice":false,"price":300}\' rows="3" cols="50" name="%s[block_defaults]">%s</textarea>',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_html($CODOC_SETTINGS['block_defaults']));
620 echo '<p class="description">'
621 . 'showPrice (bool: true), '
622 . 'price (int: 500), '
623 . 'limited (bool: false), '
624 . 'limitedCount (int: 10), '
625 . 'affiliateMode (bool: false), '
626 . 'affiliateRate (string: "0.0500"), '
627 . 'showSupport (bool: false), '
628 . 'showPaywalledSupport (bool: false), '
629 . 'statusLimited (bool: false), '
630 . 'subscriptions (object: {})'
631 . '</p>';
632 },
633 'codoc', //page
634 'setting_section_id' //Section
635 );
636
637 add_settings_field(
638 'cretor_info', // id
639 __('Creator\'s Information','codoc'), // title
640 function() {
641 global $CODOC_SETTINGS;
642 global $CODOC_AUTHINFO;
643 echo sprintf('<p><font id="codoc-update-creator-info-message"></font></p>',"");
644 // 変更を保存時に常に同期するのでこの表示は�
645 要ないがUI上保持しておく
646 $script = "document.getElementById('codoc-update-creator-info-message').innerText='" . __("Please save changes to update the information.","codoc") . "';document.getElementById('codoc-update-creator-info-message').color='red';";
647 if (isset($CODOC_AUTHINFO['profile_image_url'])) {
648 echo sprintf('<img src="%s" width="40" height="40" />',esc_attr($CODOC_AUTHINFO['profile_image_url']));
649 }
650 echo sprintf('<p>%s %s %s</p>',esc_html($CODOC_AUTHINFO['name']),esc_html((isset($CODOC_AUTHINFO['account_is_pro']) and $CODOC_AUTHINFO['account_is_pro']) ? ' [PRO]' : ''),esc_html(isset($CODOC_AUTHINFO['country']) ? $CODOC_AUTHINFO['country'] : '' ));
651 if ($connect_code = $CODOC_SETTINGS['codoc_connect_code']) {
652 // Translators: %s is the integration code, and %s is additional information based on the registration mode.
653 echo sprintf('<p>' . esc_html(__('Extensions integration completed (Extensions code: %1$s) %2$s','codoc')) . '</p>',
654 esc_html($connect_code),
655 esc_html($CODOC_SETTINGS['codoc_connect_registration_mode'] == 'dedicated' ? __('Set the audience as a private account.','codoc') : ''));
656 }
657 echo sprintf('<p><a href="javascript:void(0);" onClick="' . esc_attr($script) . '">' . esc_html(__('Update creator\'s Information','codoc')) . '</a></p>');
658 echo ('<p>' . esc_html(__('Please update each time if you change the logo or cover image on the codoc side.','codoc')) . '</p>');
659 },
660 'codoc', //page
661 'setting_section_id' //Section
662 );
663
664 register_setting(
665 'codoc_option_group', // option group
666 CODOC_USERCODE_OPTION_NAME
667 );
668 register_setting(
669 'codoc_option_group', // option group
670 CODOC_TOKEN_OPTION_NAME
671 );
672
673 if (isset($_GET['codoc_auth_finished']) and $_GET['codoc_auth_finished']) {
674 add_settings_error( 'general', 'settings_updated', esc_html(__( 'codoc authentication has been completed.' ,'codoc'), 'success' ));
675 }
676
677 add_settings_field(
678 'codoc_auth',
679 __('Authentication','codoc'),
680 function() {
681 global $CODOC_USERCODE;
682 global $CODOC_TOKEN;
683 global $CODOC_AUTHINFO;
684 $script = "javascript:document.getElementById('codoc-usercode').value='-';document.getElementById('codoc-token').value='-';document.getElementById('codoc-auth-message').innerText='" . __('Please save changes to complete the unbinding.','codoc') . "';document.getElementById('codoc-auth-message').color='red';";
685
686 // Translators: %s is the email address.
687 echo sprintf('<p><font color="green" id="codoc-auth-message">' . esc_html(__('Authorized as %s','codoc')) . '</font></p>',esc_attr($CODOC_AUTHINFO['email']));
688
689 echo sprintf('<input id="codoc-usercode" type="hidden" name="%s" value="%s">',esc_attr(CODOC_USERCODE_OPTION_NAME),esc_attr($CODOC_USERCODE));
690 echo sprintf('<input id="codoc-token" type="hidden" name="%s" value="%s">',esc_attr(CODOC_TOKEN_OPTION_NAME),esc_attr($CODOC_TOKEN));
691 echo sprintf('<p><a href="javascript:void(0);" onClick="' . esc_attr($script) . '">' . esc_html(__('Unbind authorization','codoc')) . '</p>');
692 },
693 'codoc',
694 'setting_section_id'
695 );
696
697 }
698
699 // ない場合
700 if (!$CODOC_AUTHINFO and !isset($_GET['auth_by_myself'])) {
701 add_settings_field(
702 'codoc_auth',
703 __('Authentication','codoc'),
704 function() {
705 $theme = wp_get_theme();
706 $from = 'wp';
707 if ($theme->get('Name') === 'codoc') {
708 $from = 'wp_codoc';
709 }
710 //$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
711 $current_url = admin_url('options-general.php') . '?page=codoc';
712 $direct_url = sprintf("location.href='%s&auth_by_myself=1'",$current_url);
713 $login_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/me/token?from=' . $from . '&return_url=' . urlencode($current_url));
714 $register_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/register?from=' . $from . '&return_url=' . urlencode($current_url));
715 // submitを消しておく
716 echo ('<script type="text/javascript">window.onload=function(){document.getElementById(\'submit\').style.display = \'none\'}</script>');
717 if (isset($_GET['confirm_token'])) {
718 $confirm_url = sprintf("location.href='%s&_wpnonce=%s&fetch_token_key=%s&usercode=%s'",$current_url,
719 wp_create_nonce('fetch_token_nonce'),
720 esc_attr($_GET['fetch_token_key']),
721 esc_attr($_GET['usercode']));
722 echo (esc_html(__('The authentication information has been obtained. Please click the confirmation button to complete the setup.','codoc')) . '<br />');
723 echo sprintf('<input type="button" class="button button-primary" value="%s" onClick="%s"> ',esc_html(__('Confirm authentication','codoc')),esc_attr($confirm_url));
724 } else {
725
726 echo (esc_html(__('Authentication is required to use codoc on WordPress.','codoc')) . '<br />');
727 echo (esc_html(__('You can authenticate by directly entering the user code and API token, or by logging in and registering with codoc.','codoc')) . '<br /><br />');
728 echo sprintf('<input type="button" class="button button-primary" value="%s" onClick="%s"> ',esc_attr(__('Authenticate by direct input','codoc')),esc_attr($direct_url));
729 echo sprintf('<input type="button" class="button button-primary" value="%s" onClick="%s"> <input type="button" class="button button-primary" value="%s" onClick="%s"><br /><br />',esc_attr(__('Login and authenticate','codoc')),esc_attr($login_url),esc_attr(__('Register and authenticate','codoc')),esc_attr($register_url));
730 }
731 if (!$this->util->health_check()) {
732 echo sprintf('<p style="color: red;">Cannot communicate with the codoc server. Please allow communication to https://codoc.jp in your firewall settings on the server or WordPress side.</p>');
733 }
734
735 },
736 'codoc',
737 'setting_section_id'
738 );
739 }
740 // ない場合かつ自分で認証する場合
741 if (!$CODOC_AUTHINFO and (
742 (isset($_GET['auth_by_myself']) and $_GET['auth_by_myself']) or
743 (isset($_POST['auth_by_myself']) and $_POST['auth_by_myself'])
744 )) {
745 register_setting(
746 'codoc_option_group', // option group
747 CODOC_USERCODE_OPTION_NAME
748 );
749 register_setting(
750 'codoc_option_group', // option group
751 CODOC_TOKEN_OPTION_NAME
752 );
753 add_settings_field(
754 'codoc_usercode',
755 'ユーザーコード',
756 function() {
757 global $CODOC_USERCODE;
758 echo '<input type="hidden" name="auth_by_myself" value="1">';
759 echo sprintf('<input type="text" name="%s" value="%s">',esc_attr(CODOC_USERCODE_OPTION_NAME),esc_attr($CODOC_USERCODE));
760 },
761 'codoc',
762 'setting_section_id'
763 );
764 add_settings_field(
765 'codoc_token',
766 'APIトークン',
767 function() {
768 global $CODOC_TOKEN;
769 echo sprintf('<input type="text" name="%s" value="%s">',esc_attr(CODOC_TOKEN_OPTION_NAME),esc_attr($CODOC_TOKEN));
770 },
771 'codoc',
772 'setting_section_id'
773 );
774 }
775
776 // 認証�
777 報を保存
778 add_action( 'update_option_' . CODOC_USERCODE_OPTION_NAME, function( $old_value, $new_value ) {
779 global $CODOC_RE_AUTHORIZE;
780 $CODOC_RE_AUTHORIZE = 1;
781 },9,2); // $hook, $function_to_add, $priority, $accepted_args
782 add_action( 'update_option_' . CODOC_TOKEN_OPTION_NAME, function( $old_value, $new_value ) {
783 global $CODOC_RE_AUTHORIZE;
784 $CODOC_RE_AUTHORIZE = 1;
785 },10,2);
786
787 add_action('update_option_' . CODOC_SETTINGS_OPTION_NAME,function(){
788 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
789 if (isset($CODOC_SETTINGS['always_show_support']) and $CODOC_SETTINGS['always_show_support']) {
790 $data = $this->util->get_support_entry([],[
791 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
792 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
793 ]);
794 if ($data and $data->status and $entry = $data->entry) {
795 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,$entry->code);
796 } else {
797 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
798 }
799 } elseif(isset($CODOC_SETTINGS['always_show_support']) and !$CODOC_SETTINGS['always_show_support']) {
800 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
801 }
802 });
803
804 add_action('updated_option',function(){
805 global $CODOC_RE_AUTHORIZE;
806 if ($CODOC_RE_AUTHORIZE) {
807 //$data = $this->callAPI('GET','');
808 $data = $this->util->get_user_info([],[
809 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
810 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
811 ]);
812 if ($data->status and $user = $data->user) {
813 $this->update_codoc_authinfo($user);
814 } else {
815 update_option(CODOC_AUTHINFO_OPTION_NAME,'');
816 }
817 }
818 });
819
820 });
821 // プラグイン一覧に設定のリンクをいれる
822 add_filter( 'plugin_action_links_' . plugin_basename( plugin_dir_path( __FILE__ ) . 'codoc' . '.php' ),
823 function( $links ) {
824 $setting_link = sprintf( '<a href="%s">%s</a>', esc_url( add_query_arg( 'page', 'codoc', admin_url( 'options-general.php' ) ) ), esc_html( __('Settings') ) );
825 array_unshift( $links, $setting_link );
826
827 return $links;
828 }
829 );
830
831 }
832 public function add_mce() {
833 add_action( 'admin_enqueue_scripts', function() {
834 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
835 return;
836 }
837 $current_screen = get_current_screen();
838 if ( ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) || ( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) ) {
839 // Gutenberg Editor
840 // なにもしない
841 } else {
842 // tinymce
843 if ( get_user_option( 'rich_editing' ) == 'true' ) {
844 // プラグイン�
845 で使うCSRF を生成
846 $path = plugins_url( 'codoc/src_mce/codoc-editor-onload.js', __DIR__ );
847 wp_enqueue_script( 'codoc-editor-onload', $path, array('jquery'), '', true );
848 // I just want to insert this global variables but i don't know how i can do it..
849 $auth_info = get_option(CODOC_AUTHINFO_OPTION_NAME);
850 $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME);
851 $block_defaults_raw = isset($codoc_settings['block_defaults']) ? $codoc_settings['block_defaults'] : '';
852 $block_defaults_decoded = json_decode($block_defaults_raw, true);
853 $block_defaults = is_array($block_defaults_decoded) ? $block_defaults_decoded : new stdClass();
854 wp_localize_script(
855 'codoc-editor-onload',
856 'CODOCEDITOR',
857 array(
858 'action' => 'codoc_shortcodes',
859 'nonce' => wp_create_nonce( 'codoc_shortcodes' ),
860
861 'codoc_url' => $this->get_codoc_url(),
862 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
863 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
864 'codoc_sdk_path' => CODOC_SDK_PATH,
865 'codoc_account_is_pro' => isset($auth_info['account_is_pro']) ? $auth_info['account_is_pro'] : 0,
866 'codoc_currency_code' => isset($auth_info['currency_code']) ? $auth_info['currency_code'] : 0,
867 'codoc_currency_decimal_places' => isset($auth_info['currency_decimal_places']) ? $auth_info['currency_decimal_places'] : 0,
868 'codoc_block_defaults' => $block_defaults,
869 )
870 );
871
872 // ここでtinymceのプラグイン追加
873 //wp_enqueue_style( 'codoc-admin-style', plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
874 //add_editor_style( plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
875 wp_enqueue_style( 'codoc-admin-style', $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.css?c=' . date('Ymd') );
876 add_editor_style( $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.css' );
877
878 add_filter( 'mce_external_plugins', function( $plugin_array ) {
879 //$plugin_array['codoc'] = plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ );
880 $plugin_array['codoc'] = $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.js?c=' . date('Ymd');
881 return $plugin_array;
882 } );
883 add_filter( 'mce_buttons', function( $buttons ) {
884 array_push( $buttons, "|", "codoc" );
885 return $buttons;
886 } );
887 // 非SSL環境の場合、なぜかhttps -> httpsになってしまうので対策
888 // コメントタグが除去されることがあるらしいのでvalid_elementsに�
889 要なタグを追加 (EXPERIMENTAL)
890 add_filter( 'tiny_mce_before_init', function($settings) {
891 $settings['external_plugins'] = preg_replace('/"codoc":"http:/','"codoc":"https:',$settings['external_plugins']);
892 foreach (['valid_elements','extended_valid_elements'] as $valid_elements) {
893 if (isset($settings[$valid_elements])) {
894 $settings[$valid_elements] = $settings[$valid_elements] . ',div[*],p[*],img[*],--[*]';
895 }
896 }
897 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
898 if (isset($CODOC_SETTINGS["debug_params"])) {
899 $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
900 if (isset($params_decoded["mce_valid_elements"])) {
901 $settings['valid_elements'] = $params_decoded["mce_valid_elements"];
902 $settings['extended_valid_elements'] = $params_decoded["mce_valid_elements"];
903 }
904 }
905
906 return $settings;
907 },1000000);
908 }
909 }
910 } );
911 }
912 function update_codoc_authinfo($user) {
913 global $CODOC_SETTINGS;
914 global $CODOC_AUTHINFO;
915 if (property_exists($user,'connect_code') and $user->connect_code) {
916 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
917 $CODOC_SETTINGS['codoc_connect_code'] = $user->connect_code;
918 $CODOC_SETTINGS['codoc_connect_registration_mode'] = $user->connect_has_permission_dedicated_account ? 'dedicated' : '';
919 update_option(CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS);
920 }
921 return update_option(CODOC_AUTHINFO_OPTION_NAME,[
922 'email' => $user->email,
923 'name' => $user->name,
924 'profile_image_url' => $user->profile_image_url,
925 'cover_image_url' => $user->cover_image_url,
926 'connect_code' => property_exists($user,'connect_code') ? $user->connect_code : '',
927 'connect_image_url' => property_exists($user,'connect_image_url') ? $user->connect_image_url : '',
928 'account_is_pro' => property_exists($user,'account_is_pro') ? $user->account_is_pro : '',
929 'created_at' => property_exists($user,'created_at') ? $user->created_at : 0,
930 'country' => property_exists($user,'country') ? $user->country : '',
931 'currency_code' => property_exists($user,'currency_code') ? $user->currency_code : '',
932 'currency_decimal_places' => property_exists($user,'currency_decimal_places') ? $user->currency_decimal_places : '',
933 ]);
934 $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
935 return $CODOC_AUTHINFO;
936 }
937 // 保存用コンテンツにフィルターを実施する
938 public function get_filtered_content($post_emulated) {
939 // 記事ページであることをエミュレートしてフィルター実行
940 $post_backuped = null;
941 if (isset($GLOBALS['post'])) {
942 $post_backuped = $GLOBALS['post'];
943 }
944 $GLOBALS['post'] = $post_emulated;
945
946 $wp_query_backuped = null;
947 if (isset($GLOBALS['wp_query'])) {
948 $wp_query_backuped = $GLOBALS['wp_query'];
949 $wp_query = $GLOBALS['wp_query'];
950 $wp_query->is_single = true;
951 $wp_query->is_singular = true;
952 # in_the_loop は記事ページでは通常有効っぽいので true指定 ex: wp_ulike
953 $wp_query->in_the_loop = true;
954 # これも追加しておく
955 $wp_query->is_main_query = true;
956
957 $wp_query->post = $post_emulated;
958 $wp_query->queried_object = $post_emulated;
959 $wp_query->queried_object_id = $post_emulated->ID;
960
961 $GLOBALS['wp_query'] = $wp_query;
962 }
963 // $this->the_content でオリジナルを返してもらうため
964 $this->do_not_filter_the_content = true;
965 $content = preg_replace(
966 '/ (\/)?wp:codoc\/codoc-block /',' \\1wptmp:codoc/codoc-block ',
967 $post_emulated->post_content
968 );
969 // post_metaに�
970 容を保存し、無料パートにショートコードの退避をおこなう
971 $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME);
972 if (isset($codoc_settings['shortcode_evacuation']) and $codoc_settings['shortcode_evacuation']) {
973 $splited = preg_split('/\/wptmp:codoc\/codoc-block/s',$content);
974 if (isset($splited[0]) and isset($splited[1])) {
975 // すべてのショートコードを $match_all にいれる
976 preg_match_all('/\[[^\[\]]+?\](.+\[\/[^\[\]]+?\])?/',$splited[1],$match_all);
977 // ショートコードをURLエンコードしてdivタグの中にいれておく(後でmetaの中のショートコードと付け合せ)
978 $replaced = preg_replace_callback('/\[[^\[\]]+?\](.+\[\/[^\[\]]+?\])?/',function($matches) {
979 return sprintf ('<div class="codoc-evacuation-dests" data-shortcode="%s"></div>', urlencode($matches[0]));
980 },$splited[1]);
981 // 0番目に�
982 �列で�
983 �っているのでそこを退避対象の�
984 �列とする
985 $evacuations = $match_all[0];
986 // ショートコードの中身をタグに退避
987 $content = $splited[0] . '/wptmp:codoc/codoc-block' . $replaced;
988 // 無料パートでショートコードを実行できるようにする
989 update_post_meta($post_emulated->ID,'codoc_shortcode_evacuations',join('**codoc**',$evacuations));
990 } else {
991 update_post_meta($post_emulated->id,'codoc_shortcode_evacuations',"");
992 }
993 }
994 #$content = do_shortcode( $content );
995 $content_filtered = apply_filters( 'the_content', $content);
996 $this->do_not_filter_the_content = false;
997
998 $GLOBALS['post'] = $post_backuped;
999
1000 if ($wp_query_backuped) {
1001 $GLOBALS['wp_query'] = $wp_query_backuped;
1002 }
1003
1004 $content_filtered = preg_replace(
1005 '/ (\/)?wptmp:codoc\/codoc-block /',' \\1wp:codoc/codoc-block ',
1006 $content_filtered
1007 );
1008 return $content_filtered;
1009 }
1010
1011 public function save_post($post_ID,$post,$update) {
1012 if (preg_match('/^(auto-draft|inherit)$/',$post->post_status)) {
1013 return;
1014 }
1015 $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
1016 $postId = get_post_meta($post_ID,'codoc_saved_post_id',true);
1017 // 保存されているIDと違う場合は破棄(duplicate pageなどでmeta�
1018 報をコピーされた可能性がある)
1019 if ($postId and $postId != $post_ID) {
1020 $entryCode = '';
1021 }
1022 $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME);
1023 $post_content = (isset($codoc_settings['do_not_filter_the_content']) and $codoc_settings['do_not_filter_the_content']) ?
1024 $post->post_content : $this->get_filtered_content($post);
1025 $res = $this->util->sync_entry([
1026 "post_title" => $post->post_title,
1027 "post_content" => $post_content,
1028 // password が設定されてる場合は限定�
1029 �開にする
1030 "post_status" => $post->post_status == 'publish' ? ($post->post_password ? 2 : 1) : 0,
1031 "post_permalink" => get_permalink($post_ID),
1032 "codoc_entry_code" => $entryCode,
1033 "codoc_settings" => $codoc_settings,
1034 ],[
1035 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
1036 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
1037 ]);
1038 $prudent_update_post_meta_entry_code = null;
1039 if (isset($codoc_settings["debug_params"])) {
1040 $params_decoded = json_decode($codoc_settings["debug_params"],true);
1041 if (isset($params_decoded["prudent_update_post_meta_entry_code"])) {
1042 $prudent_update_post_meta_entry_code = $params_decoded["prudent_update_post_meta_entry_code"];
1043 }
1044 }
1045 if ($prudent_update_post_meta_entry_code == 2) {
1046 error_log('CODOC:: ' . sprintf ("%s : %s : %s : %s", $post_ID, (is_object($res) ? "1" : 0),$res->status,$entryCode));
1047 }
1048 if (is_object($res) and $res->status and !$entryCode) {
1049 // 20230222 https://stackoverflow.com/questions/26640785/update-post-meta-not-work-only-when-save-data-not-for-update
1050 if ($prudent_update_post_meta_entry_code) {
1051 add_post_meta($post_ID,'codoc_entry_code',$res->entry->code);
1052 add_post_meta($post_ID,'codoc_saved_post_id',$post_ID);
1053 } else {
1054 update_post_meta($post_ID,'codoc_entry_code',$res->entry->code);
1055 update_post_meta($post_ID,'codoc_saved_post_id',$post_ID);
1056 }
1057 }
1058 return true;
1059 }
1060 function updated_post_meta( $meta_ID, $post_ID, $meta_key ) {
1061 // スルーされてる場合は他のメタ�
1062 報更新のタイミングにサムネイルをアップロード
1063 $has_to_resend = get_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',true);
1064 if ($has_to_resend != 1 and $meta_key != '_thumbnail_id') {
1065 return;
1066 }
1067 if ( has_post_thumbnail($post_ID) ) {
1068 // 新規投稿の場合、タイミングによってはcodocEntryCodeが取得できないので一旦スルーする
1069 if (!get_post_meta($post_ID,'codoc_entry_code',true)) {
1070 update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',1);
1071 return;
1072 } else {
1073 update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',0);
1074 }
1075 $attachment = wp_get_attachment_metadata( get_post_thumbnail_id($post_ID));
1076 $upload_dir = wp_upload_dir();
1077 $file_path = sprintf ('%s/%s',$upload_dir['basedir'],$attachment['file']);
1078
1079 return $this->util->post_thumbnail([
1080 "file_path" => $file_path,
1081 "boundary" => wp_generate_password(24),
1082 "codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true),
1083 ],[
1084 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
1085 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
1086 ]);
1087 }
1088 }
1089 function deleted_post_meta( $meta_ids, $post_ID, $meta_key,$meta_value ) {
1090 if ($meta_key != '_thumbnail_id') {
1091 return;
1092 }
1093 return $this->util->reset_thumbnail(
1094 ["codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true)],
1095 [
1096 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
1097 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
1098 ]
1099 );
1100 }
1101 // 退避されてるかどうかをmetaを使って確認し、無料エリアの一番最後にショートコードを追加
1102 function the_content_shortcode_evacuations( $post_content ) {
1103 if ($this->do_not_filter_the_content) {
1104 return $post_content;
1105 }
1106 $post = get_post();
1107 if (!$post) {
1108 return $post_content;
1109 }
1110 $evacuations_meta = get_post_meta($post->ID,'codoc_shortcode_evacuations',true);
1111 $evacuations = preg_split('/\*\*codoc\*\*/',$evacuations_meta);
1112 foreach ($evacuations as $evacuation) {
1113 $post_content = sprintf('<div class="codoc-evacuations" style="display:none;" data-shortcode="%s">%s</div>',
1114 urlencode($evacuation),$evacuation) . $post_content;
1115 }
1116 return $post_content;
1117 }
1118 function the_content( $post_content ) {
1119 if ( is_single() && in_the_loop() && is_main_query() ) {
1120 }
1121 // get_filtered_content から do_not_filter_the_contentを有効にされるパターン
1122 // オプションの設定値の意味合い(他のフィルタを無視)とは違うため注意
1123 if ($this->do_not_filter_the_content) {
1124 return $post_content;
1125 }
1126 $post = get_post();
1127 // 20211215 null になる場合がある
1128 if (!$post) {
1129 return $post_content;
1130 }
1131 # is_amp で実�
1132 しているテンプレート用
1133 $is_amp_endpoint = (function_exists('is_amp_endpoint') && is_amp_endpoint()) ? true :
1134 ((function_exists('is_amp') && is_amp()) ? true : false);
1135 return $this->util->filter_content([
1136 "post_content" => $post_content,
1137 "preview" => is_preview(),
1138 "codoc_entry_code" => get_post_meta($post->ID,'codoc_entry_code',true),
1139 "codoc_settings" => get_option(CODOC_SETTINGS_OPTION_NAME),
1140 "is_amp_endpoint" => $is_amp_endpoint,
1141 "post_permalink" => get_permalink($post->ID),
1142 "codoc_support_entry_code" => get_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME),
1143 ]);
1144 }
1145
1146 function excerpt_allowed_blocks ($allowed_blocks) {
1147 if (is_array($allowed_blocks)) {
1148 array_push($allowed_blocks,'codoc/codoc-block');
1149 }
1150 return $allowed_blocks;
1151 }
1152
1153 function allowed_block_types_all ($allowed_block_types, $block_editor_context) {
1154 // テーマ等がブロックを制限していない場合(true = �
1155 �ブロック許可)はそのまま返す
1156 if ($allowed_block_types === true) {
1157 return $allowed_block_types;
1158 }
1159 // �
1160 �列で制限されている場合、codoc ブロックを追加
1161 if (is_array($allowed_block_types) && !in_array('codoc/codoc-block', $allowed_block_types)) {
1162 $allowed_block_types[] = 'codoc/codoc-block';
1163 }
1164 return $allowed_block_types;
1165 }
1166
1167 function show_tadv_notice() {
1168 // API からの notification を表示
1169 $api_notifications = get_transient('codoc_api_notification');
1170 if ($api_notifications && is_array($api_notifications)) {
1171 // notification �
1172 �列のキーと値を表示
1173 foreach ($api_notifications as $key => $value) {
1174 // 値が�
1175 �列やオブジェクトの場合は json_encode で文字列化
1176 if (is_array($value) || is_object($value)) {
1177 $value = json_encode($value, JSON_UNESCAPED_UNICODE);
1178 }
1179 echo "<div class=\"notice notice-warning is-dismissible codoc-notification\"><p>" . esc_html($value) . "</p></div>";
1180 }
1181 //delete_transient('codoc_api_notification');
1182 }
1183
1184 $name = 'Advanced Editor Tools';
1185 $name_escaped = preg_replace('/ /','+',$name);
1186 $install_url = network_admin_url( "plugin-install.php?tab=search&s=" . $name );
1187 $options_url = network_admin_url( "options-general.php?page=tinymce-advanced" );
1188
1189 //<a href=\"%s\">%s</a> を有効にし、設定画面にて &quot;Keep paragraph tags in the Classic block and the Classic Editor&quot; を有効にしてください。
1190 //<a href=\"%s\">%s</a> の設定画面にて &quot;Keep paragraph tags in the Classic block and the Classic Editor&quot; を有効にしてください。
1191 // Translators: %s is a link to the installation page with the plugin name.
1192 $tadv_message_for_install = sprintf(__("Please enable %s and enable &quot;Keep paragraph tags in the Classic block and the Classic Editor&quot; on the settings screen.","codoc"),sprintf("<a href=\"%s\">%s</a>",$install_url,$name));
1193 // Translators: %s is a link to the options settings page with the plugin name.
1194 $tadv_message_for_options = sprintf(__("Please enable &quot;Keep paragraph tags in the Classic block and the Classic Editor&quot; on the %s settings screen.","codoc"),sprintf("<a href=\"%s\">%s</a>",$options_url,$name));
1195 // クラシックエディタで advanced editor tools を�
1196 �れてない場合は notice
1197 if (is_plugin_active('classic-editor/classic-editor.php') and
1198 !is_plugin_active('tinymce-advanced/tinymce-advanced.php')) {
1199 echo "<div class=\"notice notice-warning is-dismissible\"><p>" . esc_html($tadv_message_for_install) . "</p></div>";
1200 }
1201
1202 // advanced editor tools の設定を調査
1203 $no_autop = false;
1204 $tadv_admin_settings = get_option( 'tadv_admin_settings', false );
1205 if (isset($tadv_admin_settings['options']) and preg_match('/no_autop/',$tadv_admin_settings['options'])) {
1206 $no_autop = true;
1207 }
1208 // advanced editor tools が有効で no_autop (Keep paragraph tags in the Classic block and the Classic Editor) が無効
1209 if (is_plugin_active('tinymce-advanced/tinymce-advanced.php') and !$no_autop) {
1210 echo "<div class=\"notice notice-warning is-dismissible\"><p>" . esc_html($tadv_message_for_options) . "</p></div>";
1211 }
1212 }
1213 }
1214