PluginProbe
codoc / 0.9.47
codoc v0.9.47
0.9.8.8 0.9.8.9 0.9.9 0.9.9.1 trunk 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.8.1 0.8.2 0.8.3 0.8.4 0.8.6 0.8.7 0.8.8 0.8.9 0.9 0.9.1 0.9.10 0.9.11 All 114 releases
codoc / class-codoc.php

class-codoc.php in codoc 0.9.47, at class-codoc.php

1,049 lines 60.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 require_once(plugin_dir_path( __FILE__ ) .'class-codoc-util.php');
3 final class Codoc {
4
5 public function __construct() {
6 if (is_admin()) {
7 // setting
8 $this->add_settings();
9 }
10
11 // usercode, token はadminページのみDBから取得する
12 $this->util = new CodocUtil([ 'usercode' => null, 'token' => null, 'codoc_url' => $this->get_codoc_url() ]);
13
14 # the_content フィルタを実行しない状�
15
16 $this->do_not_filter_the_content = false;
17
18 // paywall用の本文非表示化とcodocタグへの属性追加
19 #$priority = 999999999;
20 $priority = 100000; # フィルターは最後に実施する default 10
21 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
22 if (isset($CODOC_SETTINGS["debug_params"])) {
23 $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
24 if (isset($params_decoded["the_content_filter_priority"])) {
25 $priority = $params_decoded["the_content_filter_priority"];
26 }
27 }
28 // ショーココードの退避
29 if (isset($CODOC_SETTINGS['shortcode_evacuation']) and $CODOC_SETTINGS['shortcode_evacuation']) {
30 add_filter('the_content',[$this,'the_content_shortcode_evacuations'],0);
31 }
32 add_filter('the_content',[$this,'the_content'],$priority);
33 // 2021-09-24 the_content を利用しない場合は個別に呼び出ししてもらう
34 add_filter('codoc_the_content',[$this,'the_content'],$priority);
35
36 // 2020-07-25 excerpt対応
37 add_filter('excerpt_allowed_blocks',[$this,'excerpt_allowed_blocks']);
38
39 $auth_info = get_option(CODOC_AUTHINFO_OPTION_NAME);
40
41 if ($auth_info) {
42 // データ同期 (save_postはis_adminで実行されないケースがある)
43 add_action( 'save_post', [$this,'save_post'], 20, 3 );
44 add_action( 'added_post_meta', [$this,'updated_post_meta'], 10, 3 );
45 add_action( 'updated_post_meta',[$this,'updated_post_meta'], 10, 3 );
46 add_action( 'deleted_post_meta',[$this,'deleted_post_meta'], 10, 4 );
47 }
48 global $pagenow;
49 //管理画面でcodoc認証があり投稿画面の場合
50 if (is_admin() and $auth_info and preg_match('/^post/',$pagenow)) {
51 // Gutenberg のサポートがない場合は何もしない
52 if ( function_exists( 'register_block_type' ) ) {
53 // WPに登録ブロックとして認識させる(cgbは登録しないっぽい)
54 \WP_Block_Type_Registry::get_instance()->register('codoc/codoc-block');
55 // gutenberg
56 require_once 'src/init.php';
57 add_action('wp_loaded', function() {
58 wp_localize_script('wordpress-cgb-block-js', 'OPTIONS', array(
59 'codoc_url' => $this->get_codoc_url(),
60 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
61 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
62 'codoc_sdk_path' => CODOC_SDK_PATH,
63 ));
64 });
65 }
66 // tinymce
67 $this->add_mce();
68 } elseif(is_admin() and $auth_info and preg_match('/^edit/',$pagenow)) {
69 // 記事編集ページ
70 } elseif(!is_admin()) { // ブログ画面
71 // codocのJS登録
72 add_action( 'wp_enqueue_scripts', function() {
73 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
74 $load_script_condition = '';
75 if (isset($CODOC_SETTINGS["debug_params"]) and
76 $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true) and
77 isset($params_decoded["load_script_condition"])
78 ) {
79 $load_script_condition = $params_decoded["load_script_condition"];
80 }
81 if ($load_script_condition == 'not_list_page') {
82 // not_list_pageの場合はトップページ等でスクリプトをロードしない
83 if (!(is_archive() or is_category() or is_home() or is_front_page())) {
84 wp_enqueue_script( 'codoc-injector-js', $this->get_codoc_url() . '/js/cms.js' );
85 }
86 } else {
87 wp_enqueue_script( 'codoc-injector-js', $this->get_codoc_url() . '/js/cms.js' );
88 }
89 });
90 //登録したscriptタグに属性をつける
91 add_filter('script_loader_tag', [$this,'modifier_script_tag'],10,2);
92 // tinymce用のショートコード
93 add_shortcode('codoc', [$this, 'injector_shortcode']);
94 // テーマをbodyにも反映
95 add_filter('body_class', function($classes) {
96 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
97 $css_path = 'blue';
98 if (isset($CODOC_SETTINGS["css_path"]) and $CODOC_SETTINGS["css_path"]) {
99 $css_path = $CODOC_SETTINGS["css_path"];
100 }
101 array_push($classes,sprintf( "codoc-theme-%s",$css_path));
102 return $classes;
103 });
104
105 }
106 return $this;
107 }
108 public function get_codoc_url() {
109 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
110 if (isset($CODOC_SETTINGS["debug_params"])) {
111 $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
112 if (isset($params_decoded["codoc_url"])) {
113 return $params_decoded["codoc_url"];
114 }
115 }
116 return CODOC_URL;
117 }
118 public function modifier_script_tag($tag,$handle) {
119 if($handle !== 'codoc-injector-js') {
120 return $tag;
121 }
122 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
123 $data_css = '';
124 if ($css_path = $CODOC_SETTINGS['css_path']) {
125 $data_css = sprintf(' data-css="%s" ',$css_path);
126 }
127 // connect用パラメータ
128 $connect_attributes = '';
129 if (isset($CODOC_SETTINGS["codoc_connect_code"])) {
130 $connect_code = $CODOC_SETTINGS["codoc_connect_code"];
131 $connect_attributes = sprintf(' data-connect-code="%s"',$connect_code);
132 $tag = preg_replace('/cms\.js/','cms-connect.js',$tag);
133 }
134 if (isset($CODOC_SETTINGS["codoc_connect_registration_mode"]) and $CODOC_SETTINGS["codoc_connect_registration_mode"]) {
135 $connect_attributes = $connect_attributes .
136 sprintf(' data-connect-registration-mode="%s"',$CODOC_SETTINGS["codoc_connect_registration_mode"]);
137 }
138
139 $usercode_attributes = '';
140 $user_code = get_option(CODOC_USERCODE_OPTION_NAME);
141 if ($user_code) {
142 $usercode_attributes = sprintf(' data-usercode="%s"',$user_code);
143 }
144
145 $setting_attributes = '';
146 if (isset($CODOC_SETTINGS['codoc_script_tag_attributes']) and $CODOC_SETTINGS['codoc_script_tag_attributes']) {
147 $setting_attributes = $CODOC_SETTINGS['codoc_script_tag_attributes'];
148 }
149 //return str_replace(' src=', $data_css . ' defer src=', $tag);
150 return preg_replace('/(src=[^>]+)/',' ${1} ' . $data_css . $connect_attributes . $usercode_attributes . $setting_attributes . ' defer',$tag);
151 }
152 public function injector_shortcode($atts) {
153 global $post;
154 ob_start();
155 require 'views/codoc-injector.php';
156 return ob_get_clean();
157 }
158 # settings / 設定関連
159 public function add_settings() {
160 global $CODOC_SETTINGS;
161 add_action( 'admin_menu' ,function(){
162 add_options_page(
163 'codoc の設定', //ページタイトル
164 'codoc', //設定メニューに表示されるメニュータイトル
165 'edit_users', //権限
166 'codoc', //設定ページのURL。options-general.php?page=codoc
167 function() {
168 echo '<div class="codoc-settings">';
169 echo '<form method="post" action="options.php">';
170 settings_fields( 'codoc_option_group' );
171 do_settings_sections( 'codoc' );
172 submit_button(); // 送信ボタン
173 echo '</form></div>';
174 }
175 );
176 });
177
178 add_action('admin_print_styles', 'codoc_admin_styles');
179 function codoc_admin_styles($hook) {
180 wp_enqueue_style('codoc-options-style', plugins_url( 'codoc/css/codoc-options.css', __DIR__ ));
181 }
182 add_action( "admin_init", function() {
183 global $CODOC_USERCODE;
184 global $CODOC_SETTINGS;
185 global $CODOC_TOKEN;
186 global $CODOC_AUTHINFO;
187 // codocからの認証データ処理
188 if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['fetch_token_key'])) {
189 $key = sanitize_text_field($_GET['fetch_token_key']);
190 $usercode = sanitize_text_field($_GET['usercode']);
191 update_option(CODOC_USERCODE_OPTION_NAME,$usercode);
192 //$data = $this->callAPI('GET','/token',[ "fetch_token_key" => $key ]);
193 $data = $this->util->get_token([ "fetch_token_key" => $key ],["usercode" => $usercode, "token" => "1"]);
194 if ($data->status and $token = $data->token) {
195 update_option(CODOC_TOKEN_OPTION_NAME,$token);
196 //$data = $this->callAPI('GET','');
197 $data = $this->util->get_user_info([],["usercode" => $usercode, "token" => $token]);
198 if ($data->status and $user = $data->user) {
199 $this->update_codoc_authinfo($user);
200 }
201 #$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
202 #$current_url = preg_replace('/(.*)fetch_token_key.*/','${1}&codoc_auth_finished=1',$current_url);
203 //add_settings_error( 'general', 'settings_updated', __( 'OK' ), 'success' );
204 $current_url = admin_url('options-general.php') . '?page=codoc&codoc_auth_finished=1';
205
206 wp_redirect( $current_url);
207 exit;
208 }
209 }
210 $CODOC_USERCODE = get_option(CODOC_USERCODE_OPTION_NAME);
211 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
212 $CODOC_TOKEN = get_option(CODOC_TOKEN_OPTION_NAME);
213 $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
214 if( !$CODOC_SETTINGS ) {
215 //デフォルト値
216 $CODOC_SETTINGS = array(
217 'css_path' => '',
218 );
219 update_option( CODOC_SETTINGS_OPTION_NAME, $CODOC_SETTINGS );
220 }
221 if (!isset($CODOC_SETTINGS['str_replace_binded_url_from'])) {
222 $CODOC_SETTINGS['str_replace_binded_url_from'] = '';
223 }
224 if (!isset($CODOC_SETTINGS['str_replace_binded_url_to'])) {
225 $CODOC_SETTINGS['str_replace_binded_url_to'] = '';
226 }
227 if (!isset($CODOC_SETTINGS['str_before_codoc_tag'])) {
228 $CODOC_SETTINGS['str_before_codoc_tag'] = '';
229 }
230 if (!isset($CODOC_SETTINGS['str_after_codoc_tag'])) {
231 $CODOC_SETTINGS['str_after_codoc_tag'] = '';
232 }
233
234 if (!isset($CODOC_SETTINGS['always_show_support'])) {
235 $CODOC_SETTINGS['always_show_support'] = '0';
236 }
237 if (!isset($CODOC_SETTINGS['show_support_message'])) {
238 $CODOC_SETTINGS['show_support_message'] = '';
239 }
240 if (!isset($CODOC_SETTINGS['show_support_categories'])) {
241 $CODOC_SETTINGS['show_support_categories'] = '';
242 }
243 if (!isset($CODOC_SETTINGS['show_support_location'])) {
244 $CODOC_SETTINGS['show_support_location'] = 'bottom';
245 }
246 if (!isset($CODOC_SETTINGS['do_not_filter_the_content'])) {
247 $CODOC_SETTINGS['do_not_filter_the_content'] = '0';
248 }
249 if (!isset($CODOC_SETTINGS['shortcode_evacuation'])) {
250 $CODOC_SETTINGS['shortcode_evacuation'] = '0';
251 }
252
253 if (!isset($CODOC_SETTINGS['entry_button_text'])) {
254 $CODOC_SETTINGS['entry_button_text'] = '';
255 }
256 if (!isset($CODOC_SETTINGS['subscription_button_text'])) {
257 $CODOC_SETTINGS['subscription_button_text'] = '';
258 }
259 if (!isset($CODOC_SETTINGS['support_button_text'])) {
260 $CODOC_SETTINGS['support_button_text'] = '';
261 }
262 if (!isset($CODOC_SETTINGS['subscription_message'])) {
263 $CODOC_SETTINGS['subscription_message'] = '';
264 }
265 if (!isset($CODOC_SETTINGS['support_message'])) {
266 $CODOC_SETTINGS['support_message'] = '';
267 }
268 if (!isset($CODOC_SETTINGS['show_like'])) {
269 $CODOC_SETTINGS['show_like'] = '1';
270 }
271 if (!isset($CODOC_SETTINGS['show_about_codoc'])) {
272 $CODOC_SETTINGS['show_about_codoc'] = '1';
273 }
274 if (!isset($CODOC_SETTINGS['show_powered_by'])) {
275 $CODOC_SETTINGS['show_powered_by'] = '1';
276 }
277 if (!isset($CODOC_SETTINGS['show_created_by'])) {
278 $CODOC_SETTINGS['show_created_by'] = '1';
279 }
280 if (!isset($CODOC_SETTINGS['show_copyright'])) {
281 $CODOC_SETTINGS['show_copyright'] = '1';
282 }
283 if (!isset($CODOC_SETTINGS['codoc_tag_attributes'])) {
284 $CODOC_SETTINGS['codoc_tag_attributes'] = '';
285 }
286 if (!isset($CODOC_SETTINGS['codoc_script_tag_attributes'])) {
287 $CODOC_SETTINGS['codoc_script_tag_attributes'] = '';
288 }
289 if (!isset($CODOC_SETTINGS['codoc_connect_code'])) {
290 $CODOC_SETTINGS['codoc_connect_code'] = '';
291 }
292 if (!isset($CODOC_SETTINGS['codoc_connect_registration_mode'])) {
293 $CODOC_SETTINGS['codoc_connect_registration_mode'] = '';
294 }
295 if (!isset($CODOC_SETTINGS['debug_params'])) {
296 $CODOC_SETTINGS['debug_params'] = '';
297 }
298 add_settings_section(
299 'setting_section_id', // id
300 'codoc 設定ページ', // title
301 function (){}, // callback
302 'codoc' // page
303 );
304 // 認証がある場合
305 if ($CODOC_AUTHINFO) {
306 // クリエイター�
307 報だけ更新 (POST時に同期をとる)
308 if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['settings-updated'])) {
309 $data = $this->util->get_user_info([],[
310 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
311 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
312 ]);
313 if ($data->status and $user = $data->user) {
314 $this->update_codoc_authinfo($user);
315 // 一度get_optionしてるのでリロードする
316 $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
317 }
318 }
319
320 register_setting(
321 'codoc_option_group', // option group
322 CODOC_SETTINGS_OPTION_NAME // option name(DB)
323 );
324 add_settings_field(
325 'css_path', // id
326 'テーマ', // title
327 function() {
328 global $CODOC_SETTINGS;
329 echo '<div class="excerpt">テーマを指定してペイウォールのデザインを変えることができます。<br>パスを指定を選択することでCSSを直接指定するこもと可能です。</div>';
330 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']);
331 echo '' .
332 '<script type="text/javascript"> ' .
333 ' function gen_css_path(select) { ' .
334 ' if (select.value == "dark") { ' .
335 ' document.getElementById("darkmode-caution").style.display="block";' .
336 ' } else { ' .
337 ' if (document.getElementById("darkmode-caution")) { ' .
338 ' document.getElementById("darkmode-caution").style.display="none";' .
339 ' } ' .
340 ' } ' .
341 ' if (select.value == "path") { ' .
342 ' document.getElementById("codoc_css_path").readOnly=false; ' .
343 ' if (!document.getElementById("codoc_css_path").value.match(/\//g)) {' .
344 ' document.getElementById("codoc_css_path").value=""; ' .
345 ' } ' .
346 ' } else { ' .
347 ' document.getElementById("codoc_css_path").readOnly=true; ' .
348 ' document.getElementById("codoc_css_path").value=select.value; ' .
349 ' } ' .
350 ' } ' .
351 '</script> ' ;
352
353 echo sprintf('<select name="theme_name" onChange="gen_css_path(this)" id="codoc_theme_select">');
354 foreach (["blue","red","green","black","dark","blue-square","red-square","green-square","black-square","dark-square"] as $theme) {
355 if ($theme == "blue") {
356 echo sprintf('<option value="%s" %s>青</option>', $theme, ($CODOC_SETTINGS["css_path"] == "blue" ? "selected" : ""));
357 }
358 if ($theme == "red") {
359 echo sprintf('<option value="%s" %s>赤</option>', $theme, ($CODOC_SETTINGS["css_path"] == "red" ? "selected" : ""));
360 }
361 if ($theme == "green") {
362 echo sprintf('<option value="%s" %s>緑</option>', $theme, ($CODOC_SETTINGS["css_path"] == "green" ? "selected" : ""));
363 }
364 if ($theme == "black") {
365 echo sprintf('<option value="%s" %s>黒</option>', $theme, ($CODOC_SETTINGS["css_path"] == "black" ? "selected" : ""));
366 }
367 if ($theme == "dark") {
368 echo sprintf('<option value="%s" %s>ダークモード</option>', $theme, ($CODOC_SETTINGS["css_path"] == "dark" ? "selected" : ""));
369 }
370 if ($theme == "blue-square") {
371 echo sprintf('<option value="%s" %s>青(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "blue-square" ? "selected" : ""));
372 }
373 if ($theme == "red-square") {
374 echo sprintf('<option value="%s" %s>赤(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "red-square" ? "selected" : ""));
375 }
376 if ($theme == "green-square") {
377 echo sprintf('<option value="%s" %s>緑(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "green-square" ? "selected" : ""));
378 }
379 if ($theme == "black-square") {
380 echo sprintf('<option value="%s" %s>黒(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "black-square" ? "selected" : ""));
381 }
382 if ($theme == "dark-square") {
383 echo sprintf('<option value="%s" %s>ダークモード(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "dark-square" ? "selected" : ""));
384 }
385 }
386 echo sprintf('<option value="path" %s>パス指定</option>', (preg_match("/\//",$CODOC_SETTINGS["css_path"]) ? "selected" : ""));
387 echo '<script type="text/javascript">gen_css_path(document.getElementById(\'codoc_theme_select\'))</script>';
388 echo sprintf('</select></div>');
389 echo '<p id="darkmode-caution" style="display:none">ダークモード向けテーマは文字色が白となり、背景色によっては文字が見えない状�
390 �となるためご注意ください。</p>';
391 },
392 'codoc', //page
393 'setting_section_id' //Section
394 );
395 add_settings_field(
396 'paywall_text', // id
397 '各種文言', // title
398 function() {
399 global $CODOC_SETTINGS;
400 global $CODOC_AUTHINFO;
401 echo '<div class="excerpt">ペイウォール�
402 の一部文言を変更できます。</div>';
403 echo '<table class="innerTable"><tbody>';
404 echo '<tr><th>いいねの表示</th><td>';
405 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" : ""));
406 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" : ""));
407 echo '</td></tr>';
408
409 echo '<tr><th>PoweredByの表示</th><td>';
410 echo sprintf('<input type="hidden" value="1" name="%s[show_about_codoc]">',CODOC_SETTINGS_OPTION_NAME);
411 echo sprintf('<input type="hidden" value="1" name="%s[show_created_by]">',CODOC_SETTINGS_OPTION_NAME);
412 echo sprintf('<input type="hidden" value="1" name="%s[show_powered_by]">',CODOC_SETTINGS_OPTION_NAME);
413 if (isset($CODOC_AUTHINFO['account_is_pro']) and $CODOC_AUTHINFO['account_is_pro']) {
414 echo sprintf('<input type="radio" value="1" name="%s[show_copyright]" id="show_copyright_on" %s><label for="show_copyright_on">する</label> ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_copyright'] == '1' ? "checked" : ""));
415 echo sprintf('<input type="radio" value="0" name="%s[show_copyright]" id="show_copyright_off" %s><label for="show_copyright_off">しない</label> <br / >',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_copyright'] == '0' ? "checked" : ""));
416 } else {
417 echo 'PROアカウントのみ非表示化できます。';
418 }
419 echo '</td></tr>';
420
421 echo '<tr><th>記事購�
422 �ボタンのテキスト</th><td>';
423 echo sprintf('<input type="text" name="%s[entry_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['entry_button_text']));
424 echo '</td></tr>';
425
426 echo '<tr><th>サブスクリプション購�
427 �ボタンのテキスト</th><td>';
428 echo sprintf('<input type="text" name="%s[subscription_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_button_text']));
429 echo '</td></tr>';
430
431 echo '<tr><th>サポートボタンのテキスト</th><td>';
432 echo sprintf('<input type="text" name="%s[support_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_button_text']));
433 echo '</td></tr>';
434
435 echo '<tr><th>「サブスクリプションに含まれる記事」のテキスト</th><td>';
436 echo sprintf('<input type="text" name="%s[subscription_message]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_message']));
437 echo '</td></tr>';
438
439 echo '<tr><th>サポート説明のテキスト</th><td>';
440 echo sprintf('<input type="text" name="%s[support_message]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_message']));
441 echo '</td></tr>';
442
443 echo '</tbody></table>';
444 },
445 'codoc', //page
446 'setting_section_id' //Section
447 );
448
449 add_settings_field(
450 'codoc_tag_attributes', // id
451 'codocタグの属性', // title
452 function() {
453 global $CODOC_SETTINGS;
454 echo '<div class="excerpt">codocタグに特定の属性を追加することができます。</div>';
455 echo sprintf('<input type="text" name="%s[codoc_tag_attributes]" value="%s">',CODOC_SETTINGS_OPTION_NAME,htmlspecialchars($CODOC_SETTINGS['codoc_tag_attributes']));
456 },
457 'codoc', //page
458 'setting_section_id' //Section
459 );
460 add_settings_field(
461 'codoc_script_tag_attributes', // id
462 'codoc scriptタグの属性', // title
463 function() {
464 global $CODOC_SETTINGS;
465 echo '<div class="excerpt">codoc scriptタグに特定の属性を追加することができます。</div>';
466 echo sprintf('<input type="text" name="%s[codoc_script_tag_attributes]" value="%s">',CODOC_SETTINGS_OPTION_NAME,htmlspecialchars($CODOC_SETTINGS['codoc_script_tag_attributes']));
467 },
468 'codoc', //page
469 'setting_section_id' //Section
470 );
471 add_settings_field(
472 'str_replace_binded_url', // id
473 'パーマリンク', // title
474 function() {
475 global $CODOC_SETTINGS;
476 echo '<div class="excerpt">codoc側に登録するパーマリンクを置換することができます。</div>';
477 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']));
478 echo ('<span class="suptext"></span>');
479 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']));
480 echo ('に変換');
481 },
482 'codoc', //page
483 'setting_section_id' //Section
484 );
485
486 add_settings_field(
487 'str_around_codoc_tag', // id
488 'HTMLの挿�
489 �', // title
490 function() {
491 global $CODOC_SETTINGS;
492 echo '<div class="excerpt">codocタグの前後にHTMLを挿�
493 �することができます。</div>';
494 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']));
495 echo ('を前に挿�
496 �</div>');
497 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']));
498 echo ('を後に挿�
499 �</div>');
500
501 },
502 'codoc', //page
503 'setting_section_id' //Section
504 );
505
506 add_settings_field(
507 'always_show_support_tag', // id
508 'サポートの自動挿�
509 �', // title
510 function() {
511 global $CODOC_SETTINGS;
512 echo '<div class="excerpt">codocブロックを挿�
513 �することなく投稿にサポート機能を追加します</div>';
514 echo '<table class="innerTable"><tbody>';
515 echo '<tr><th>自動挿�
516 �</th><td>';
517 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" : ""));
518 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" : ""));
519 echo '</td></tr>';
520 echo '<tr><th>表示位置</th><td>';
521 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" : ""));
522 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" : ""));
523 echo '</td></tr>';
524 echo '<tr><th>説明文</th><td>';
525 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']));
526 echo '</td></tr>';
527 echo '<tr><th>対象カテゴリ名</th><td>';
528 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']));
529 echo '</td></tr>';
530 echo '</tbody></table>';
531
532 },
533 'codoc', //page
534 'setting_section_id' //Section
535 );
536 add_settings_field(
537 'do_not_filter_the_content', // id
538 '支障が出る処理を無効化', // title
539 function() {
540 global $CODOC_SETTINGS;
541 echo '<div class="excerpt">codocの動作に支障が出る他のプラグインによる<strong>フィルター処理</strong>を無効化(ショートコードも動作しなくなります)できます。codocが上手く動かない場合のみ利用してください。</div>';
542 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" : ""));
543 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" : ""));
544 },
545 'codoc', //page
546 'setting_section_id' //Section
547 );
548
549 add_settings_field(
550 'shortcode_evacuation', // id
551 'ショートコード対策', // title
552 function() {
553 global $CODOC_SETTINGS;
554 echo '<div class="excerpt">有料パートに記述したショートコードが想定通りに動作しない場合にご利用ください。尚、当該ショートコードの実行結果は通常見えない状�
555 �となりますがソースコード閲覧等により閲覧することも可能となるためご注意ください。</div>';
556 echo sprintf('<input type="radio" value="1" name="%s[shortcode_evacuation]" id="shortcode_evacuation_on" %s><label for="shortcode_evacuation_on">する</label> ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['shortcode_evacuation'] == '1' ? "checked" : ""));
557 echo sprintf('<input type="radio" value="0" name="%s[shortcode_evacuation]" id="shortcode_evacuation_off" %s><label for="shortcode_evacuation_off">しない</label> ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['shortcode_evacuation'] == '0' ? "checked" : ""));
558 },
559 'codoc', //page
560 'setting_section_id' //Section
561 );
562
563 add_settings_field(
564 'debug_params', // id
565 'デバック用', // title
566 function() {
567 global $CODOC_SETTINGS;
568 echo '<div class="excerpt">デバック用のパラメーターを指定できます。codocサポートから依頼がある場合のみ利用してください。</div>';
569 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']));
570 },
571 'codoc', //page
572 'setting_section_id' //Section
573 );
574
575 add_settings_field(
576 'cretor_info', // id
577 'クリエイター�
578 ', // title
579 function() {
580 global $CODOC_SETTINGS;
581 global $CODOC_AUTHINFO;
582 echo sprintf('<p><font id="codoc-update-creator-info-message"></font></p>',"");
583 // 変更を保存時に常に同期するのでこの表示は�
584 要ないがUI上保持しておく
585 $script = "document.getElementById('codoc-update-creator-info-message').innerText='�
586 報を更新するには変更を保存してください';document.getElementById('codoc-update-creator-info-message').color='red';";
587 if (isset($CODOC_AUTHINFO['profile_image_url'])) {
588 echo sprintf('<img src="%s" width="40" height="40" />',$CODOC_AUTHINFO['profile_image_url']);
589 }
590 echo sprintf('<p>%s%s</p>',$CODOC_AUTHINFO['name'],((isset($CODOC_AUTHINFO['account_is_pro']) and $CODOC_AUTHINFO['account_is_pro']) ? ' [PRO] ' : ''));
591 if ($connect_code = $CODOC_SETTINGS['codoc_connect_code']) {
592 echo sprintf('<p>外部サービス連携済(連携コード:%s) %s</p>',
593 $connect_code,
594 ($CODOC_SETTINGS['codoc_connect_registration_mode'] == 'dedicated' ? '<br/> <strong>オーディエンスはプライベートアカウントとする</strong>' : ''));
595 }
596 echo sprintf('<p>�
597 報を<a href="javascript:void(0);" onClick="' . $script . '">更新する</a></p>');
598 echo ('<p>codoc側でロゴやカバー画像を変更した場合は都度更新を行ってください</p>');
599 },
600 'codoc', //page
601 'setting_section_id' //Section
602 );
603
604 register_setting(
605 'codoc_option_group', // option group
606 CODOC_USERCODE_OPTION_NAME
607 );
608 register_setting(
609 'codoc_option_group', // option group
610 CODOC_TOKEN_OPTION_NAME
611 );
612
613 if (isset($_GET['codoc_auth_finished']) and $_GET['codoc_auth_finished']) {
614 add_settings_error( 'general', 'settings_updated', __( 'codocの認証が完了しました' ), 'success' );
615 }
616
617 add_settings_field(
618 'codoc_auth',
619 '認証',
620 function() {
621 global $CODOC_USERCODE;
622 global $CODOC_TOKEN;
623 global $CODOC_AUTHINFO;
624 $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';";
625
626 echo sprintf('<p><font color="green" id="codoc-auth-message"><strong>%s</strong> で認証済</font></p>',$CODOC_AUTHINFO['email']);
627
628 echo sprintf('<input id="codoc-usercode" type="hidden" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
629 echo sprintf('<input id="codoc-token" type="hidden" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
630 echo sprintf('<p>認証を<a href="javascript:void(0);" onClick="' . $script . '">解除する</p>');
631 },
632 'codoc',
633 'setting_section_id'
634 );
635
636 }
637
638 // ない場合
639 if (!$CODOC_AUTHINFO and !isset($_GET['auth_by_myself'])) {
640 add_settings_field(
641 'codoc_auth',
642 '認証',
643 function() {
644 $theme = wp_get_theme();
645 $from = 'wp';
646 if ($theme->get('Name') === 'codoc') {
647 $from = 'wp_codoc';
648 }
649 //$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
650 $current_url = admin_url('options-general.php') . '?page=codoc';
651 $login_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/me/token?from=' . $from . '&return_url=' . urlencode($current_url));
652 $register_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/register?from=' . $from . '&return_url=' . urlencode($current_url));
653 // submitを消しておく
654 echo ('<script type="text/javascript">window.onload=function(){document.getElementById(\'submit\').style.display = \'none\'}</script>');
655 echo ('codocをWordPressでご利用いただくには認証が�
656 要です。<br />');
657 echo sprintf('ユーザーコードとAPIトークンを<a href="%s&auth_by_myself=1">直接�
658 �力</a>することでも認証できます。<br /><br />',$current_url);
659 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);
660 if (!$this->util->health_check()) {
661 echo sprintf('<p style="color: red;">codocサーバーと通信ができません。サーバーやWordPress側でのファイヤーウォール設定にて https://codoc.jp への通信を許可してください。</p>');
662 }
663
664 },
665 'codoc',
666 'setting_section_id'
667 );
668 }
669 // ない場合かつ自分で認証する場合
670 if (!$CODOC_AUTHINFO and (
671 (isset($_GET['auth_by_myself']) and $_GET['auth_by_myself']) or
672 (isset($_POST['auth_by_myself']) and $_POST['auth_by_myself'])
673 )) {
674 register_setting(
675 'codoc_option_group', // option group
676 CODOC_USERCODE_OPTION_NAME
677 );
678 register_setting(
679 'codoc_option_group', // option group
680 CODOC_TOKEN_OPTION_NAME
681 );
682 add_settings_field(
683 'codoc_usercode',
684 'ユーザーコード',
685 function() {
686 global $CODOC_USERCODE;
687 echo '<input type="hidden" name="auth_by_myself" value="1">';
688 echo sprintf('<input type="text" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
689 },
690 'codoc',
691 'setting_section_id'
692 );
693 add_settings_field(
694 'codoc_token',
695 'APIトークン',
696 function() {
697 global $CODOC_TOKEN;
698 echo sprintf('<input type="text" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
699 },
700 'codoc',
701 'setting_section_id'
702 );
703 }
704
705 // 認証�
706 報を保存
707 add_action( 'update_option_' . CODOC_USERCODE_OPTION_NAME, function( $old_value, $new_value ) {
708 global $CODOC_RE_AUTHORIZE;
709 $CODOC_RE_AUTHORIZE = 1;
710 },9,2); // $hook, $function_to_add, $priority, $accepted_args
711 add_action( 'update_option_' . CODOC_TOKEN_OPTION_NAME, function( $old_value, $new_value ) {
712 global $CODOC_RE_AUTHORIZE;
713 $CODOC_RE_AUTHORIZE = 1;
714 },10,2);
715
716 add_action('update_option_' . CODOC_SETTINGS_OPTION_NAME,function(){
717 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
718 if (isset($CODOC_SETTINGS['always_show_support']) and $CODOC_SETTINGS['always_show_support']) {
719 $data = $this->util->get_support_entry([],[
720 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
721 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
722 ]);
723 if ($data and $data->status and $entry = $data->entry) {
724 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,$entry->code);
725 } else {
726 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
727 }
728 } elseif(isset($CODOC_SETTINGS['always_show_support']) and !$CODOC_SETTINGS['always_show_support']) {
729 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
730 }
731 });
732
733 add_action('updated_option',function(){
734 global $CODOC_RE_AUTHORIZE;
735 if ($CODOC_RE_AUTHORIZE) {
736 //$data = $this->callAPI('GET','');
737 $data = $this->util->get_user_info([],[
738 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
739 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
740 ]);
741 if ($data->status and $user = $data->user) {
742 $this->update_codoc_authinfo($user);
743 } else {
744 update_option(CODOC_AUTHINFO_OPTION_NAME,'');
745 }
746 }
747 });
748
749 });
750 // プラグイン一覧に設定のリンクをいれる
751 add_filter( 'plugin_action_links_' . plugin_basename( plugin_dir_path( __FILE__ ) . 'codoc' . '.php' ),
752 function( $links ) {
753 $setting_link = sprintf( '<a href="%s">%s</a>', esc_url( add_query_arg( 'page', 'codoc', admin_url( 'options-general.php' ) ) ), esc_html( '設定' ) );
754 array_unshift( $links, $setting_link );
755
756 return $links;
757 }
758 );
759
760 }
761 public function add_mce() {
762 add_action( 'admin_enqueue_scripts', function() {
763 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
764 return;
765 }
766 $current_screen = get_current_screen();
767 if ( ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) || ( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) ) {
768 // Gutenberg Editor
769 // なにもしない
770 } else {
771 // tinymce
772 if ( get_user_option( 'rich_editing' ) == 'true' ) {
773 // プラグイン�
774 で使うCSRF を生成
775 $path = plugins_url( 'codoc/src_mce/codoc-editor-onload.js', __DIR__ );
776 wp_enqueue_script( 'codoc-editor-onload', $path, array('jquery'), '', true );
777 // I just want to insert this global variables but i don't know how i can do it..
778 wp_localize_script(
779 'codoc-editor-onload',
780 'CODOCEDITOR',
781 array(
782 'action' => 'codoc_shortcodes',
783 'nonce' => wp_create_nonce( 'codoc_shortcodes' ),
784
785 'codoc_url' => $this->get_codoc_url(),
786 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
787 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
788 'codoc_sdk_path' => CODOC_SDK_PATH,
789 )
790 );
791
792 // ここでtinymceのプラグイン追加
793 //wp_enqueue_style( 'codoc-admin-style', plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
794 //add_editor_style( plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
795 wp_enqueue_style( 'codoc-admin-style', $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.css?c=' . date('Ymd') );
796 add_editor_style( $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.css' );
797
798 add_filter( 'mce_external_plugins', function( $plugin_array ) {
799 //$plugin_array['codoc'] = plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ );
800 $plugin_array['codoc'] = $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.js?c=' . date('Ymd');
801 return $plugin_array;
802 } );
803 add_filter( 'mce_buttons', function( $buttons ) {
804 array_push( $buttons, "|", "codoc" );
805 return $buttons;
806 } );
807 // 非SSL環境の場合、なぜかhttps -> httpsになってしまうので対策
808 // コメントタグが除去されることがあるらしいのでvalid_elementsに�
809 要なタグを追加 (EXPERIMENTAL)
810 add_filter( 'tiny_mce_before_init', function($settings) {
811 $settings['external_plugins'] = preg_replace('/"codoc":"http:/','"codoc":"https:',$settings['external_plugins']);
812 foreach (['valid_elements','extended_valid_elements'] as $valid_elements) {
813 if (isset($settings[$valid_elements])) {
814 $settings[$valid_elements] = $settings[$valid_elements] . ',div[*],p[*],img[*],--[*]';
815 }
816 }
817 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
818 if (isset($CODOC_SETTINGS["debug_params"])) {
819 $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
820 if (isset($params_decoded["mce_valid_elements"])) {
821 $settings['valid_elements'] = $params_decoded["mce_valid_elements"];
822 $settings['extended_valid_elements'] = $params_decoded["mce_valid_elements"];
823 }
824 }
825
826 return $settings;
827 },1000000);
828 }
829 }
830 } );
831 }
832 function update_codoc_authinfo($user) {
833 global $CODOC_SETTINGS;
834 global $CODOC_AUTHINFO;
835 if (property_exists($user,'connect_code') and $user->connect_code) {
836 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
837 $CODOC_SETTINGS['codoc_connect_code'] = $user->connect_code;
838 $CODOC_SETTINGS['codoc_connect_registration_mode'] = $user->connect_has_permission_dedicated_account ? 'dedicated' : '';
839 update_option(CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS);
840 }
841 return update_option(CODOC_AUTHINFO_OPTION_NAME,[
842 'email' => $user->email,
843 'name' => $user->name,
844 'profile_image_url' => $user->profile_image_url,
845 'cover_image_url' => $user->cover_image_url,
846 'connect_code' => property_exists($user,'connect_code') ? $user->connect_code : '',
847 'connect_image_url' => property_exists($user,'connect_image_url') ? $user->connect_image_url : '',
848 'account_is_pro' => property_exists($user,'account_is_pro') ? $user->account_is_pro : '',
849 'created_at' => property_exists($user,'created_at') ? $user->created_at : 0,
850 ]);
851 $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
852 return $CODOC_AUTHINFO;
853 }
854 // 保存用コンテンツにフィルターを実施する
855 public function get_filtered_content($post_emulated) {
856 // 記事ページであることをエミュレートしてフィルター実行
857 $post_backuped = null;
858 if (isset($GLOBALS['post'])) {
859 $post_backuped = $GLOBALS['post'];
860 }
861 $GLOBALS['post'] = $post_emulated;
862
863 $wp_query_backuped = null;
864 if (isset($GLOBALS['wp_query'])) {
865 $wp_query_backuped = $GLOBALS['wp_query'];
866 $wp_query = $GLOBALS['wp_query'];
867 $wp_query->is_single = true;
868 $wp_query->is_singular = true;
869 # in_the_loop は記事ページでは通常有効っぽいので true指定 ex: wp_ulike
870 $wp_query->in_the_loop = true;
871 # これも追加しておく
872 $wp_query->is_main_query = true;
873
874 $wp_query->post = $post_emulated;
875 $wp_query->queried_object = $post_emulated;
876 $wp_query->queried_object_id = $post_emulated->ID;
877
878 $GLOBALS['wp_query'] = $wp_query;
879 }
880 // $this->the_content でオリジナルを返してもらうため
881 $this->do_not_filter_the_content = true;
882 $content = preg_replace(
883 '/ (\/)?wp:codoc\/codoc-block /',' \\1wptmp:codoc/codoc-block ',
884 $post_emulated->post_content
885 );
886 // post_metaに�
887 容を保存し、無料パートにショートコードの退避をおこなう
888 $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME);
889 if (isset($codoc_settings['shortcode_evacuation']) and $codoc_settings['shortcode_evacuation']) {
890 $splited = preg_split('/\/wptmp:codoc\/codoc-block/s',$content);
891 if (isset($splited[0]) and isset($splited[1])) {
892 // すべてのショートコードを $match_all にいれる
893 preg_match_all('/\[[^\[\]]+?\](.+\[\/[^\[\]]+?\])?/',$splited[1],$match_all);
894 // ショートコードをURLエンコードしてdivタグの中にいれておく(後でmetaの中のショートコードと付け合せ)
895 $replaced = preg_replace_callback('/\[[^\[\]]+?\](.+\[\/[^\[\]]+?\])?/',function($matches) {
896 return sprintf ('<div class="codoc-evacuation-dests" data-shortcode="%s"></div>', urlencode($matches[0]));
897 },$splited[1]);
898 // 0番目に�
899 �列で�
900 �っているのでそこを退避対象の�
901 �列とする
902 $evacuations = $match_all[0];
903 // ショートコードの中身をタグに退避
904 $content = $splited[0] . '/wptmp:codoc/codoc-block' . $replaced;
905 // 無料パートでショートコードを実行できるようにする
906 update_post_meta($post_emulated->ID,'codoc_shortcode_evacuations',join('**codoc**',$evacuations));
907 } else {
908 update_post_meta($post_emulated->id,'codoc_shortcode_evacuations',"");
909 }
910 }
911 #$content = do_shortcode( $content );
912 $content_filtered = apply_filters( 'the_content', $content);
913 $this->do_not_filter_the_content = false;
914
915 $GLOBALS['post'] = $post_backuped;
916
917 if ($wp_query_backuped) {
918 $GLOBALS['wp_query'] = $wp_query_backuped;
919 }
920
921 $content_filtered = preg_replace(
922 '/ (\/)?wptmp:codoc\/codoc-block /',' \\1wp:codoc/codoc-block ',
923 $content_filtered
924 );
925 return $content_filtered;
926 }
927
928 public function save_post($post_ID,$post,$update) {
929 if (preg_match('/^(auto-draft|inherit)$/',$post->post_status)) {
930 return;
931 }
932 $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
933 $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME);
934 $post_content = (isset($codoc_settings['do_not_filter_the_content']) and $codoc_settings['do_not_filter_the_content']) ?
935 $post->post_content : $this->get_filtered_content($post);
936 $res = $this->util->sync_entry([
937 "post_title" => $post->post_title,
938 "post_content" => $post_content,
939 // password が設定されてる場合は限定�
940 �開にする
941 "post_status" => $post->post_status == 'publish' ? ($post->post_password ? 2 : 1) : 0,
942 "post_permalink" => get_permalink($post_ID),
943 "codoc_entry_code" => $entryCode,
944 "codoc_settings" => $codoc_settings,
945 ],[
946 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
947 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
948 ]);
949
950 if (is_object($res) and $res->status and !$entryCode) {
951 update_post_meta($post_ID,'codoc_entry_code',$res->entry->code);
952 }
953 return true;
954 }
955 function updated_post_meta( $meta_ID, $post_ID, $meta_key ) {
956 // スルーされてる場合は他のメタ�
957 報更新のタイミングにサムネイルをアップロード
958 $has_to_resend = get_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',true);
959 $has_to_resendi = get_post_meta($post_ID,'icodoc_post_thumbnail_invoking_entry_code',true);
960 if ($has_to_resend != 1 and $meta_key != '_thumbnail_id') {
961 return;
962 }
963 if ( has_post_thumbnail($post_ID) ) {
964 // 新規投稿の場合、タイミングによってはcodocEntryCodeが取得できないので一旦スルーする
965 if (!get_post_meta($post_ID,'codoc_entry_code',true)) {
966 update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',1);
967 return;
968 } else {
969 update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',0);
970 }
971 $attachment = wp_get_attachment_metadata( get_post_thumbnail_id($post_ID));
972 $upload_dir = wp_upload_dir();
973 $file_path = sprintf ('%s/%s',$upload_dir['basedir'],$attachment['file']);
974
975 return $this->util->post_thumbnail([
976 "file_path" => $file_path,
977 "boundary" => wp_generate_password(24),
978 "codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true),
979 ],[
980 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
981 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
982 ]);
983 }
984 }
985 function deleted_post_meta( $meta_ids, $post_ID, $meta_key,$meta_value ) {
986 if ($meta_key != '_thumbnail_id') {
987 return;
988 }
989 return $this->util->reset_thumbnail(
990 ["codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true)],
991 [
992 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
993 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
994 ]
995 );
996 }
997 // 退避されてるかどうかをmetaを使って確認し、無料エリアの一番最後にショートコードを追加
998 function the_content_shortcode_evacuations( $post_content ) {
999 if ($this->do_not_filter_the_content) {
1000 return $post_content;
1001 }
1002 $post = get_post();
1003 if (!$post) {
1004 return $post_content;
1005 }
1006 $evacuations_meta = get_post_meta($post->ID,'codoc_shortcode_evacuations',true);
1007 $evacuations = preg_split('/\*\*codoc\*\*/',$evacuations_meta);
1008 foreach ($evacuations as $evacuation) {
1009 $post_content = sprintf('<div class="codoc-evacuations" style="display:none;" data-shortcode="%s">%s</div>',
1010 urlencode($evacuation),$evacuation) . $post_content;
1011 }
1012 return $post_content;
1013 }
1014 function the_content( $post_content ) {
1015 if ( is_single() && in_the_loop() && is_main_query() ) {
1016 }
1017 // get_filtered_content から do_not_filter_the_contentを有効にされるパターン
1018 // オプションの設定値の意味合い(他のフィルタを無視)とは違うため注意
1019 if ($this->do_not_filter_the_content) {
1020 return $post_content;
1021 }
1022 $post = get_post();
1023 // 20211215 null になる場合がある
1024 if (!$post) {
1025 return $post_content;
1026 }
1027 # is_amp で実�
1028 しているテンプレート用
1029 $is_amp_endpoint = (function_exists('is_amp_endpoint') && is_amp_endpoint()) ? true :
1030 ((function_exists('is_amp') && is_amp()) ? true : false);
1031 return $this->util->filter_content([
1032 "post_content" => $post_content,
1033 "preview" => is_preview(),
1034 "codoc_entry_code" => get_post_meta($post->ID,'codoc_entry_code',true),
1035 "codoc_settings" => get_option(CODOC_SETTINGS_OPTION_NAME),
1036 "is_amp_endpoint" => $is_amp_endpoint,
1037 "post_permalink" => get_permalink($post->ID),
1038 "codoc_support_entry_code" => get_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME),
1039 ]);
1040 }
1041
1042 function excerpt_allowed_blocks ($allowed_blocks) {
1043 if (is_array($allowed_blocks)) {
1044 array_push($allowed_blocks,'codoc/codoc-block');
1045 }
1046 return $allowed_blocks;
1047 }
1048 }
1049