PluginProbe
codoc / 0.9.50
codoc v0.9.50
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.50, at class-codoc.php

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