PluginProbe
codoc / 0.9.58
codoc v0.9.58
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.58, at class-codoc.php

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