PluginProbe
codoc / 0.9.57
codoc v0.9.57
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.57, at class-codoc.php

1,155 lines 70.9 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 add_settings_section(
328 'setting_section_id', // id
329 __('codoc Settings','codoc'), // title
330 [$this,'show_tadv_notice'],
331 'codoc' // page
332 );
333
334 // 認証がある場合
335 if ($CODOC_AUTHINFO) {
336 // クリエイター�
337 報だけ更新 (POST時に同期をとる)
338 if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['settings-updated'])) {
339 $data = $this->util->get_user_info([],[
340 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
341 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
342 ]);
343 if ($data->status and $user = $data->user) {
344 $this->update_codoc_authinfo($user);
345 // 一度get_optionしてるのでリロードする
346 $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
347 }
348 }
349
350 register_setting(
351 'codoc_option_group', // option group
352 CODOC_SETTINGS_OPTION_NAME // option name(DB)
353 );
354 add_settings_field(
355 'css_path', // id
356 __('Theme','codoc'), // title
357 function() {
358 global $CODOC_SETTINGS;
359 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>';
360 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']));
361 echo '' .
362 '<script type="text/javascript"> ' .
363 ' function gen_css_path(select) { ' .
364 ' if (select.value == "dark" || select.value == "dark-square") { ' .
365 ' document.getElementById("darkmode-caution").style.display="block";' .
366 ' } else { ' .
367 ' if (document.getElementById("darkmode-caution")) { ' .
368 ' document.getElementById("darkmode-caution").style.display="none";' .
369 ' } ' .
370 ' } ' .
371 ' if (select.value == "path") { ' .
372 ' document.getElementById("codoc_css_path").readOnly=false; ' .
373 ' if (!document.getElementById("codoc_css_path").value.match(/\//g)) {' .
374 ' document.getElementById("codoc_css_path").value=""; ' .
375 ' } ' .
376 ' } else { ' .
377 ' document.getElementById("codoc_css_path").readOnly=true; ' .
378 ' document.getElementById("codoc_css_path").value=select.value; ' .
379 ' } ' .
380 ' } ' .
381 '</script> ' ;
382
383 echo sprintf('<select name="theme_name" onChange="gen_css_path(this)" id="codoc_theme_select">');
384 foreach (["rainbow","blue","red","green","black","dark","rainbow-square","blue-square","red-square","green-square","black-square","dark-square"] as $theme) {
385 if ($theme == "rainbow") {
386 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "rainbow" ? "selected" : ""),esc_attr(__('Rainbow colors','codoc')));
387 }
388 if ($theme == "blue") {
389 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "blue" ? "selected" : ""),esc_attr(__('Blue','codoc')));
390 }
391 if ($theme == "red") {
392 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "red" ? "selected" : ""),esc_attr(__('Red','codoc')));
393 }
394 if ($theme == "green") {
395 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "green" ? "selected" : ""),esc_attr(__('Green','codoc')));
396 }
397 if ($theme == "black") {
398 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "black" ? "selected" : ""),esc_attr(__('Black','codoc')));
399 }
400 if ($theme == "dark") {
401 echo sprintf('<option value="%s" %s>%s</option>', esc_attr($theme), esc_attr($CODOC_SETTINGS["css_path"] == "dark" ? "selected" : ""),esc_attr(__('Dark mode','codoc')));
402 }
403 if ($theme == "rainbow-square") {
404 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')));
405 }
406 if ($theme == "blue-square") {
407 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')));
408 }
409 if ($theme == "red-square") {
410 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')));
411 }
412 if ($theme == "green-square") {
413 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')));
414 }
415 if ($theme == "black-square") {
416 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')));
417 }
418 if ($theme == "dark-square") {
419 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')));
420 }
421 }
422 echo sprintf('<option value="path" %s>%s</option>', esc_attr(preg_match("/\//",$CODOC_SETTINGS["css_path"]) ? "selected" : ""),esc_attr(__('Path Specification','codoc')));
423 echo '<script type="text/javascript">gen_css_path(document.getElementById(\'codoc_theme_select\'))</script>';
424 echo sprintf('</select></div>');
425 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>';
426 },
427 'codoc', //page
428 'setting_section_id' //Section
429 );
430 add_settings_field(
431 'paywall_text', // id
432 __('Texts in paywall','codoc'), // title
433 function() {
434 global $CODOC_SETTINGS;
435 global $CODOC_AUTHINFO;
436 echo '<div class="excerpt">' . esc_html(__('You can change, show and hide texts in your paywall.','codoc')) . '</div>';
437 echo '<table class="innerTable"><tbody>';
438 echo '<tr><th>' . esc_html(__('Display of likes','codoc')) . '</th><td>';
439 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" : ""));
440 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" : ""));
441 echo '</td></tr>';
442
443 echo '<tr><th>' . esc_html(__('Display of PoweredBy','codoc')) . '</th><td>';
444 echo sprintf('<input type="hidden" value="1" name="%s[show_about_codoc]">',esc_attr(CODOC_SETTINGS_OPTION_NAME));
445 echo sprintf('<input type="hidden" value="1" name="%s[show_created_by]">',esc_attr(CODOC_SETTINGS_OPTION_NAME));
446 echo sprintf('<input type="hidden" value="1" name="%s[show_powered_by]">',esc_attr(CODOC_SETTINGS_OPTION_NAME));
447 if (isset($CODOC_AUTHINFO['account_is_pro']) and $CODOC_AUTHINFO['account_is_pro']) {
448 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" : ""));
449 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" : ""));
450 } else {
451 echo esc_html(__('Only PRO accounts can be disabled.','codoc'));
452 }
453 echo '</td></tr>';
454
455 echo '<tr><th>' . esc_html(__('"Purchase Article" button text','codoc')) . '</th><td>';
456 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']));
457 echo '</td></tr>';
458
459 echo '<tr><th>' . esc_html(__('"Purchase Subscription" button text.','codoc')) . '</th><td>';
460 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']));
461 echo '</td></tr>';
462
463 echo '<tr><th>' . esc_html(__('Support button text','codoc')) . '</th><td>';
464 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']));
465 echo '</td></tr>';
466
467 echo '<tr><th>' . esc_html(__('Text for "Articles Included in Subscription".','codoc')) . '</th><td>';
468 echo sprintf('<input type="text" name="%s[subscription_message]" value="%s">',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['subscription_message']));
469 echo '</td></tr>';
470
471 echo '<tr><th>' . esc_html(__('Text for support description','codoc')) . '</th><td>';
472 echo sprintf('<input type="text" name="%s[support_message]" value="%s">',esc_attr(CODOC_SETTINGS_OPTION_NAME),esc_attr($CODOC_SETTINGS['support_message']));
473 echo '</td></tr>';
474
475 echo '</tbody></table>';
476 },
477 'codoc', //page
478 'setting_section_id' //Section
479 );
480
481 add_settings_field(
482 'codoc_tag_attributes', // id
483 __('Attributes for codoc tag','codoc'), // title
484 function() {
485 global $CODOC_SETTINGS;
486 echo '<div class="excerpt">' . esc_html(__('You can add specific attributes to codoc tags.','codoc')) . '</div>';
487 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']));
488 },
489 'codoc', //page
490 'setting_section_id' //Section
491 );
492 add_settings_field(
493 'codoc_script_tag_attributes', // id
494 __('Attributes for codoc script tag','codoc'), // title
495 function() {
496 global $CODOC_SETTINGS;
497 echo '<div class="excerpt">' . esc_html(__('You can add specific attributes to codoc script tags.','codoc')) . '</div>';
498 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']));
499 },
500 'codoc', //page
501 'setting_section_id' //Section
502 );
503 add_settings_field(
504 'str_replace_binded_url', // id
505 __('Permalink','codoc'), // title
506 function() {
507 global $CODOC_SETTINGS;
508 echo '<div class="excerpt">' . esc_html(__('You can replace the part of permalink registered on the codoc.','codoc')) . '</div>';
509 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']));
510 echo ('<span class="suptext">→</span>');
511 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']));
512
513 },
514 'codoc', //page
515 'setting_section_id' //Section
516 );
517
518 add_settings_field(
519 'str_around_codoc_tag', // id
520 __('HTML insertion','codoc'), // title
521 function() {
522 global $CODOC_SETTINGS;
523 echo '<div class="excerpt">' . esc_html(__('You can insert HTML before and after the codoc tag.','codoc')) . '</div>';
524 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']));
525 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']));
526
527 },
528 'codoc', //page
529 'setting_section_id' //Section
530 );
531
532 add_settings_field(
533 'always_show_support_tag', // id
534 __('Automatic support insertion','codoc'), // title
535 function() {
536 global $CODOC_SETTINGS;
537 echo '<div class="excerpt">' . esc_html(__('It adds support functions to the post without inserting a codoc block.','codoc')) . '</div>';
538 echo '<table class="innerTable"><tbody>';
539 echo '<tr><th>' . esc_html(__('Automatic insertion','codoc')) . '</th><td>';
540 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" : ""));
541 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" : ""));
542 echo '</td></tr>';
543 echo '<tr><th>'. esc_html(__('Position','codoc')) . '</th><td>';
544 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" : ""));
545 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" : ""));
546 echo '</td></tr>';
547 echo '<tr><th>' . esc_html(__('Description','codoc')) . '</th><td>';
548 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']));
549 echo '</td></tr>';
550 echo '<tr><th>' . esc_html(__('Category names','codoc')) . '</th><td>';
551 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']));
552 echo '</td></tr>';
553 echo '</tbody></table>';
554
555 },
556 'codoc', //page
557 'setting_section_id' //Section
558 );
559 add_settings_field(
560 'do_not_filter_the_content', // id
561 __('Disable plugin filter','codoc'), // title
562 function() {
563 global $CODOC_SETTINGS;
564 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>';
565 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" : ""));
566 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" : ""));
567 },
568 'codoc', //page
569 'setting_section_id' //Section
570 );
571
572 add_settings_field(
573 'shortcode_evacuation', // id
574 __('Shortcode evacuation','codoc'), // title
575 function() {
576 global $CODOC_SETTINGS;
577 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>';
578 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" : ""));
579 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" : ""));
580 },
581 'codoc', //page
582 'setting_section_id' //Section
583 );
584
585 add_settings_field(
586 'debug_params', // id
587 __('Debug Parameters','codoc'), // title
588 function() {
589 global $CODOC_SETTINGS;
590 echo '<div class="excerpt">' . esc_html(__('You can specify parameters for debugging. Please use this only upon request from codoc support.','codoc')) . '</div>';
591 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']));
592 },
593 'codoc', //page
594 'setting_section_id' //Section
595 );
596
597 add_settings_field(
598 'cretor_info', // id
599 __('Creator\'s Information','codoc'), // title
600 function() {
601 global $CODOC_SETTINGS;
602 global $CODOC_AUTHINFO;
603 echo sprintf('<p><font id="codoc-update-creator-info-message"></font></p>',"");
604 // 変更を保存時に常に同期するのでこの表示は�
605 要ないがUI上保持しておく
606 $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';";
607 if (isset($CODOC_AUTHINFO['profile_image_url'])) {
608 echo sprintf('<img src="%s" width="40" height="40" />',esc_attr($CODOC_AUTHINFO['profile_image_url']));
609 }
610 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'] : '' ));
611 if ($connect_code = $CODOC_SETTINGS['codoc_connect_code']) {
612 // Translators: %s is the integration code, and %s is additional information based on the registration mode.
613 echo sprintf('<p>' . esc_html(__('Extensions integration completed (Extensions code: %1$s) %2$s','codoc')) . '</p>',
614 esc_html($connect_code),
615 esc_html($CODOC_SETTINGS['codoc_connect_registration_mode'] == 'dedicated' ? __('Set the audience as a private account.','codoc') : ''));
616 }
617 echo sprintf('<p><a href="javascript:void(0);" onClick="' . esc_attr($script) . '">' . esc_html(__('Update creator\'s Information','codoc')) . '</a></p>');
618 echo ('<p>' . esc_html(__('Please update each time if you change the logo or cover image on the codoc side.','codoc')) . '</p>');
619 },
620 'codoc', //page
621 'setting_section_id' //Section
622 );
623
624 register_setting(
625 'codoc_option_group', // option group
626 CODOC_USERCODE_OPTION_NAME
627 );
628 register_setting(
629 'codoc_option_group', // option group
630 CODOC_TOKEN_OPTION_NAME
631 );
632
633 if (isset($_GET['codoc_auth_finished']) and $_GET['codoc_auth_finished']) {
634 add_settings_error( 'general', 'settings_updated', esc_html(__( 'codoc authentication has been completed.' ,'codoc'), 'success' ));
635 }
636
637 add_settings_field(
638 'codoc_auth',
639 __('Authentication','codoc'),
640 function() {
641 global $CODOC_USERCODE;
642 global $CODOC_TOKEN;
643 global $CODOC_AUTHINFO;
644 $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';";
645
646 // Translators: %s is the email address.
647 echo sprintf('<p><font color="green" id="codoc-auth-message">' . esc_html(__('Authorized as %s','codoc')) . '</font></p>',esc_attr($CODOC_AUTHINFO['email']));
648
649 echo sprintf('<input id="codoc-usercode" type="hidden" name="%s" value="%s">',esc_attr(CODOC_USERCODE_OPTION_NAME),esc_attr($CODOC_USERCODE));
650 echo sprintf('<input id="codoc-token" type="hidden" name="%s" value="%s">',esc_attr(CODOC_TOKEN_OPTION_NAME),esc_attr($CODOC_TOKEN));
651 echo sprintf('<p><a href="javascript:void(0);" onClick="' . esc_attr($script) . '">' . esc_html(__('Unbind authorization','codoc')) . '</p>');
652 },
653 'codoc',
654 'setting_section_id'
655 );
656
657 }
658
659 // ない場合
660 if (!$CODOC_AUTHINFO and !isset($_GET['auth_by_myself'])) {
661 add_settings_field(
662 'codoc_auth',
663 __('Authentication','codoc'),
664 function() {
665 $theme = wp_get_theme();
666 $from = 'wp';
667 if ($theme->get('Name') === 'codoc') {
668 $from = 'wp_codoc';
669 }
670 //$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
671 $current_url = admin_url('options-general.php') . '?page=codoc';
672 $direct_url = sprintf("location.href='%s&auth_by_myself=1'",$current_url);
673 $login_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/me/token?from=' . $from . '&return_url=' . urlencode($current_url));
674 $register_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/register?from=' . $from . '&return_url=' . urlencode($current_url));
675 // submitを消しておく
676 echo ('<script type="text/javascript">window.onload=function(){document.getElementById(\'submit\').style.display = \'none\'}</script>');
677 if (isset($_GET['confirm_token'])) {
678 $confirm_url = sprintf("location.href='%s&_wpnonce=%s&fetch_token_key=%s&usercode=%s'",$current_url,
679 wp_create_nonce('fetch_token_nonce'),
680 esc_attr($_GET['fetch_token_key']),
681 esc_attr($_GET['usercode']));
682 echo (esc_html(__('The authentication information has been obtained. Please click the confirmation button to complete the setup.','codoc')) . '<br />');
683 echo sprintf('<input type="button" class="button button-primary" value="%s" onClick="%s"> ',esc_html(__('Confirm authentication','codoc')),esc_attr($confirm_url));
684 } else {
685
686 echo (esc_html(__('Authentication is required to use codoc on WordPress.','codoc')) . '<br />');
687 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 />');
688 echo sprintf('<input type="button" class="button button-primary" value="%s" onClick="%s"> ',esc_attr(__('Authenticate by direct input','codoc')),esc_attr($direct_url));
689 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));
690 }
691 if (!$this->util->health_check()) {
692 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>');
693 }
694
695 },
696 'codoc',
697 'setting_section_id'
698 );
699 }
700 // ない場合かつ自分で認証する場合
701 if (!$CODOC_AUTHINFO and (
702 (isset($_GET['auth_by_myself']) and $_GET['auth_by_myself']) or
703 (isset($_POST['auth_by_myself']) and $_POST['auth_by_myself'])
704 )) {
705 register_setting(
706 'codoc_option_group', // option group
707 CODOC_USERCODE_OPTION_NAME
708 );
709 register_setting(
710 'codoc_option_group', // option group
711 CODOC_TOKEN_OPTION_NAME
712 );
713 add_settings_field(
714 'codoc_usercode',
715 'ユーザーコード',
716 function() {
717 global $CODOC_USERCODE;
718 echo '<input type="hidden" name="auth_by_myself" value="1">';
719 echo sprintf('<input type="text" name="%s" value="%s">',esc_attr(CODOC_USERCODE_OPTION_NAME),esc_attr($CODOC_USERCODE));
720 },
721 'codoc',
722 'setting_section_id'
723 );
724 add_settings_field(
725 'codoc_token',
726 'APIトークン',
727 function() {
728 global $CODOC_TOKEN;
729 echo sprintf('<input type="text" name="%s" value="%s">',esc_attr(CODOC_TOKEN_OPTION_NAME),esc_attr($CODOC_TOKEN));
730 },
731 'codoc',
732 'setting_section_id'
733 );
734 }
735
736 // 認証�
737 報を保存
738 add_action( 'update_option_' . CODOC_USERCODE_OPTION_NAME, function( $old_value, $new_value ) {
739 global $CODOC_RE_AUTHORIZE;
740 $CODOC_RE_AUTHORIZE = 1;
741 },9,2); // $hook, $function_to_add, $priority, $accepted_args
742 add_action( 'update_option_' . CODOC_TOKEN_OPTION_NAME, function( $old_value, $new_value ) {
743 global $CODOC_RE_AUTHORIZE;
744 $CODOC_RE_AUTHORIZE = 1;
745 },10,2);
746
747 add_action('update_option_' . CODOC_SETTINGS_OPTION_NAME,function(){
748 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
749 if (isset($CODOC_SETTINGS['always_show_support']) and $CODOC_SETTINGS['always_show_support']) {
750 $data = $this->util->get_support_entry([],[
751 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
752 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
753 ]);
754 if ($data and $data->status and $entry = $data->entry) {
755 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,$entry->code);
756 } else {
757 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
758 }
759 } elseif(isset($CODOC_SETTINGS['always_show_support']) and !$CODOC_SETTINGS['always_show_support']) {
760 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
761 }
762 });
763
764 add_action('updated_option',function(){
765 global $CODOC_RE_AUTHORIZE;
766 if ($CODOC_RE_AUTHORIZE) {
767 //$data = $this->callAPI('GET','');
768 $data = $this->util->get_user_info([],[
769 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
770 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
771 ]);
772 if ($data->status and $user = $data->user) {
773 $this->update_codoc_authinfo($user);
774 } else {
775 update_option(CODOC_AUTHINFO_OPTION_NAME,'');
776 }
777 }
778 });
779
780 });
781 // プラグイン一覧に設定のリンクをいれる
782 add_filter( 'plugin_action_links_' . plugin_basename( plugin_dir_path( __FILE__ ) . 'codoc' . '.php' ),
783 function( $links ) {
784 $setting_link = sprintf( '<a href="%s">%s</a>', esc_url( add_query_arg( 'page', 'codoc', admin_url( 'options-general.php' ) ) ), esc_html( __('Settings') ) );
785 array_unshift( $links, $setting_link );
786
787 return $links;
788 }
789 );
790
791 }
792 public function add_mce() {
793 add_action( 'admin_enqueue_scripts', function() {
794 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
795 return;
796 }
797 $current_screen = get_current_screen();
798 if ( ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) || ( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) ) {
799 // Gutenberg Editor
800 // なにもしない
801 } else {
802 // tinymce
803 if ( get_user_option( 'rich_editing' ) == 'true' ) {
804 // プラグイン�
805 で使うCSRF を生成
806 $path = plugins_url( 'codoc/src_mce/codoc-editor-onload.js', __DIR__ );
807 wp_enqueue_script( 'codoc-editor-onload', $path, array('jquery'), '', true );
808 // I just want to insert this global variables but i don't know how i can do it..
809 $auth_info = get_option(CODOC_AUTHINFO_OPTION_NAME);
810 wp_localize_script(
811 'codoc-editor-onload',
812 'CODOCEDITOR',
813 array(
814 'action' => 'codoc_shortcodes',
815 'nonce' => wp_create_nonce( 'codoc_shortcodes' ),
816
817 'codoc_url' => $this->get_codoc_url(),
818 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
819 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
820 'codoc_sdk_path' => CODOC_SDK_PATH,
821 'codoc_account_is_pro' => isset($auth_info['account_is_pro']) ? $auth_info['account_is_pro'] : 0,
822 'codoc_currency_code' => isset($auth_info['currency_code']) ? $auth_info['currency_code'] : 0,
823 'codoc_currency_decimal_places' => isset($auth_info['currency_decimal_places']) ? $auth_info['currency_decimal_places'] : 0,
824 )
825 );
826
827 // ここでtinymceのプラグイン追加
828 //wp_enqueue_style( 'codoc-admin-style', plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
829 //add_editor_style( plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
830 wp_enqueue_style( 'codoc-admin-style', $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.css?c=' . date('Ymd') );
831 add_editor_style( $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.css' );
832
833 add_filter( 'mce_external_plugins', function( $plugin_array ) {
834 //$plugin_array['codoc'] = plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ );
835 $plugin_array['codoc'] = $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.js?c=' . date('Ymd');
836 return $plugin_array;
837 } );
838 add_filter( 'mce_buttons', function( $buttons ) {
839 array_push( $buttons, "|", "codoc" );
840 return $buttons;
841 } );
842 // 非SSL環境の場合、なぜかhttps -> httpsになってしまうので対策
843 // コメントタグが除去されることがあるらしいのでvalid_elementsに�
844 要なタグを追加 (EXPERIMENTAL)
845 add_filter( 'tiny_mce_before_init', function($settings) {
846 $settings['external_plugins'] = preg_replace('/"codoc":"http:/','"codoc":"https:',$settings['external_plugins']);
847 foreach (['valid_elements','extended_valid_elements'] as $valid_elements) {
848 if (isset($settings[$valid_elements])) {
849 $settings[$valid_elements] = $settings[$valid_elements] . ',div[*],p[*],img[*],--[*]';
850 }
851 }
852 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
853 if (isset($CODOC_SETTINGS["debug_params"])) {
854 $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
855 if (isset($params_decoded["mce_valid_elements"])) {
856 $settings['valid_elements'] = $params_decoded["mce_valid_elements"];
857 $settings['extended_valid_elements'] = $params_decoded["mce_valid_elements"];
858 }
859 }
860
861 return $settings;
862 },1000000);
863 }
864 }
865 } );
866 }
867 function update_codoc_authinfo($user) {
868 global $CODOC_SETTINGS;
869 global $CODOC_AUTHINFO;
870 if (property_exists($user,'connect_code') and $user->connect_code) {
871 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
872 $CODOC_SETTINGS['codoc_connect_code'] = $user->connect_code;
873 $CODOC_SETTINGS['codoc_connect_registration_mode'] = $user->connect_has_permission_dedicated_account ? 'dedicated' : '';
874 update_option(CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS);
875 }
876 return update_option(CODOC_AUTHINFO_OPTION_NAME,[
877 'email' => $user->email,
878 'name' => $user->name,
879 'profile_image_url' => $user->profile_image_url,
880 'cover_image_url' => $user->cover_image_url,
881 'connect_code' => property_exists($user,'connect_code') ? $user->connect_code : '',
882 'connect_image_url' => property_exists($user,'connect_image_url') ? $user->connect_image_url : '',
883 'account_is_pro' => property_exists($user,'account_is_pro') ? $user->account_is_pro : '',
884 'created_at' => property_exists($user,'created_at') ? $user->created_at : 0,
885 'country' => property_exists($user,'country') ? $user->country : '',
886 'currency_code' => property_exists($user,'currency_code') ? $user->currency_code : '',
887 'currency_decimal_places' => property_exists($user,'currency_decimal_places') ? $user->currency_decimal_places : '',
888 ]);
889 $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
890 return $CODOC_AUTHINFO;
891 }
892 // 保存用コンテンツにフィルターを実施する
893 public function get_filtered_content($post_emulated) {
894 // 記事ページであることをエミュレートしてフィルター実行
895 $post_backuped = null;
896 if (isset($GLOBALS['post'])) {
897 $post_backuped = $GLOBALS['post'];
898 }
899 $GLOBALS['post'] = $post_emulated;
900
901 $wp_query_backuped = null;
902 if (isset($GLOBALS['wp_query'])) {
903 $wp_query_backuped = $GLOBALS['wp_query'];
904 $wp_query = $GLOBALS['wp_query'];
905 $wp_query->is_single = true;
906 $wp_query->is_singular = true;
907 # in_the_loop は記事ページでは通常有効っぽいので true指定 ex: wp_ulike
908 $wp_query->in_the_loop = true;
909 # これも追加しておく
910 $wp_query->is_main_query = true;
911
912 $wp_query->post = $post_emulated;
913 $wp_query->queried_object = $post_emulated;
914 $wp_query->queried_object_id = $post_emulated->ID;
915
916 $GLOBALS['wp_query'] = $wp_query;
917 }
918 // $this->the_content でオリジナルを返してもらうため
919 $this->do_not_filter_the_content = true;
920 $content = preg_replace(
921 '/ (\/)?wp:codoc\/codoc-block /',' \\1wptmp:codoc/codoc-block ',
922 $post_emulated->post_content
923 );
924 // post_metaに�
925 容を保存し、無料パートにショートコードの退避をおこなう
926 $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME);
927 if (isset($codoc_settings['shortcode_evacuation']) and $codoc_settings['shortcode_evacuation']) {
928 $splited = preg_split('/\/wptmp:codoc\/codoc-block/s',$content);
929 if (isset($splited[0]) and isset($splited[1])) {
930 // すべてのショートコードを $match_all にいれる
931 preg_match_all('/\[[^\[\]]+?\](.+\[\/[^\[\]]+?\])?/',$splited[1],$match_all);
932 // ショートコードをURLエンコードしてdivタグの中にいれておく(後でmetaの中のショートコードと付け合せ)
933 $replaced = preg_replace_callback('/\[[^\[\]]+?\](.+\[\/[^\[\]]+?\])?/',function($matches) {
934 return sprintf ('<div class="codoc-evacuation-dests" data-shortcode="%s"></div>', urlencode($matches[0]));
935 },$splited[1]);
936 // 0番目に�
937 �列で�
938 �っているのでそこを退避対象の�
939 �列とする
940 $evacuations = $match_all[0];
941 // ショートコードの中身をタグに退避
942 $content = $splited[0] . '/wptmp:codoc/codoc-block' . $replaced;
943 // 無料パートでショートコードを実行できるようにする
944 update_post_meta($post_emulated->ID,'codoc_shortcode_evacuations',join('**codoc**',$evacuations));
945 } else {
946 update_post_meta($post_emulated->id,'codoc_shortcode_evacuations',"");
947 }
948 }
949 #$content = do_shortcode( $content );
950 $content_filtered = apply_filters( 'the_content', $content);
951 $this->do_not_filter_the_content = false;
952
953 $GLOBALS['post'] = $post_backuped;
954
955 if ($wp_query_backuped) {
956 $GLOBALS['wp_query'] = $wp_query_backuped;
957 }
958
959 $content_filtered = preg_replace(
960 '/ (\/)?wptmp:codoc\/codoc-block /',' \\1wp:codoc/codoc-block ',
961 $content_filtered
962 );
963 return $content_filtered;
964 }
965
966 public function save_post($post_ID,$post,$update) {
967 if (preg_match('/^(auto-draft|inherit)$/',$post->post_status)) {
968 return;
969 }
970 $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
971 $postId = get_post_meta($post_ID,'codoc_saved_post_id',true);
972 // 保存されているIDと違う場合は破棄(duplicate pageなどでmeta�
973 報をコピーされた可能性がある)
974 if ($postId and $postId != $post_ID) {
975 $entryCode = '';
976 }
977 $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME);
978 $post_content = (isset($codoc_settings['do_not_filter_the_content']) and $codoc_settings['do_not_filter_the_content']) ?
979 $post->post_content : $this->get_filtered_content($post);
980 $res = $this->util->sync_entry([
981 "post_title" => $post->post_title,
982 "post_content" => $post_content,
983 // password が設定されてる場合は限定�
984 �開にする
985 "post_status" => $post->post_status == 'publish' ? ($post->post_password ? 2 : 1) : 0,
986 "post_permalink" => get_permalink($post_ID),
987 "codoc_entry_code" => $entryCode,
988 "codoc_settings" => $codoc_settings,
989 ],[
990 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
991 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
992 ]);
993 $prudent_update_post_meta_entry_code = null;
994 if (isset($codoc_settings["debug_params"])) {
995 $params_decoded = json_decode($codoc_settings["debug_params"],true);
996 if (isset($params_decoded["prudent_update_post_meta_entry_code"])) {
997 $prudent_update_post_meta_entry_code = $params_decoded["prudent_update_post_meta_entry_code"];
998 }
999 }
1000 if ($prudent_update_post_meta_entry_code == 2) {
1001 error_log('CODOC:: ' . sprintf ("%s : %s : %s : %s", $post_ID, (is_object($res) ? "1" : 0),$res->status,$entryCode));
1002 }
1003 if (is_object($res) and $res->status and !$entryCode) {
1004 // 20230222 https://stackoverflow.com/questions/26640785/update-post-meta-not-work-only-when-save-data-not-for-update
1005 if ($prudent_update_post_meta_entry_code) {
1006 add_post_meta($post_ID,'codoc_entry_code',$res->entry->code);
1007 add_post_meta($post_ID,'codoc_saved_post_id',$post_ID);
1008 } else {
1009 update_post_meta($post_ID,'codoc_entry_code',$res->entry->code);
1010 update_post_meta($post_ID,'codoc_saved_post_id',$post_ID);
1011 }
1012 }
1013 return true;
1014 }
1015 function updated_post_meta( $meta_ID, $post_ID, $meta_key ) {
1016 // スルーされてる場合は他のメタ�
1017 報更新のタイミングにサムネイルをアップロード
1018 $has_to_resend = get_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',true);
1019 if ($has_to_resend != 1 and $meta_key != '_thumbnail_id') {
1020 return;
1021 }
1022 if ( has_post_thumbnail($post_ID) ) {
1023 // 新規投稿の場合、タイミングによってはcodocEntryCodeが取得できないので一旦スルーする
1024 if (!get_post_meta($post_ID,'codoc_entry_code',true)) {
1025 update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',1);
1026 return;
1027 } else {
1028 update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',0);
1029 }
1030 $attachment = wp_get_attachment_metadata( get_post_thumbnail_id($post_ID));
1031 $upload_dir = wp_upload_dir();
1032 $file_path = sprintf ('%s/%s',$upload_dir['basedir'],$attachment['file']);
1033
1034 return $this->util->post_thumbnail([
1035 "file_path" => $file_path,
1036 "boundary" => wp_generate_password(24),
1037 "codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true),
1038 ],[
1039 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
1040 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
1041 ]);
1042 }
1043 }
1044 function deleted_post_meta( $meta_ids, $post_ID, $meta_key,$meta_value ) {
1045 if ($meta_key != '_thumbnail_id') {
1046 return;
1047 }
1048 return $this->util->reset_thumbnail(
1049 ["codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true)],
1050 [
1051 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
1052 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
1053 ]
1054 );
1055 }
1056 // 退避されてるかどうかをmetaを使って確認し、無料エリアの一番最後にショートコードを追加
1057 function the_content_shortcode_evacuations( $post_content ) {
1058 if ($this->do_not_filter_the_content) {
1059 return $post_content;
1060 }
1061 $post = get_post();
1062 if (!$post) {
1063 return $post_content;
1064 }
1065 $evacuations_meta = get_post_meta($post->ID,'codoc_shortcode_evacuations',true);
1066 $evacuations = preg_split('/\*\*codoc\*\*/',$evacuations_meta);
1067 foreach ($evacuations as $evacuation) {
1068 $post_content = sprintf('<div class="codoc-evacuations" style="display:none;" data-shortcode="%s">%s</div>',
1069 urlencode($evacuation),$evacuation) . $post_content;
1070 }
1071 return $post_content;
1072 }
1073 function the_content( $post_content ) {
1074 if ( is_single() && in_the_loop() && is_main_query() ) {
1075 }
1076 // get_filtered_content から do_not_filter_the_contentを有効にされるパターン
1077 // オプションの設定値の意味合い(他のフィルタを無視)とは違うため注意
1078 if ($this->do_not_filter_the_content) {
1079 return $post_content;
1080 }
1081 $post = get_post();
1082 // 20211215 null になる場合がある
1083 if (!$post) {
1084 return $post_content;
1085 }
1086 # is_amp で実�
1087 しているテンプレート用
1088 $is_amp_endpoint = (function_exists('is_amp_endpoint') && is_amp_endpoint()) ? true :
1089 ((function_exists('is_amp') && is_amp()) ? true : false);
1090 return $this->util->filter_content([
1091 "post_content" => $post_content,
1092 "preview" => is_preview(),
1093 "codoc_entry_code" => get_post_meta($post->ID,'codoc_entry_code',true),
1094 "codoc_settings" => get_option(CODOC_SETTINGS_OPTION_NAME),
1095 "is_amp_endpoint" => $is_amp_endpoint,
1096 "post_permalink" => get_permalink($post->ID),
1097 "codoc_support_entry_code" => get_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME),
1098 ]);
1099 }
1100
1101 function excerpt_allowed_blocks ($allowed_blocks) {
1102 if (is_array($allowed_blocks)) {
1103 array_push($allowed_blocks,'codoc/codoc-block');
1104 }
1105 return $allowed_blocks;
1106 }
1107
1108 function show_tadv_notice() {
1109 // API からの notification を表示
1110 $api_notifications = get_transient('codoc_api_notification');
1111 if ($api_notifications && is_array($api_notifications)) {
1112 // notification �
1113 �列のキーと値を表示
1114 foreach ($api_notifications as $key => $value) {
1115 // 値が�
1116 �列やオブジェクトの場合は json_encode で文字列化
1117 if (is_array($value) || is_object($value)) {
1118 $value = json_encode($value, JSON_UNESCAPED_UNICODE);
1119 }
1120 echo "<div class=\"notice notice-warning is-dismissible codoc-notification\"><p>" . esc_html($value) . "</p></div>";
1121 }
1122 //delete_transient('codoc_api_notification');
1123 }
1124
1125 $name = 'Advanced Editor Tools';
1126 $name_escaped = preg_replace('/ /','+',$name);
1127 $install_url = network_admin_url( "plugin-install.php?tab=search&s=" . $name );
1128 $options_url = network_admin_url( "options-general.php?page=tinymce-advanced" );
1129
1130 //<a href=\"%s\">%s</a> を有効にし、設定画面にて &quot;Keep paragraph tags in the Classic block and the Classic Editor&quot; を有効にしてください。
1131 //<a href=\"%s\">%s</a> の設定画面にて &quot;Keep paragraph tags in the Classic block and the Classic Editor&quot; を有効にしてください。
1132 // Translators: %s is a link to the installation page with the plugin name.
1133 $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));
1134 // Translators: %s is a link to the options settings page with the plugin name.
1135 $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));
1136 // クラシックエディタで advanced editor tools を�
1137 �れてない場合は notice
1138 if (is_plugin_active('classic-editor/classic-editor.php') and
1139 !is_plugin_active('tinymce-advanced/tinymce-advanced.php')) {
1140 echo "<div class=\"notice notice-warning is-dismissible\"><p>" . esc_html($tadv_message_for_install) . "</p></div>";
1141 }
1142
1143 // advanced editor tools の設定を調査
1144 $no_autop = false;
1145 $tadv_admin_settings = get_option( 'tadv_admin_settings', false );
1146 if (isset($tadv_admin_settings['options']) and preg_match('/no_autop/',$tadv_admin_settings['options'])) {
1147 $no_autop = true;
1148 }
1149 // advanced editor tools が有効で no_autop (Keep paragraph tags in the Classic block and the Classic Editor) が無効
1150 if (is_plugin_active('tinymce-advanced/tinymce-advanced.php') and !$no_autop) {
1151 echo "<div class=\"notice notice-warning is-dismissible\"><p>" . esc_html($tadv_message_for_options) . "</p></div>";
1152 }
1153 }
1154 }
1155