PluginProbe
codoc / 0.9.45
codoc v0.9.45
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.45, at class-codoc.php

1,034 lines 59.4 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 // codocからの認証データ処理
184 if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['fetch_token_key'])) {
185 $key = sanitize_text_field($_GET['fetch_token_key']);
186 $usercode = sanitize_text_field($_GET['usercode']);
187 update_option(CODOC_USERCODE_OPTION_NAME,$usercode);
188 //$data = $this->callAPI('GET','/token',[ "fetch_token_key" => $key ]);
189 $data = $this->util->get_token([ "fetch_token_key" => $key ],["usercode" => $usercode, "token" => "1"]);
190 if ($data->status and $token = $data->token) {
191 update_option(CODOC_TOKEN_OPTION_NAME,$token);
192 //$data = $this->callAPI('GET','');
193 $data = $this->util->get_user_info([],["usercode" => $usercode, "token" => $token]);
194 if ($data->status and $user = $data->user) {
195 $this->update_codoc_authinfo($user);
196 }
197 #$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
198 #$current_url = preg_replace('/(.*)fetch_token_key.*/','${1}&codoc_auth_finished=1',$current_url);
199 //add_settings_error( 'general', 'settings_updated', __( 'OK' ), 'success' );
200 $current_url = admin_url('options-general.php') . '?page=codoc&codoc_auth_finished=1';
201
202 wp_redirect( $current_url);
203 exit;
204 }
205 }
206 global $CODOC_USERCODE;
207 global $CODOC_SETTINGS;
208 global $CODOC_TOKEN;
209 global $CODOC_AUTHINFO;
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
278 if (!isset($CODOC_SETTINGS['codoc_tag_attributes'])) {
279 $CODOC_SETTINGS['codoc_tag_attributes'] = '';
280 }
281 if (!isset($CODOC_SETTINGS['codoc_script_tag_attributes'])) {
282 $CODOC_SETTINGS['codoc_script_tag_attributes'] = '';
283 }
284 if (!isset($CODOC_SETTINGS['codoc_connect_code'])) {
285 $CODOC_SETTINGS['codoc_connect_code'] = '';
286 }
287 if (!isset($CODOC_SETTINGS['codoc_connect_registration_mode'])) {
288 $CODOC_SETTINGS['codoc_connect_registration_mode'] = '';
289 }
290 if (!isset($CODOC_SETTINGS['debug_params'])) {
291 $CODOC_SETTINGS['debug_params'] = '';
292 }
293 add_settings_section(
294 'setting_section_id', // id
295 'codoc 設定ページ', // title
296 function (){}, // callback
297 'codoc' // page
298 );
299 // 認証がある場合
300 if ($CODOC_AUTHINFO) {
301 // クリエイター�
302 報だけ更新 (POST時に同期をとる)
303 if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['settings-updated'])) {
304 $data = $this->util->get_user_info([],[
305 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
306 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
307 ]);
308 if ($data->status and $user = $data->user) {
309 $this->update_codoc_authinfo($user);
310 }
311 }
312
313 register_setting(
314 'codoc_option_group', // option group
315 CODOC_SETTINGS_OPTION_NAME // option name(DB)
316 );
317 add_settings_field(
318 'css_path', // id
319 'テーマ', // title
320 function() {
321 global $CODOC_SETTINGS;
322 echo '<div class="excerpt">テーマを指定してペイウォールのデザインを変えることができます。<br>パスを指定を選択することでCSSを直接指定するこもと可能です。</div>';
323 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']);
324 echo '' .
325 '<script type="text/javascript"> ' .
326 ' function gen_css_path(select) { ' .
327 ' if (select.value == "dark") { ' .
328 ' document.getElementById("darkmode-caution").style.display="block";' .
329 ' } else { ' .
330 ' if (document.getElementById("darkmode-caution")) { ' .
331 ' document.getElementById("darkmode-caution").style.display="none";' .
332 ' } ' .
333 ' } ' .
334 ' if (select.value == "path") { ' .
335 ' document.getElementById("codoc_css_path").readOnly=false; ' .
336 ' if (!document.getElementById("codoc_css_path").value.match(/\//g)) {' .
337 ' document.getElementById("codoc_css_path").value=""; ' .
338 ' } ' .
339 ' } else { ' .
340 ' document.getElementById("codoc_css_path").readOnly=true; ' .
341 ' document.getElementById("codoc_css_path").value=select.value; ' .
342 ' } ' .
343 ' } ' .
344 '</script> ' ;
345
346 echo sprintf('<select name="theme_name" onChange="gen_css_path(this)" id="codoc_theme_select">');
347 foreach (["blue","red","green","black","dark","blue-square","red-square","green-square","black-square","dark-square"] as $theme) {
348 if ($theme == "blue") {
349 echo sprintf('<option value="%s" %s>青</option>', $theme, ($CODOC_SETTINGS["css_path"] == "blue" ? "selected" : ""));
350 }
351 if ($theme == "red") {
352 echo sprintf('<option value="%s" %s>赤</option>', $theme, ($CODOC_SETTINGS["css_path"] == "red" ? "selected" : ""));
353 }
354 if ($theme == "green") {
355 echo sprintf('<option value="%s" %s>緑</option>', $theme, ($CODOC_SETTINGS["css_path"] == "green" ? "selected" : ""));
356 }
357 if ($theme == "black") {
358 echo sprintf('<option value="%s" %s>黒</option>', $theme, ($CODOC_SETTINGS["css_path"] == "black" ? "selected" : ""));
359 }
360 if ($theme == "dark") {
361 echo sprintf('<option value="%s" %s>ダークモード</option>', $theme, ($CODOC_SETTINGS["css_path"] == "dark" ? "selected" : ""));
362 }
363 if ($theme == "blue-square") {
364 echo sprintf('<option value="%s" %s>青(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "blue-square" ? "selected" : ""));
365 }
366 if ($theme == "red-square") {
367 echo sprintf('<option value="%s" %s>赤(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "red-square" ? "selected" : ""));
368 }
369 if ($theme == "green-square") {
370 echo sprintf('<option value="%s" %s>緑(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "green-square" ? "selected" : ""));
371 }
372 if ($theme == "black-square") {
373 echo sprintf('<option value="%s" %s>黒(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "black-square" ? "selected" : ""));
374 }
375 if ($theme == "dark-square") {
376 echo sprintf('<option value="%s" %s>ダークモード(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "dark-square" ? "selected" : ""));
377 }
378 }
379 echo sprintf('<option value="path" %s>パス指定</option>', (preg_match("/\//",$CODOC_SETTINGS["css_path"]) ? "selected" : ""));
380 echo '<script type="text/javascript">gen_css_path(document.getElementById(\'codoc_theme_select\'))</script>';
381 echo sprintf('</select></div>');
382 echo '<p id="darkmode-caution" style="display:none">ダークモード向けテーマは文字色が白となり、背景色によっては文字が見えない状�
383 �となるためご注意ください。</p>';
384 },
385 'codoc', //page
386 'setting_section_id' //Section
387 );
388 add_settings_field(
389 'paywall_text', // id
390 '各種文言', // title
391 function() {
392 global $CODOC_SETTINGS;
393 echo '<div class="excerpt">ペイウォール�
394 の一部文言を変更できます。</div>';
395 echo '<table class="innerTable"><tbody>';
396 echo '<tr><th>いいねの表示</th><td>';
397 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" : ""));
398 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" : ""));
399 echo '</td></tr>';
400
401 echo '<tr><th>codocについての表示</th><td>';
402 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" : ""));
403 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" : ""));
404 echo '</td></tr>';
405
406 echo '<tr><th>PoweredByの表示</th><td>';
407 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" : ""));
408 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" : ""));
409 echo '</td></tr>';
410
411 echo '<tr><th>記事購�
412 �ボタンのテキスト</th><td>';
413 echo sprintf('<input type="text" name="%s[entry_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['entry_button_text']));
414 echo '</td></tr>';
415
416 echo '<tr><th>サブスクリプション購�
417 �ボタンのテキスト</th><td>';
418 echo sprintf('<input type="text" name="%s[subscription_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_button_text']));
419 echo '</td></tr>';
420
421 echo '<tr><th>サポートボタンのテキスト</th><td>';
422 echo sprintf('<input type="text" name="%s[support_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_button_text']));
423 echo '</td></tr>';
424
425 echo '<tr><th>「サブスクリプションに含まれる記事」のテキスト</th><td>';
426 echo sprintf('<input type="text" name="%s[subscription_message]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_message']));
427 echo '</td></tr>';
428
429 echo '<tr><th>サポート説明のテキスト</th><td>';
430 echo sprintf('<input type="text" name="%s[support_message]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_message']));
431 echo '</td></tr>';
432
433 echo '</tbody></table>';
434 },
435 'codoc', //page
436 'setting_section_id' //Section
437 );
438
439 add_settings_field(
440 'codoc_tag_attributes', // id
441 'codocタグの属性', // title
442 function() {
443 global $CODOC_SETTINGS;
444 echo '<div class="excerpt">codocタグに特定の属性を追加することができます。</div>';
445 echo sprintf('<input type="text" name="%s[codoc_tag_attributes]" value="%s">',CODOC_SETTINGS_OPTION_NAME,htmlspecialchars($CODOC_SETTINGS['codoc_tag_attributes']));
446 },
447 'codoc', //page
448 'setting_section_id' //Section
449 );
450 add_settings_field(
451 'codoc_script_tag_attributes', // id
452 'codoc scriptタグの属性', // title
453 function() {
454 global $CODOC_SETTINGS;
455 echo '<div class="excerpt">codoc scriptタグに特定の属性を追加することができます。</div>';
456 echo sprintf('<input type="text" name="%s[codoc_script_tag_attributes]" value="%s">',CODOC_SETTINGS_OPTION_NAME,htmlspecialchars($CODOC_SETTINGS['codoc_script_tag_attributes']));
457 },
458 'codoc', //page
459 'setting_section_id' //Section
460 );
461 add_settings_field(
462 'str_replace_binded_url', // id
463 'パーマリンク', // title
464 function() {
465 global $CODOC_SETTINGS;
466 echo '<div class="excerpt">codoc側に登録するパーマリンクを置換することができます。</div>';
467 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']));
468 echo ('<span class="suptext"></span>');
469 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']));
470 echo ('に変換');
471 },
472 'codoc', //page
473 'setting_section_id' //Section
474 );
475
476 add_settings_field(
477 'str_around_codoc_tag', // id
478 'HTMLの挿�
479 �', // title
480 function() {
481 global $CODOC_SETTINGS;
482 echo '<div class="excerpt">codocタグの前後にHTMLを挿�
483 �することができます。</div>';
484 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']));
485 echo ('を前に挿�
486 �</div>');
487 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']));
488 echo ('を後に挿�
489 �</div>');
490
491 },
492 'codoc', //page
493 'setting_section_id' //Section
494 );
495
496 add_settings_field(
497 'always_show_support_tag', // id
498 'サポートの自動挿�
499 �', // title
500 function() {
501 global $CODOC_SETTINGS;
502 echo '<div class="excerpt">codocブロックを挿�
503 �することなく投稿にサポート機能を追加します</div>';
504 echo '<table class="innerTable"><tbody>';
505 echo '<tr><th>自動挿�
506 �</th><td>';
507 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" : ""));
508 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" : ""));
509 echo '</td></tr>';
510 echo '<tr><th>表示位置</th><td>';
511 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" : ""));
512 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" : ""));
513 echo '</td></tr>';
514 echo '<tr><th>説明文</th><td>';
515 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']));
516 echo '</td></tr>';
517 echo '<tr><th>対象カテゴリ名</th><td>';
518 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']));
519 echo '</td></tr>';
520 echo '</tbody></table>';
521
522 },
523 'codoc', //page
524 'setting_section_id' //Section
525 );
526 add_settings_field(
527 'do_not_filter_the_content', // id
528 '支障が出る処理を無効化', // title
529 function() {
530 global $CODOC_SETTINGS;
531 echo '<div class="excerpt">codocの動作に支障が出る他のプラグインによる<strong>フィルター処理</strong>を無効化(ショートコードも動作しなくなります)できます。codocが上手く動かない場合のみ利用してください。</div>';
532 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" : ""));
533 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" : ""));
534 },
535 'codoc', //page
536 'setting_section_id' //Section
537 );
538
539 add_settings_field(
540 'shortcode_evacuation', // id
541 'ショートコード対策', // title
542 function() {
543 global $CODOC_SETTINGS;
544 echo '<div class="excerpt">有料パートに記述したショートコードが想定通りに動作しない場合にご利用ください。尚、当該ショートコードの実行結果は通常見えない状�
545 �となりますがソースコード閲覧等により閲覧することも可能となるためご注意ください。</div>';
546 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" : ""));
547 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" : ""));
548 },
549 'codoc', //page
550 'setting_section_id' //Section
551 );
552
553 add_settings_field(
554 'debug_params', // id
555 'デバック用', // title
556 function() {
557 global $CODOC_SETTINGS;
558 echo '<div class="excerpt">デバック用のパラメーターを指定できます。codocサポートから依頼がある場合のみ利用してください。</div>';
559 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']));
560 },
561 'codoc', //page
562 'setting_section_id' //Section
563 );
564
565 add_settings_field(
566 'cretor_info', // id
567 'クリエイター�
568 ', // title
569 function() {
570 global $CODOC_SETTINGS;
571 global $CODOC_AUTHINFO;
572 echo sprintf('<p><font id="codoc-update-creator-info-message"></font></p>',"");
573 // 変更を保存時に常に同期するのでこの表示は�
574 要ないがUI上保持しておく
575 $script = "document.getElementById('codoc-update-creator-info-message').innerText='�
576 報を更新するには変更を保存してください';document.getElementById('codoc-update-creator-info-message').color='red';";
577 if (isset($CODOC_AUTHINFO['profile_image_url'])) {
578 echo sprintf('<img src="%s" width="40" height="40" />',$CODOC_AUTHINFO['profile_image_url']);
579 }
580 echo sprintf('<p>%s</p>',$CODOC_AUTHINFO['name']);
581 if ($connect_code = $CODOC_SETTINGS['codoc_connect_code']) {
582 echo sprintf('<p>外部サービス連携済(連携コード:%s) %s</p>',
583 $connect_code,
584 ($CODOC_SETTINGS['codoc_connect_registration_mode'] == 'dedicated' ? '<br/> <strong>オーディエンスはプライベートアカウントとする</strong>' : ''));
585 }
586 echo sprintf('<p>�
587 報を<a href="javascript:void(0);" onClick="' . $script . '">更新する</a></p>');
588 echo ('<p>codoc側でロゴやカバー画像を変更した場合は都度更新を行ってください</p>');
589 },
590 'codoc', //page
591 'setting_section_id' //Section
592 );
593
594 register_setting(
595 'codoc_option_group', // option group
596 CODOC_USERCODE_OPTION_NAME
597 );
598 register_setting(
599 'codoc_option_group', // option group
600 CODOC_TOKEN_OPTION_NAME
601 );
602
603 if (isset($_GET['codoc_auth_finished']) and $_GET['codoc_auth_finished']) {
604 add_settings_error( 'general', 'settings_updated', __( 'codocの認証が完了しました' ), 'success' );
605 }
606
607 add_settings_field(
608 'codoc_auth',
609 '認証',
610 function() {
611 global $CODOC_USERCODE;
612 global $CODOC_TOKEN;
613 global $CODOC_AUTHINFO;
614 $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';";
615
616 echo sprintf('<p><font color="green" id="codoc-auth-message"><strong>%s</strong> で認証済</font></p>',$CODOC_AUTHINFO['email']);
617
618 echo sprintf('<input id="codoc-usercode" type="hidden" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
619 echo sprintf('<input id="codoc-token" type="hidden" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
620 echo sprintf('<p>認証を<a href="javascript:void(0);" onClick="' . $script . '">解除する</p>');
621 },
622 'codoc',
623 'setting_section_id'
624 );
625
626 }
627
628 // ない場合
629 if (!$CODOC_AUTHINFO and !isset($_GET['auth_by_myself'])) {
630 add_settings_field(
631 'codoc_auth',
632 '認証',
633 function() {
634 $theme = wp_get_theme();
635 $from = 'wp';
636 if ($theme->get('Name') === 'codoc') {
637 $from = 'wp_codoc';
638 }
639 //$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
640 $current_url = admin_url('options-general.php') . '?page=codoc';
641 $login_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/me/token?from=' . $from . '&return_url=' . urlencode($current_url));
642 $register_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/register?from=' . $from . '&return_url=' . urlencode($current_url));
643 // submitを消しておく
644 echo ('<script type="text/javascript">window.onload=function(){document.getElementById(\'submit\').style.display = \'none\'}</script>');
645 echo ('codocをWordPressでご利用いただくには認証が�
646 要です。<br />');
647 echo sprintf('ユーザーコードとAPIトークンを<a href="%s&auth_by_myself=1">直接�
648 �力</a>することでも認証できます。<br /><br />',$current_url);
649 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);
650
651
652 },
653 'codoc',
654 'setting_section_id'
655 );
656 }
657 // ない場合かつ自分で認証する場合
658 if (!$CODOC_AUTHINFO and (
659 (isset($_GET['auth_by_myself']) and $_GET['auth_by_myself']) or
660 (isset($_POST['auth_by_myself']) and $_POST['auth_by_myself'])
661 )) {
662 register_setting(
663 'codoc_option_group', // option group
664 CODOC_USERCODE_OPTION_NAME
665 );
666 register_setting(
667 'codoc_option_group', // option group
668 CODOC_TOKEN_OPTION_NAME
669 );
670 add_settings_field(
671 'codoc_usercode',
672 'ユーザーコード',
673 function() {
674 global $CODOC_USERCODE;
675 echo '<input type="hidden" name="auth_by_myself" value="1">';
676 echo sprintf('<input type="text" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
677 },
678 'codoc',
679 'setting_section_id'
680 );
681 add_settings_field(
682 'codoc_token',
683 'APIトークン',
684 function() {
685 global $CODOC_TOKEN;
686 echo sprintf('<input type="text" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
687 },
688 'codoc',
689 'setting_section_id'
690 );
691 }
692
693 // 認証�
694 報を保存
695 add_action( 'update_option_' . CODOC_USERCODE_OPTION_NAME, function( $old_value, $new_value ) {
696 global $CODOC_RE_AUTHORIZE;
697 $CODOC_RE_AUTHORIZE = 1;
698 },9,2); // $hook, $function_to_add, $priority, $accepted_args
699 add_action( 'update_option_' . CODOC_TOKEN_OPTION_NAME, function( $old_value, $new_value ) {
700 global $CODOC_RE_AUTHORIZE;
701 $CODOC_RE_AUTHORIZE = 1;
702 },10,2);
703
704 add_action('update_option_' . CODOC_SETTINGS_OPTION_NAME,function(){
705 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
706 if (isset($CODOC_SETTINGS['always_show_support']) and $CODOC_SETTINGS['always_show_support']) {
707 $data = $this->util->get_support_entry([],[
708 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
709 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
710 ]);
711 if ($data->status and $entry = $data->entry) {
712 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,$entry->code);
713 } else {
714 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
715 }
716 } elseif(isset($CODOC_SETTINGS['always_show_support']) and !$CODOC_SETTINGS['always_show_support']) {
717 update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
718 }
719 });
720
721 add_action('updated_option',function(){
722 global $CODOC_RE_AUTHORIZE;
723 if ($CODOC_RE_AUTHORIZE) {
724 //$data = $this->callAPI('GET','');
725 $data = $this->util->get_user_info([],[
726 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
727 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
728 ]);
729 if ($data->status and $user = $data->user) {
730 $this->update_codoc_authinfo($user);
731 } else {
732 update_option(CODOC_AUTHINFO_OPTION_NAME,'');
733 }
734 }
735 });
736
737 });
738 // プラグイン一覧に設定のリンクをいれる
739 add_filter( 'plugin_action_links_' . plugin_basename( plugin_dir_path( __FILE__ ) . 'codoc' . '.php' ),
740 function( $links ) {
741 $setting_link = sprintf( '<a href="%s">%s</a>', esc_url( add_query_arg( 'page', 'codoc', admin_url( 'options-general.php' ) ) ), esc_html( '設定' ) );
742 array_unshift( $links, $setting_link );
743
744 return $links;
745 }
746 );
747
748 }
749 public function add_mce() {
750 add_action( 'admin_enqueue_scripts', function() {
751 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
752 return;
753 }
754 $current_screen = get_current_screen();
755 if ( ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) || ( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) ) {
756 // Gutenberg Editor
757 // なにもしない
758 } else {
759 // tinymce
760 if ( get_user_option( 'rich_editing' ) == 'true' ) {
761 // プラグイン�
762 で使うCSRF を生成
763 $path = plugins_url( 'codoc/src_mce/codoc-editor-onload.js', __DIR__ );
764 wp_enqueue_script( 'codoc-editor-onload', $path, array('jquery'), '', true );
765 // I just want to insert this global variables but i don't know how i can do it..
766 wp_localize_script(
767 'codoc-editor-onload',
768 'CODOCEDITOR',
769 array(
770 'action' => 'codoc_shortcodes',
771 'nonce' => wp_create_nonce( 'codoc_shortcodes' ),
772
773 'codoc_url' => $this->get_codoc_url(),
774 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
775 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
776 'codoc_sdk_path' => CODOC_SDK_PATH,
777 )
778 );
779
780 // ここでtinymceのプラグイン追加
781 //wp_enqueue_style( 'codoc-admin-style', plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
782 //add_editor_style( plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
783 wp_enqueue_style( 'codoc-admin-style', $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.css?c=' . date('Ymd') );
784 add_editor_style( $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.css' );
785
786 add_filter( 'mce_external_plugins', function( $plugin_array ) {
787 //$plugin_array['codoc'] = plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ );
788 $plugin_array['codoc'] = $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.js?c=' . date('Ymd');
789 return $plugin_array;
790 } );
791 add_filter( 'mce_buttons', function( $buttons ) {
792 array_push( $buttons, "|", "codoc" );
793 return $buttons;
794 } );
795 // 非SSL環境の場合、なぜかhttps -> httpsになってしまうので対策
796 // コメントタグが除去されることがあるらしいのでvalid_elementsに�
797 要なタグを追加 (EXPERIMENTAL)
798 add_filter( 'tiny_mce_before_init', function($settings) {
799 $settings['external_plugins'] = preg_replace('/"codoc":"http:/','"codoc":"https:',$settings['external_plugins']);
800 foreach (['valid_elements','extended_valid_elements'] as $valid_elements) {
801 if (isset($settings[$valid_elements])) {
802 $settings[$valid_elements] = $settings[$valid_elements] . ',div[*],p[*],img[*],--[*]';
803 }
804 }
805 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
806 if (isset($CODOC_SETTINGS["debug_params"])) {
807 $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
808 if (isset($params_decoded["mce_valid_elements"])) {
809 $settings['valid_elements'] = $params_decoded["mce_valid_elements"];
810 $settings['extended_valid_elements'] = $params_decoded["mce_valid_elements"];
811 }
812 }
813
814 return $settings;
815 },1000000);
816 }
817 }
818 } );
819 }
820 function update_codoc_authinfo($user) {
821 global $CODOC_SETTINGS;
822 global $CODOC_AUTHINFO;
823 if (property_exists($user,'connect_code') and $user->connect_code) {
824 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
825 $CODOC_SETTINGS['codoc_connect_code'] = $user->connect_code;
826 $CODOC_SETTINGS['codoc_connect_registration_mode'] = $user->connect_has_permission_dedicated_account ? 'dedicated' : '';
827 update_option(CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS);
828 }
829 return update_option(CODOC_AUTHINFO_OPTION_NAME,[
830 'email' => $user->email,
831 'name' => $user->name,
832 'profile_image_url' => $user->profile_image_url,
833 'cover_image_url' => $user->cover_image_url,
834 'connect_code' => property_exists($user,'connect_code') ? $user->connect_code : '',
835 'connect_image_url' => property_exists($user,'connect_image_url') ? $user->connect_image_url : '',
836 ]);
837 $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
838 }
839 // 保存用コンテンツにフィルターを実施する
840 public function get_filtered_content($post_emulated) {
841 // 記事ページであることをエミュレートしてフィルター実行
842 $post_backuped = null;
843 if (isset($GLOBALS['post'])) {
844 $post_backuped = $GLOBALS['post'];
845 }
846 $GLOBALS['post'] = $post_emulated;
847
848 $wp_query_backuped = null;
849 if (isset($GLOBALS['wp_query'])) {
850 $wp_query_backuped = $GLOBALS['wp_query'];
851 $wp_query = $GLOBALS['wp_query'];
852 $wp_query->is_single = true;
853 $wp_query->is_singular = true;
854 # in_the_loop は記事ページでは通常有効っぽいので true指定 ex: wp_ulike
855 $wp_query->in_the_loop = true;
856 # これも追加しておく
857 $wp_query->is_main_query = true;
858
859 $wp_query->post = $post_emulated;
860 $wp_query->queried_object = $post_emulated;
861 $wp_query->queried_object_id = $post_emulated->ID;
862
863 $GLOBALS['wp_query'] = $wp_query;
864 }
865 // $this->the_content でオリジナルを返してもらうため
866 $this->do_not_filter_the_content = true;
867 $content = preg_replace(
868 '/ (\/)?wp:codoc\/codoc-block /',' \\1wptmp:codoc/codoc-block ',
869 $post_emulated->post_content
870 );
871 // post_metaに�
872 容を保存し、無料パートにショートコードの退避をおこなう
873 $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME);
874 if (isset($codoc_settings['shortcode_evacuation']) and $codoc_settings['shortcode_evacuation']) {
875 $splited = preg_split('/\/wptmp:codoc\/codoc-block/s',$content);
876 if (isset($splited[0]) and isset($splited[1])) {
877 // すべてのショートコードを $match_all にいれる
878 preg_match_all('/\[[^\[\]]+?\](.+\[\/[^\[\]]+?\])?/',$splited[1],$match_all);
879 // ショートコードをURLエンコードしてdivタグの中にいれておく(後でmetaの中のショートコードと付け合せ)
880 $replaced = preg_replace_callback('/\[[^\[\]]+?\](.+\[\/[^\[\]]+?\])?/',function($matches) {
881 return sprintf ('<div class="codoc-evacuation-dests" data-shortcode="%s"></div>', urlencode($matches[0]));
882 },$splited[1]);
883 // 0番目に�
884 �列で�
885 �っているのでそこを退避対象の�
886 �列とする
887 $evacuations = $match_all[0];
888 // ショートコードの中身をタグに退避
889 $content = $splited[0] . '/wptmp:codoc/codoc-block' . $replaced;
890 // 無料パートでショートコードを実行できるようにする
891 update_post_meta($post_emulated->ID,'codoc_shortcode_evacuations',join('**codoc**',$evacuations));
892 } else {
893 update_post_meta($post_emulated->id,'codoc_shortcode_evacuations',"");
894 }
895 }
896 #$content = do_shortcode( $content );
897 $content_filtered = apply_filters( 'the_content', $content);
898 $this->do_not_filter_the_content = false;
899
900 $GLOBALS['post'] = $post_backuped;
901
902 if ($wp_query_backuped) {
903 $GLOBALS['wp_query'] = $wp_query_backuped;
904 }
905
906 $content_filtered = preg_replace(
907 '/ (\/)?wptmp:codoc\/codoc-block /',' \\1wp:codoc/codoc-block ',
908 $content_filtered
909 );
910 return $content_filtered;
911 }
912
913 public function save_post($post_ID,$post,$update) {
914 if (preg_match('/^(auto-draft|inherit)$/',$post->post_status)) {
915 return;
916 }
917 $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
918 $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME);
919 $post_content = (isset($codoc_settings['do_not_filter_the_content']) and $codoc_settings['do_not_filter_the_content']) ?
920 $post->post_content : $this->get_filtered_content($post);
921 $res = $this->util->sync_entry([
922 "post_title" => $post->post_title,
923 "post_content" => $post_content,
924 // password が設定されてる場合は限定�
925 �開にする
926 "post_status" => $post->post_status == 'publish' ? ($post->post_password ? 2 : 1) : 0,
927 "post_permalink" => get_permalink($post_ID),
928 "codoc_entry_code" => $entryCode,
929 "codoc_settings" => $codoc_settings,
930 ],[
931 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
932 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
933 ]);
934
935 if (is_object($res) and $res->status and !$entryCode) {
936 update_post_meta($post_ID,'codoc_entry_code',$res->entry->code);
937 }
938 return true;
939 }
940 function updated_post_meta( $meta_ID, $post_ID, $meta_key ) {
941 // スルーされてる場合は他のメタ�
942 報更新のタイミングにサムネイルをアップロード
943 $has_to_resend = get_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',true);
944 $has_to_resendi = get_post_meta($post_ID,'icodoc_post_thumbnail_invoking_entry_code',true);
945 if ($has_to_resend != 1 and $meta_key != '_thumbnail_id') {
946 return;
947 }
948 if ( has_post_thumbnail($post_ID) ) {
949 // 新規投稿の場合、タイミングによってはcodocEntryCodeが取得できないので一旦スルーする
950 if (!get_post_meta($post_ID,'codoc_entry_code',true)) {
951 update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',1);
952 return;
953 } else {
954 update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',0);
955 }
956 $attachment = wp_get_attachment_metadata( get_post_thumbnail_id($post_ID));
957 $upload_dir = wp_upload_dir();
958 $file_path = sprintf ('%s/%s',$upload_dir['basedir'],$attachment['file']);
959
960 return $this->util->post_thumbnail([
961 "file_path" => $file_path,
962 "boundary" => wp_generate_password(24),
963 "codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true),
964 ],[
965 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
966 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
967 ]);
968 }
969 }
970 function deleted_post_meta( $meta_ids, $post_ID, $meta_key,$meta_value ) {
971 if ($meta_key != '_thumbnail_id') {
972 return;
973 }
974 return $this->util->reset_thumbnail(
975 ["codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true)],
976 [
977 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
978 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
979 ]
980 );
981 }
982 // 退避されてるかどうかをmetaを使って確認し、無料エリアの一番最後にショートコードを追加
983 function the_content_shortcode_evacuations( $post_content ) {
984 if ($this->do_not_filter_the_content) {
985 return $post_content;
986 }
987 $post = get_post();
988 if (!$post) {
989 return $post_content;
990 }
991 $evacuations_meta = get_post_meta($post->ID,'codoc_shortcode_evacuations',true);
992 $evacuations = preg_split('/\*\*codoc\*\*/',$evacuations_meta);
993 foreach ($evacuations as $evacuation) {
994 $post_content = sprintf('<div class="codoc-evacuations" style="display:none;" data-shortcode="%s">%s</div>',
995 urlencode($evacuation),$evacuation) . $post_content;
996 }
997 return $post_content;
998 }
999 function the_content( $post_content ) {
1000 if ( is_single() && in_the_loop() && is_main_query() ) {
1001 }
1002 // get_filtered_content から do_not_filter_the_contentを有効にされるパターン
1003 // オプションの設定値の意味合い(他のフィルタを無視)とは違うため注意
1004 if ($this->do_not_filter_the_content) {
1005 return $post_content;
1006 }
1007 $post = get_post();
1008 // 20211215 null になる場合がある
1009 if (!$post) {
1010 return $post_content;
1011 }
1012 # is_amp で実�
1013 しているテンプレート用
1014 $is_amp_endpoint = (function_exists('is_amp_endpoint') && is_amp_endpoint()) ? true :
1015 ((function_exists('is_amp') && is_amp()) ? true : false);
1016 return $this->util->filter_content([
1017 "post_content" => $post_content,
1018 "preview" => is_preview(),
1019 "codoc_entry_code" => get_post_meta($post->ID,'codoc_entry_code',true),
1020 "codoc_settings" => get_option(CODOC_SETTINGS_OPTION_NAME),
1021 "is_amp_endpoint" => $is_amp_endpoint,
1022 "post_permalink" => get_permalink($post->ID),
1023 "codoc_support_entry_code" => get_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME),
1024 ]);
1025 }
1026
1027 function excerpt_allowed_blocks ($allowed_blocks) {
1028 if (is_array($allowed_blocks)) {
1029 array_push($allowed_blocks,'codoc/codoc-block');
1030 }
1031 return $allowed_blocks;
1032 }
1033 }
1034