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