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