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 +525 -153 0.9.110.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);
@@ -90,17 +123,25 @@
90 123 $connect_code = $CODOC_SETTINGS["codoc_connect_code"];
91 124 $connect_attributes = sprintf(' data-connect-code="%s"',$connect_code);
92 125 $tag = preg_replace('/cms\.js/','cms-connect.js',$tag);
93 126 }
94 - if (isset($CODOC_SETTINGS["debug_params"])) {
95 - $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
96 - if (isset($params_decoded["connect_registration_mode"])) {
97 - $connect_attributes = $connect_attributes . sprintf(' data-connect-registration-mode="%s"',$params_decoded["connect_registration_mode"]);
98 - }
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"]);
99 130 }
100 -
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 + }
101 142 //return str_replace(' src=', $data_css . ' defer src=', $tag);
102 - return preg_replace('/(src=[^>]+)/',' ${1} ' . $data_css . $connect_attributes . ' defer',$tag);
143 + return preg_replace('/(src=[^>]+)/',' ${1} ' . $data_css . $connect_attributes . $usercode_attributes . $setting_attributes . ' defer',$tag);
103 144 }
104 145 public function injector_shortcode($atts) {
105 146 global $post;
106 147 ob_start();
@@ -111,9 +152,9 @@
111 152 public function add_settings() {
112 153 global $CODOC_SETTINGS;
113 154 add_action( 'admin_menu' ,function(){
114 155 add_options_page(
115 - 'codoc の設定', //ページタイトル
156 + __('codoc Settings','codoc'), //ページタイトル
116 157 'codoc', //設定メニューに表示されるメニュータイトル
117 158 'edit_users', //権限
118 159 'codoc', //設定ページのURL。options-general.php?page=codoc
119 160 function() {
@@ -131,39 +172,70 @@
131 172 function codoc_admin_styles($hook) {
132 173 wp_enqueue_style('codoc-options-style', plugins_url( 'codoc/css/codoc-options.css', __DIR__ ));
133 174 }
134 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 +
135 198 add_action( "admin_init", function() {
199 + global $CODOC_USERCODE;
200 + global $CODOC_SETTINGS;
201 + global $CODOC_TOKEN;
202 + global $CODOC_AUTHINFO;
136 203 // codocからの認証データ処理
137 - 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';
138 206 $key = sanitize_text_field($_GET['fetch_token_key']);
139 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 + }
140 218 update_option(CODOC_USERCODE_OPTION_NAME,$usercode);
141 219 //$data = $this->callAPI('GET','/token',[ "fetch_token_key" => $key ]);
142 220 $data = $this->util->get_token([ "fetch_token_key" => $key ],["usercode" => $usercode, "token" => "1"]);
143 - if ($data->status and $token = $data->token) {
221 + if ($data->status and property_exists($data,'token') and $token = $data->token) {
144 222 update_option(CODOC_TOKEN_OPTION_NAME,$token);
145 223 //$data = $this->callAPI('GET','');
146 224 $data = $this->util->get_user_info([],["usercode" => $usercode, "token" => $token]);
225 +
147 226 if ($data->status and $user = $data->user) {
148 - update_option(CODOC_AUTHINFO_OPTION_NAME,[
149 - 'email' => $user->email,
150 - 'name' => $user->name,
151 - ]);
227 + $this->update_codoc_authinfo($user);
152 228 }
153 229 #$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
154 230 #$current_url = preg_replace('/(.*)fetch_token_key.*/','${1}&codoc_auth_finished=1',$current_url);
155 231 //add_settings_error( 'general', 'settings_updated', __( 'OK' ), 'success' );
156 - $current_url = admin_url('options-general.php') . '?page=codoc&codoc_auth_finished=1';
157 232
233 + $current_url = $current_url . '&codoc_auth_finished=1';
158 234 wp_redirect( $current_url);
159 235 exit;
160 236 }
161 237 }
162 - global $CODOC_USERCODE;
163 - global $CODOC_SETTINGS;
164 - global $CODOC_TOKEN;
165 - global $CODOC_AUTHINFO;
166 238 $CODOC_USERCODE = get_option(CODOC_USERCODE_OPTION_NAME);
167 239 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
168 240 $CODOC_TOKEN = get_option(CODOC_TOKEN_OPTION_NAME);
169 241 $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
@@ -201,8 +273,11 @@
201 273 }
202 274 if (!isset($CODOC_SETTINGS['do_not_filter_the_content'])) {
203 275 $CODOC_SETTINGS['do_not_filter_the_content'] = '0';
204 276 }
277 + if (!isset($CODOC_SETTINGS['shortcode_evacuation'])) {
278 + $CODOC_SETTINGS['shortcode_evacuation'] = '0';
279 + }
205 280
206 281 if (!isset($CODOC_SETTINGS['entry_button_text'])) {
207 282 $CODOC_SETTINGS['entry_button_text'] = '';
208 283 }
@@ -226,45 +301,84 @@
226 301 }
227 302 if (!isset($CODOC_SETTINGS['show_powered_by'])) {
228 303 $CODOC_SETTINGS['show_powered_by'] = '1';
229 304 }
230 -
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 + }
231 311 if (!isset($CODOC_SETTINGS['codoc_tag_attributes'])) {
232 312 $CODOC_SETTINGS['codoc_tag_attributes'] = '';
233 313 }
314 + if (!isset($CODOC_SETTINGS['codoc_script_tag_attributes'])) {
315 + $CODOC_SETTINGS['codoc_script_tag_attributes'] = '';
316 + }
234 317 if (!isset($CODOC_SETTINGS['codoc_connect_code'])) {
235 318 $CODOC_SETTINGS['codoc_connect_code'] = '';
236 319 }
320 + if (!isset($CODOC_SETTINGS['codoc_connect_registration_mode'])) {
321 + $CODOC_SETTINGS['codoc_connect_registration_mode'] = '';
322 + }
237 323 if (!isset($CODOC_SETTINGS['debug_params'])) {
238 324 $CODOC_SETTINGS['debug_params'] = '';
239 325 }
240 -
326 + if (!isset($CODOC_SETTINGS['block_defaults'])) {
327 + $CODOC_SETTINGS['block_defaults'] = '';
328 + }
241 329 add_settings_section(
242 330 'setting_section_id', // id
243 - 'codoc 設定ページ', // title
244 - function (){}, // callback
331 + __('codoc Settings','codoc'), // title
332 + [$this,'show_tadv_notice'],
245 333 'codoc' // page
246 334 );
335 +
247 336 // 認証がある場合
248 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 +
249 351 register_setting(
250 352 'codoc_option_group', // option group
251 - 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 + })
252 364 );
253 365 add_settings_field(
254 366 'css_path', // id
255 - 'テーマ', // title
367 + __('Theme','codoc'), // title
256 368 function() {
257 369 global $CODOC_SETTINGS;
258 - echo '<div class="excerpt">テーマを指定してペイウォールのデザインを変えることができます。<br>パスを指定を選択することでCSSを直接指定するこもと可能です。</div>';
259 - 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']));
260 372 echo '' .
261 373 '<script type="text/javascript"> ' .
262 374 ' function gen_css_path(select) { ' .
263 - ' if (select.value == "dark") { ' .
375 + ' if (select.value == "dark" || select.value == "dark-square") { ' .
264 376 ' document.getElementById("darkmode-caution").style.display="block";' .
265 377 ' } else { ' .
266 - ' document.getElementById("darkmode-caution").style.display="none";' .
378 + ' if (document.getElementById("darkmode-caution")) { ' .
379 + ' document.getElementById("darkmode-caution").style.display="none";' .
380 + ' } ' .
267 381 ' } ' .
268 382 ' if (select.value == "path") { ' .
269 383 ' document.getElementById("codoc_css_path").readOnly=false; ' .
270 384 ' if (!document.getElementById("codoc_css_path").value.match(/\//g)) {' .
@@ -277,44 +391,50 @@
277 391 ' } ' .
278 392 '</script> ' ;
279 393
280 394 echo sprintf('<select name="theme_name" onChange="gen_css_path(this)" id="codoc_theme_select">');
281 - foreach (["blue","red","green","black","dark","blue-square","red-square","green-square","black-square","dark-square"] 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 + }
282 399 if ($theme == "blue") {
283 - 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')));
284 401 }
285 402 if ($theme == "red") {
286 - 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')));
287 404 }
288 405 if ($theme == "green") {
289 - 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')));
290 407 }
291 408 if ($theme == "black") {
292 - 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')));
293 410 }
294 411 if ($theme == "dark") {
295 - 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')));
296 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 + }
297 417 if ($theme == "blue-square") {
298 - echo sprintf('<option value="%s" %s>青(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "blue-square" ? "selected" : ""));
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')));
299 419 }
300 420 if ($theme == "red-square") {
301 - echo sprintf('<option value="%s" %s>赤(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "red-square" ? "selected" : ""));
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')));
302 422 }
303 423 if ($theme == "green-square") {
304 - echo sprintf('<option value="%s" %s>緑(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "green-square" ? "selected" : ""));
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')));
305 425 }
306 426 if ($theme == "black-square") {
307 - echo sprintf('<option value="%s" %s>黒(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "black-square" ? "selected" : ""));
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')));
308 428 }
309 429 if ($theme == "dark-square") {
310 - echo sprintf('<option value="%s" %s>ダークモード(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "dark-square" ? "selected" : ""));
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')));
311 431 }
312 432 }
313 - 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')));
314 434 echo '<script type="text/javascript">gen_css_path(document.getElementById(\'codoc_theme_select\'))</script>';
315 435 echo sprintf('</select></div>');
316 - 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>';
317 437 },
318 438 'codoc', //page
319 439 'setting_section_id' //Section
320 440 );
@@ -319,46 +439,49 @@
319 439 'setting_section_id' //Section
320 440 );
321 441 add_settings_field(
322 442 'paywall_text', // id
323 - '各種文言', // title
443 + __('Texts in paywall','codoc'), // title
324 444 function() {
325 445 global $CODOC_SETTINGS;
326 - 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>';
327 448 echo '<table class="innerTable"><tbody>';
328 - echo '<tr><th>いいねの表示</th><td>';
329 - 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" : ""));
330 - 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" : ""));
331 452 echo '</td></tr>';
332 453
333 - echo '<tr><th>codocについての表示</th><td>';
334 - 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" : ""));
335 - 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 + }
336 464 echo '</td></tr>';
337 465
338 - echo '<tr><th>PoweredByの表示</th><td>';
339 - 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" : ""));
340 - 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']));
341 468 echo '</td></tr>';
342 469
343 - echo '<tr><th>記事購入ボタンのテキスト</th><td>';
344 - 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']));
345 472 echo '</td></tr>';
346 -
347 - echo '<tr><th>サブスクリプション購入ボタンのテキスト</th><td>';
348 - echo sprintf('<input type="text" name="%s[subscription_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_button_text']));
349 - echo '</td></tr>';
350 473
351 - echo '<tr><th>サポートボタンのテキスト</th><td>';
352 - 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']));
353 476 echo '</td></tr>';
354 477
355 - echo '<tr><th>「サブスクリプションに含まれる記事」のテキスト</th><td>';
356 - 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']));
357 480 echo '</td></tr>';
358 481
359 - echo '<tr><th>サポート説明のテキスト</th><td>';
360 - 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']));
361 484 echo '</td></tr>';
362 485
363 486 echo '</tbody></table>';
364 487 },
@@ -367,39 +490,38 @@
367 490 );
368 491
369 492 add_settings_field(
370 493 'codoc_tag_attributes', // id
371 - 'codocタグの属性', // title
494 + __('Attributes for codoc tag','codoc'), // title
372 495 function() {
373 496 global $CODOC_SETTINGS;
374 - echo '<div class="excerpt">codocタグに特定の属性を追加することができます。</div>';
375 - 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']));
376 499 },
377 500 'codoc', //page
378 501 'setting_section_id' //Section
379 502 );
380 503 add_settings_field(
381 - 'codoc_connect_code', // id
382 - 'サービス連携コード', // title
504 + 'codoc_script_tag_attributes', // id
505 + __('Attributes for codoc script tag','codoc'), // title
383 506 function() {
384 507 global $CODOC_SETTINGS;
385 - echo '<div class="excerpt">サービス連携ウィジェットを利用するためにはアカウント設定でサービス連携を有効化し、サービス連携コードを指定してください</div>';
386 - echo sprintf('<input type="text" name="%s[codoc_connect_code]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['codoc_connect_code']));
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']));
387 510 },
388 511 'codoc', //page
389 512 'setting_section_id' //Section
390 513 );
391 -
392 514 add_settings_field(
393 515 'str_replace_binded_url', // id
394 - 'パーマリンク', // title
516 + __('Permalink','codoc'), // title
395 517 function() {
396 518 global $CODOC_SETTINGS;
397 - echo '<div class="excerpt">codoc側に登録するパーマリンクを置換することができます。</div>';
398 - 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']));
399 - echo ('<span class="suptext">を</span>');
400 - 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']));
401 - 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 +
402 524 },
403 525 'codoc', //page
404 526 'setting_section_id' //Section
405 527 );
@@ -405,16 +527,14 @@
405 527 );
406 528
407 529 add_settings_field(
408 530 'str_around_codoc_tag', // id
409 - 'HTMLの挿入', // title
531 + __('HTML insertion','codoc'), // title
410 532 function() {
411 533 global $CODOC_SETTINGS;
412 - echo '<div class="excerpt">codocタグの前後にHTMLを挿入することができます。</div>';
413 - 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']));
414 - echo ('を前に挿入</div>');
415 - 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']));
416 - 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']));
417 537
418 538 },
419 539 'codoc', //page
420 540 'setting_section_id' //Section
@@ -421,26 +541,26 @@
421 541 );
422 542
423 543 add_settings_field(
424 544 'always_show_support_tag', // id
425 - 'サポートの自動挿入', // title
545 + __('Automatic support insertion','codoc'), // title
426 546 function() {
427 547 global $CODOC_SETTINGS;
428 - 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>';
429 549 echo '<table class="innerTable"><tbody>';
430 - echo '<tr><th>自動挿入</th><td>';
431 - 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" : ""));
432 - 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" : ""));
433 553 echo '</td></tr>';
434 - echo '<tr><th>表示位置</th><td>';
435 - 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" : ""));
436 - 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" : ""));
437 557 echo '</td></tr>';
438 - echo '<tr><th>説明文</th><td>';
439 - 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']));
440 560 echo '</td></tr>';
441 - echo '<tr><th>対象カテゴリ名</th><td>';
442 - 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']));
443 563 echo '</td></tr>';
444 564 echo '</tbody></table>';
445 565
446 566 },
@@ -448,31 +568,94 @@
448 568 'setting_section_id' //Section
449 569 );
450 570 add_settings_field(
451 571 'do_not_filter_the_content', // id
452 - '支障が出る処理を無効化', // title
572 + __('Disable plugin filter','codoc'), // title
453 573 function() {
454 574 global $CODOC_SETTINGS;
455 - echo '<div class="excerpt">codocの動作に支障が出る他のプラグインによる<strong>フィルター処理</strong>を無効化できます。codocが上手く動かない場合のみ利用してください。</div>';
456 - 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" : ""));
457 - 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" : ""));
458 578 },
459 579 'codoc', //page
460 580 'setting_section_id' //Section
461 581 );
582 +
462 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(
463 597 'debug_params', // id
464 - 'デバック用', // title
598 + __('Debug Parameters','codoc'), // title
465 599 function() {
466 600 global $CODOC_SETTINGS;
467 - echo '<div class="excerpt">デバック用のパラメーターを指定できます。codocサポートから依頼がある場合のみ利用してください。</div>';
468 - 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']));
469 603 },
470 604 'codoc', //page
471 605 'setting_section_id' //Section
472 606 );
473 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 + );
474 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 +
475 658 register_setting(
476 659 'codoc_option_group', // option group
477 660 CODOC_USERCODE_OPTION_NAME
478 661 );
@@ -481,25 +664,26 @@
481 664 CODOC_TOKEN_OPTION_NAME
482 665 );
483 666
484 667 if (isset($_GET['codoc_auth_finished']) and $_GET['codoc_auth_finished']) {
485 - add_settings_error( 'general', 'settings_updated', __( 'codocの認証が完了しました' ), 'success' );
668 + add_settings_error( 'general', 'settings_updated', esc_html(__( 'codoc authentication has been completed.' ,'codoc'), 'success' ));
486 669 }
487 670
488 671 add_settings_field(
489 672 'codoc_auth',
490 - '認証',
673 + __('Authentication','codoc'),
491 674 function() {
492 675 global $CODOC_USERCODE;
493 676 global $CODOC_TOKEN;
494 677 global $CODOC_AUTHINFO;
495 - $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';";
496 679
497 - 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']));
498 682
499 - echo sprintf('<input id="codoc-usercode" type="hidden" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
500 - echo sprintf('<input id="codoc-token" type="hidden" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
501 - 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>');
502 686 },
503 687 'codoc',
504 688 'setting_section_id'
505 689 );
@@ -509,22 +693,40 @@
509 693 // ない場合
510 694 if (!$CODOC_AUTHINFO and !isset($_GET['auth_by_myself'])) {
511 695 add_settings_field(
512 696 'codoc_auth',
513 - '認証',
697 + __('Authentication','codoc'),
514 698 function() {
515 -
699 + $theme = wp_get_theme();
700 + $from = 'wp';
701 + if ($theme->get('Name') === 'codoc') {
702 + $from = 'wp_codoc';
703 + }
516 704 //$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
517 705 $current_url = admin_url('options-general.php') . '?page=codoc';
518 - $login_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/me/token?from=wp&return_url=' . urlencode($current_url));
519 - $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));
520 709 // submitを消しておく
521 - echo ('<script type="text/javascript">window.onload=function(){document.getElementById(\'submit\').style.display = \'none\'}</script>');
522 - echo ('codocをWordPressでご利用いただくには認証が必要です。<br />');
523 - echo sprintf('ユーザーコードとAPIトークンを<a href="%s&auth_by_myself=1">直接入力</a>することでも認証できます。<br /><br />',$current_url);
524 - 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 + }
525 728
526 -
527 729 },
528 730 'codoc',
529 731 'setting_section_id'
530 732 );
@@ -547,9 +749,9 @@
547 749 'ユーザーコード',
548 750 function() {
549 751 global $CODOC_USERCODE;
550 752 echo '<input type="hidden" name="auth_by_myself" value="1">';
551 - 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));
552 754 },
553 755 'codoc',
554 756 'setting_section_id'
555 757 );
@@ -557,9 +759,9 @@
557 759 'codoc_token',
558 760 'APIトークン',
559 761 function() {
560 762 global $CODOC_TOKEN;
561 - 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));
562 764 },
563 765 'codoc',
564 766 'setting_section_id'
565 767 );
@@ -581,9 +783,9 @@
581 783 $data = $this->util->get_support_entry([],[
582 784 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
583 785 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
584 786 ]);
585 - if ($data->status and $entry = $data->entry) {
787 + if ($data and $data->status and $entry = $data->entry) {
586 788 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,$entry->code);
587 789 } else {
588 790 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
589 791 }
@@ -590,9 +792,9 @@
590 792 } elseif(isset($CODOC_SETTINGS['always_show_support']) and !$CODOC_SETTINGS['always_show_support']) {
591 793 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
592 794 }
593 795 });
594 -
796 +
595 797 add_action('updated_option',function(){
596 798 global $CODOC_RE_AUTHORIZE;
597 799 if ($CODOC_RE_AUTHORIZE) {
598 800 //$data = $this->callAPI('GET','');
@@ -600,12 +802,9 @@
600 802 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
601 803 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
602 804 ]);
603 805 if ($data->status and $user = $data->user) {
604 - update_option(CODOC_AUTHINFO_OPTION_NAME,[
605 - 'email' => $user->email,
606 - 'name' => $user->name,
607 - ]);
806 + $this->update_codoc_authinfo($user);
608 807 } else {
609 808 update_option(CODOC_AUTHINFO_OPTION_NAME,'');
610 809 }
611 810 }
@@ -614,9 +813,9 @@
614 813 });
615 814 // プラグイン一覧に設定のリンクをいれる
616 815 add_filter( 'plugin_action_links_' . plugin_basename( plugin_dir_path( __FILE__ ) . 'codoc' . '.php' ),
617 816 function( $links ) {
618 - $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') ) );
619 818 array_unshift( $links, $setting_link );
620 819
621 820 return $links;
622 821 }
@@ -638,8 +837,13 @@
638 837 // プラグイン内で使うCSRF を生成
639 838 $path = plugins_url( 'codoc/src_mce/codoc-editor-onload.js', __DIR__ );
640 839 wp_enqueue_script( 'codoc-editor-onload', $path, array('jquery'), '', true );
641 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();
642 846 wp_localize_script(
643 847 'codoc-editor-onload',
644 848 'CODOCEDITOR',
645 849 array(
@@ -649,8 +853,12 @@
649 853 'codoc_url' => $this->get_codoc_url(),
650 854 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
651 855 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
652 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,
653 861 )
654 862 );
655 863
656 864 // ここでtinymceのプラグイン追加
@@ -667,13 +875,58 @@
667 875 add_filter( 'mce_buttons', function( $buttons ) {
668 876 array_push( $buttons, "|", "codoc" );
669 877 return $buttons;
670 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 + }
671 896
897 + return $settings;
898 + },1000000);
672 899 }
673 900 }
674 901 } );
675 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 + // 保存用コンテンツにフィルターを実施する
676 929 public function get_filtered_content($post_emulated) {
677 930 // 記事ページであることをエミュレートしてフィルター実行
678 931 $post_backuped = null;
679 932 if (isset($GLOBALS['post'])) {
@@ -684,13 +937,18 @@
684 937 $wp_query_backuped = null;
685 938 if (isset($GLOBALS['wp_query'])) {
686 939 $wp_query_backuped = $GLOBALS['wp_query'];
687 940 $wp_query = $GLOBALS['wp_query'];
688 - $is_single_backuped = $wp_query->is_single;
689 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 +
690 948 $wp_query->post = $post_emulated;
691 949 $wp_query->queried_object = $post_emulated;
692 - $wp_query->queried_object_id = $post_emulated->id;
950 + $wp_query->queried_object_id = $post_emulated->ID;
693 951
694 952 $GLOBALS['wp_query'] = $wp_query;
695 953 }
696 954 // $this->the_content でオリジナルを返してもらうため
@@ -698,8 +956,29 @@
698 956 $content = preg_replace(
699 957 '/ (\/)?wp:codoc\/codoc-block /',' \\1wptmp:codoc/codoc-block ',
700 958 $post_emulated->post_content
701 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 + }
702 981 #$content = do_shortcode( $content );
703 982 $content_filtered = apply_filters( 'the_content', $content);
704 983 $this->do_not_filter_the_content = false;
705 984
@@ -712,9 +991,8 @@
712 991 $content_filtered = preg_replace(
713 992 '/ (\/)?wptmp:codoc\/codoc-block /',' \\1wp:codoc/codoc-block ',
714 993 $content_filtered
715 994 );
716 -
717 995 return $content_filtered;
718 996 }
719 997
720 998 public function save_post($post_ID,$post,$update) {
@@ -721,8 +999,13 @@
721 999 if (preg_match('/^(auto-draft|inherit)$/',$post->post_status)) {
722 1000 return;
723 1001 }
724 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 + }
725 1008 $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME);
726 1009 $post_content = (isset($codoc_settings['do_not_filter_the_content']) and $codoc_settings['do_not_filter_the_content']) ?
727 1010 $post->post_content : $this->get_filtered_content($post);
728 1011 $res = $this->util->sync_entry([
@@ -727,9 +1010,10 @@
727 1010 $post->post_content : $this->get_filtered_content($post);
728 1011 $res = $this->util->sync_entry([
729 1012 "post_title" => $post->post_title,
730 1013 "post_content" => $post_content,
731 - "post_status" => ($post->post_status == 'publish' ? 1 : 0),
1014 + // password が設定されてる場合は限定公開にする
1015 + "post_status" => $post->post_status == 'publish' ? ($post->post_password ? 2 : 1) : 0,
732 1016 "post_permalink" => get_permalink($post_ID),
733 1017 "codoc_entry_code" => $entryCode,
734 1018 "codoc_settings" => $codoc_settings,
735 1019 ],[
@@ -735,20 +1019,44 @@
735 1019 ],[
736 1020 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
737 1021 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
738 1022 ]);
739 -
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 + }
740 1033 if (is_object($res) and $res->status and !$entryCode) {
741 - 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 + }
742 1042 }
743 -
744 1043 return true;
745 1044 }
746 1045 function updated_post_meta( $meta_ID, $post_ID, $meta_key ) {
747 - 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') {
748 1049 return;
749 1050 }
750 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 + }
751 1059 $attachment = wp_get_attachment_metadata( get_post_thumbnail_id($post_ID));
752 1060 $upload_dir = wp_upload_dir();
753 1061 $file_path = sprintf ('%s/%s',$upload_dir['basedir'],$attachment['file']);
754 1062
@@ -773,9 +1081,25 @@
773 1081 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
774 1082 ]
775 1083 );
776 1084 }
777 -
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 + }
778 1102 function the_content( $post_content ) {
779 1103 if ( is_single() && in_the_loop() && is_main_query() ) {
780 1104 }
781 1105 // get_filtered_content から do_not_filter_the_contentを有効にされるパターン
@@ -783,8 +1107,12 @@
783 1107 if ($this->do_not_filter_the_content) {
784 1108 return $post_content;
785 1109 }
786 1110 $post = get_post();
1111 + // 20211215 null になる場合がある
1112 + if (!$post) {
1113 + return $post_content;
1114 + }
787 1115 # is_amp で実装しているテンプレート用
788 1116 $is_amp_endpoint = (function_exists('is_amp_endpoint') && is_amp_endpoint()) ? true :
789 1117 ((function_exists('is_amp') && is_amp()) ? true : false);
790 1118 return $this->util->filter_content([
@@ -802,6 +1130,50 @@
802 1130 if (is_array($allowed_blocks)) {
803 1131 array_push($allowed_blocks,'codoc/codoc-block');
804 1132 }
805 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 + }
806 1178 }
807 1179 }