PluginProbe
codoc / 0.8.8
codoc v0.8.8
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.8.8, at class-codoc.php

541 lines 20.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 final class Codoc {
4
5 public function __construct() {
6 if (is_admin()) {
7 // setting
8 $this->add_settings();
9 }
10 $auth_info = get_option(CODOC_AUTHINFO_OPTION_NAME);
11 if (!$auth_info) {
12 return $this;
13 }
14
15 // データ同期 (save_postはis_adminで実行されないケースがある)
16 add_action( 'save_post', [$this,'save_post'], 20, 3 );
17 add_action( 'added_post_meta', [$this,'updated_post_meta'], 10, 3 );
18 add_action( 'updated_post_meta',[$this,'updated_post_meta'], 10, 3 );
19 add_action( 'deleted_post_meta',[$this,'deleted_post_meta'], 10, 4 );
20
21 if (is_admin()) {
22 // Gutenberg のサポートがない場合は何もしない
23 if ( function_exists( 'register_block_type' ) ) {
24 // gutenberg
25 require_once 'src/init.php';
26 add_action('wp_loaded', function() {
27 wp_localize_script('wordpress-cgb-block-js', 'OPTIONS', array(
28 'codoc_url' => CODOC_URL,
29 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
30 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
31 'codoc_sdk_path' => CODOC_SDK_PATH,
32 ));
33 });
34 }
35 // tinymce
36 $this->add_mce();
37
38 return $this;
39 }
40
41 // codocのJS登録
42
43 add_action( 'wp_enqueue_scripts', function() {
44 wp_enqueue_script( 'codoc-injector-js', CODOC_URL . '/js/cms.js' );
45 });
46 // 登録したscriptタグに属性をつける
47 add_filter('script_loader_tag', [$this,'modifier_script_tag'],10,2);
48 // tinymce用のショートコード
49 add_shortcode('codoc', [$this, 'injector_shortcode']);
50
51 // paywall用の本文非表示化とcodocタグへの属性追加
52 add_filter('the_content',[$this,'the_content']);
53 return $this;
54 }
55
56 public function modifier_script_tag($tag,$handle) {
57 if($handle !== 'codoc-injector-js') {
58 return $tag;
59 }
60 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
61 $data_css = '';
62 if ($css_path = $CODOC_SETTINGS['css_path']) {
63 $data_css = sprintf(' data-css="%s" ',$css_path);
64 }
65 //return str_replace(' src=', $data_css . ' defer src=', $tag);
66 return preg_replace('/(src=[^>]+)/',' ${1} ' . $data_css . ' defer',$tag);
67 }
68 public function injector_shortcode($atts) {
69 global $post;
70 ob_start();
71 require 'views/codoc-injector.php';
72 return ob_get_clean();
73 }
74 public function callAPI($method,$path,$body = [],$headers = []) {
75 $usercode = get_option(CODOC_USERCODE_OPTION_NAME);
76 $token = get_option(CODOC_TOKEN_OPTION_NAME);
77
78 $headers['X-CodocToken'] = $token;
79 $host = CODOC_URL;
80 $sslverify = true;
81
82 if (preg_match('/local/',CODOC_URL)) {
83 $sslverify = false;
84 $host = 'https://host.docker.internal';
85 }
86 $url = sprintf("%s/api/v1/cms/%s%s",$host,$usercode,$path);
87 $http = new WP_Http();
88 try {
89 $response = $http->request(
90 $url,
91 [
92 'sslverify' => $sslverify,
93 'method' => $method,
94 'timeout' => 10,
95 'headers' => $headers,
96 'body' => $body,
97 ]
98 );
99 if ( is_wp_error($response) || $response['response']['code'] != 200 ) {
100 //何もしない
101 //var_dump( $response );
102 }
103 } catch(Exception $e) {
104 }
105
106 if (!is_wp_error($response) and
107 isset($response['body']) and
108 is_string($response['body']) and
109 is_array(json_decode($response['body'], true)) and
110 (json_last_error() == JSON_ERROR_NONE)) {
111 return json_decode($response['body']);
112 } else {
113 return null;
114 }
115 }
116 # settings / 設定関連
117 public function add_settings() {
118 global $CODOC_SETTINGS;
119 add_action( 'admin_menu' ,function(){
120 add_options_page(
121 'codoc の設定', //ページタイトル
122 'codoc', //設定メニューに表示されるメニュータイトル
123 'edit_users', //権限
124 'codoc', //設定ページのURL。options-general.php?page=codoc
125 function() {
126 echo '<div clas="wrap">';
127 echo '<form method="post" action="options.php">';
128 settings_fields( 'codoc_option_group' );
129 do_settings_sections( 'codoc' );
130 submit_button(); // 送信ボタン
131 echo '</div>';
132 }
133 );
134 });
135
136 add_action( "admin_init", function() {
137 // codocからの認証データ処理
138 if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['fetch_token_key'])) {
139 $key = sanitize_text_field($_GET['fetch_token_key']);
140 $usercode = sanitize_text_field($_GET['usercode']);
141 update_option(CODOC_USERCODE_OPTION_NAME,$usercode);
142 $data = $this->callAPI('GET','/token',[ "fetch_token_key" => $key ]);
143 if ($data->status and $token = $data->token) {
144 update_option(CODOC_TOKEN_OPTION_NAME,$token);
145 $data = $this->callAPI('GET','');
146 if ($data->status and $user = $data->user) {
147 update_option(CODOC_AUTHINFO_OPTION_NAME,[
148 'email' => $user->email,
149 'name' => $user->name,
150 ]);
151 }
152 #$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
153 #$current_url = preg_replace('/(.*)fetch_token_key.*/','${1}&codoc_auth_finished=1',$current_url);
154 //add_settings_error( 'general', 'settings_updated', __( 'OK' ), 'success' );
155 $current_url = admin_url('options-general.php') . '?page=codoc&codoc_auth_finished=1';
156
157 wp_redirect( $current_url);
158 exit;
159 }
160 }
161
162 global $CODOC_USERCODE;
163 global $CODOC_SETTINGS;
164 global $CODOC_TOKEN;
165 global $CODOC_AUTHINFO;
166 $CODOC_USERCODE = get_option(CODOC_USERCODE_OPTION_NAME);
167 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
168 $CODOC_TOKEN = get_option(CODOC_TOKEN_OPTION_NAME);
169 $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
170 if( !$CODOC_SETTINGS ) {
171 //デフォルト値
172 $CODOC_SETTINGS = array(
173 'css_path' => '',
174 );
175 update_option( CODOC_SETTINGS_OPTION_NAME, $CODOC_SETTINGS );
176 }
177 if (!isset($CODOC_SETTINGS['str_replace_binded_url_from'])) {
178 $CODOC_SETTINGS['str_replace_binded_url_from'] = '';
179 }
180 if (!isset($CODOC_SETTINGS['str_replace_binded_url_to'])) {
181 $CODOC_SETTINGS['str_replace_binded_url_to'] = '';
182 }
183
184 add_settings_section(
185 'setting_section_id', // id
186 'codoc 設定ページ', // title
187 function (){}, // callback
188 'codoc' // page
189 );
190 // 認証がある場合
191 if ($CODOC_AUTHINFO) {
192 register_setting(
193 'codoc_option_group', // option group
194 CODOC_SETTINGS_OPTION_NAME // option name(DB)
195 );
196 add_settings_field(
197 'css_path', // id
198 'カスタマイズ用CSSパス', // title
199 function() {
200 global $CODOC_SETTINGS;
201 echo sprintf('<input type="text" name="%s[css_path]" value="%s">',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['css_path']);
202 },
203 'codoc', //page
204 'setting_section_id' //Section
205 );
206 add_settings_field(
207 'str_replace_binded_url', // id
208 'codoc側に登録するパーマリンクを置換', // title
209 function() {
210 global $CODOC_SETTINGS;
211 echo sprintf('<input type="text" name="%s[str_replace_binded_url_from]" value="%s">',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['str_replace_binded_url_from']);
212 echo ('');
213 echo sprintf('<input type="text" name="%s[str_replace_binded_url_to]" value="%s">',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['str_replace_binded_url_to']);
214 echo ('に変換');
215 },
216 'codoc', //page
217 'setting_section_id' //Section
218 );
219
220 register_setting(
221 'codoc_option_group', // option group
222 CODOC_USERCODE_OPTION_NAME
223 );
224 register_setting(
225 'codoc_option_group', // option group
226 CODOC_TOKEN_OPTION_NAME
227 );
228
229 if (isset($_GET['codoc_auth_finished']) and $_GET['codoc_auth_finished']) {
230 add_settings_error( 'general', 'settings_updated', __( 'codocの認証が完了しました' ), 'success' );
231 }
232
233 add_settings_field(
234 'codoc_auth',
235 '認証',
236 function() {
237 global $CODOC_USERCODE;
238 global $CODOC_TOKEN;
239 global $CODOC_AUTHINFO;
240 $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';";
241
242 echo sprintf('<p><font color="green" id="codoc-auth-message"><strong>%s</strong> で認証済</font></p>',$CODOC_AUTHINFO['email']);
243
244 echo sprintf('<input id="codoc-usercode" type="hidden" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
245 echo sprintf('<input id="codoc-token" type="hidden" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
246 echo sprintf('<p>認証を<a href="javascript:void(0);" onClick="' . $script . '">解除する</p>');
247 },
248 'codoc',
249 'setting_section_id'
250 );
251
252 }
253
254 // ない場合
255 if (!$CODOC_AUTHINFO and !isset($_GET['auth_by_myself'])) {
256 add_settings_field(
257 'codoc_auth',
258 '認証',
259 function() {
260
261 //$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
262 $current_url = admin_url('options-general.php') . '?page=codoc';
263 $login_url = sprintf("location.href='%s'",CODOC_URL . '/me/token?from=wp&return_url=' . urlencode($current_url));
264 $register_url = sprintf("location.href='%s'",CODOC_URL . '/register?from=wp&return_url=' . urlencode($current_url));
265 // submitを消しておく
266 echo ('<script type="text/javascript">window.onload=function(){document.getElementById(\'submit\').style.display = \'none\'}</script>');
267 echo ('codocをWordPressでご利用いただくには認証が�
268 要です。<br />');
269 echo sprintf('ユーザーコードとAPIトークンを<a href="%s&auth_by_myself=1">直接�
270 �力</a>することでも認証できます。<br /><br />',$current_url);
271 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);
272
273
274 },
275 'codoc',
276 'setting_section_id'
277 );
278 }
279 // ない場合かつ自分で認証する場合
280 if (!$CODOC_AUTHINFO and (isset($_GET['auth_by_myself']) and $_GET['auth_by_myself'])) {
281 register_setting(
282 'codoc_option_group', // option group
283 CODOC_USERCODE_OPTION_NAME
284 );
285 add_settings_field(
286 'codoc_usercode',
287 'ユーザーコード',
288 function() {
289 global $CODOC_USERCODE;
290 echo sprintf('<input type="text" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
291 },
292 'codoc',
293 'setting_section_id'
294 );
295 register_setting(
296 'codoc_option_group', // option group
297 CODOC_TOKEN_OPTION_NAME
298 );
299 add_settings_field(
300 'codoc_token',
301 'APIトークン',
302 function() {
303 global $CODOC_TOKEN;
304 echo sprintf('<input type="text" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
305 },
306 'codoc',
307 'setting_section_id'
308 );
309 }
310
311 // 認証�
312 報を保存
313 add_action( 'update_option_' . CODOC_USERCODE_OPTION_NAME, function( $old_value, $new_value ) {
314 global $CODOC_RE_AUTHORIZE;
315 $CODOC_RE_AUTHORIZE = 1;
316 },9,2); // $hook, $function_to_add, $priority, $accepted_args
317 add_action( 'update_option_' . CODOC_TOKEN_OPTION_NAME, function( $old_value, $new_value ) {
318 global $CODOC_RE_AUTHORIZE;
319 $CODOC_RE_AUTHORIZE = 1;
320 },10,2);
321 add_action('updated_option',function(){
322 global $CODOC_RE_AUTHORIZE;
323 if ($CODOC_RE_AUTHORIZE) {
324 $data = $this->callAPI('GET','');
325 if ($data->status and $user = $data->user) {
326 update_option(CODOC_AUTHINFO_OPTION_NAME,[
327 'email' => $user->email,
328 'name' => $user->name,
329 ]);
330 } else {
331 update_option(CODOC_AUTHINFO_OPTION_NAME,'');
332 }
333 }
334 });
335
336 });
337 // プラグイン一覧に設定のリンクをいれる
338 add_filter( 'plugin_action_links_' . plugin_basename( plugin_dir_path( __FILE__ ) . 'codoc' . '.php' ),
339 function( $links ) {
340 $setting_link = sprintf( '<a href="%s">%s</a>', esc_url( add_query_arg( 'page', 'codoc', admin_url( 'options-general.php' ) ) ), esc_html( '設定' ) );
341 array_unshift( $links, $setting_link );
342
343 return $links;
344 }
345 );
346
347 }
348 public function add_mce() {
349 // Add Shortcode options in the WordPres visual editors
350 //wp_enqueue_script( 'codoc-editor-script', CODOC_URL . 'codoc/src_mce/codoc-editor.js');
351
352 add_action( 'init', function() {
353 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
354 return;
355 }
356 if ( get_user_option( 'rich_editing' ) == 'true' ) {
357 // プラグイン�
358 で使うCSRF を生成
359 $path = plugins_url( 'codoc/src_mce/codoc-editor-onload.js', __DIR__ );
360 wp_enqueue_script( 'codoc-editor-onload', $path, array('jquery'), '', true );
361 // I just want to insert this global variables but i don't know how i can do it..
362 wp_localize_script(
363 'codoc-editor-onload',
364 'CODOCEDITOR',
365 array(
366 'action' => 'codoc_shortcodes',
367 'nonce' => wp_create_nonce( 'codoc_shortcodes' ),
368
369 'codoc_url' => CODOC_URL,
370 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
371 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
372 'codoc_sdk_path' => CODOC_SDK_PATH,
373 )
374 );
375
376 // ここでtinymceのプラグイン追加
377 //wp_enqueue_style( 'codoc-admin-style', plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
378 //add_editor_style( plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
379 wp_enqueue_style( 'codoc-admin-style', CODOC_URL . CODOC_SDK_PATH . '.tinymce.css?c=' . date('Ymd') );
380 add_editor_style( CODOC_URL . CODOC_SDK_PATH . '.tinymce.css' );
381
382 add_filter( 'mce_external_plugins', function( $plugin_array ) {
383 //$plugin_array['codoc'] = plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ );
384 $plugin_array['codoc'] = CODOC_URL . CODOC_SDK_PATH . '.tinymce.js?c=' . date('Ymd');
385 return $plugin_array;
386 } );
387 add_filter( 'mce_buttons', function( $buttons ) {
388 array_push( $buttons, "|", "codoc" );
389 return $buttons;
390 } );
391
392 }
393 } );
394 }
395 public function save_post($post_ID,$post,$update) {
396 if (preg_match('/^(auto-draft|inherit)$/',$post->post_status)) {
397 return;
398 }
399
400 $post_content = $post->post_content;
401 preg_match('/wp:codoc\/codoc-block +?({.*})/',$post_content,$matches);
402 // GUTENBERG で指定されたjson(記事�
403 )がない場合
404 if (!$matches) {
405 return;
406 }
407 // GUTENBERG で保存している�
408 容を取得
409 $codoc_info = json_decode($matches[1],true);
410 // codoc タグがない場合はなにもしない
411 //preg_match('/(<span +data-id="codoc-tag"[^>]+>(?:.+|)<\/span>)/',$post_content,$matches);
412 preg_match('/(<(?:span|div)[^>]+data-id="codoc-tag"(?:[^>]+|)>(?:.+|)<\/(?:span|div)>)/',$post_content,$matches);
413 if (!$matches) {
414 return;
415 }
416 // TODO: split or html parse? HTMLがつながってる場合はおかしくなる
417 // classic(tinymce)版の場合p、もしくはdivにかこまれている
418 $splited = preg_split('/(?:<(?:div|p)(?:[^>]+|)>|)<\!-- +wp:codoc\/codoc-block .*<\!-- +\/wp:codoc\/codoc-block +-->(?:<\/(?:div|p)>|)/s',$post_content);
419 $status = $post->post_status == 'publish' ? 1 : 0;
420 # $body_free = '';
421 # $body_paywalled = '';
422 # if (count($splited) >= 2) {
423 #
424 # }
425 $binded_url = get_permalink($post_ID);
426 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
427 if (isset($CODOC_SETTINGS['str_replace_binded_url_from']) and
428 isset($CODOC_SETTINGS['str_replace_binded_url_to']) and
429 $CODOC_SETTINGS['str_replace_binded_url_from']) {
430 $binded_url = str_replace(sanitize_text_field($CODOC_SETTINGS['str_replace_binded_url_from']),
431 sanitize_text_field($CODOC_SETTINGS['str_replace_binded_url_to']),
432 $binded_url);
433 }
434
435 $params = [
436 'title' => $post->post_title,
437 'body_free' => $splited[0],
438 'body_paywalled' => $splited[1],
439 'status' => $status,
440 'binded_url' => $binded_url,
441 'show_price' => isset($codoc_info['showPrice']) ? ($codoc_info['showPrice'] ? 1 : 0) : 0,
442 'price' => isset($codoc_info['price']) ? $codoc_info['price'] : 100,
443 'limited' => isset($codoc_info['limited']) ? ($codoc_info['limited'] ? 1 : 0) : 0,
444 'limited_count' => isset($codoc_info['limitedCount']) ? $codoc_info['limitedCount'] : 1,
445 'affiliate_mode' => isset($codoc_info['affiliateMode']) ? ($codoc_info['affiliateMode'] ? 1 : 0) : 0,
446 'affiliate_rate' => isset($codoc_info['affiliateRate']) ? $codoc_info['affiliateRate'] : '0.0500',
447 'show_support' => isset($codoc_info['showSupport']) ? ($codoc_info['showSupport'] ? 1 : 0) : 0,
448 'subscriptions' => isset($codoc_info['subscriptions']) ? array_keys($codoc_info['subscriptions']) : [],
449 ];
450 $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
451 if ($entryCode) {
452 $res = $this->callAPI('PUT','/entries/' . $entryCode ,$params);
453 } else {
454 $res = $this->callAPI('POST', '/entries', $params);
455 if (is_object($res) and $res->status) {
456 update_post_meta($post_ID,'codoc_entry_code',$res->entry->code);
457 }
458 }
459 return true;
460 }
461 function updated_post_meta( $meta_ID, $post_ID, $meta_key ) {
462 if ($meta_key != '_thumbnail_id') {
463 return;
464 }
465 if ( has_post_thumbnail($post_ID) ) {
466 $attachment = wp_get_attachment_metadata( get_post_thumbnail_id($post_ID));
467 $upload_dir = wp_upload_dir();
468 $file_path = sprintf ('%s/%s',$upload_dir['basedir'],$attachment['file']);
469
470 if (is_readable($file_path)) {
471 $name = 'file';
472
473 $boundary = wp_generate_password(24);
474
475 $payload = '';
476 $payload .= '--' . $boundary;
477 $payload .= "\r\n";
478 $payload .= 'Content-Disposition: form-data; name="' . $name . '"; filename="' . basename( $file_path ) . '"' . "\r\n";
479 $payload .= "Content-Type: application/octet-stream\r\n";
480 $payload .= "Content-Transfer-Encoding: binary\r\n";
481 $payload .= "\r\n";
482 $payload .= file_get_contents( $file_path );
483 $payload .= "\r\n";
484
485 $payload .= '--' . $boundary . '--';
486
487
488 $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
489 $res = $this->callAPI(
490 'POST',
491 '/entries/' . $entryCode . '/thumbnail',
492 $payload,
493 ['content-type' => 'multipart/form-data; boundary=' . $boundary]
494 );
495 }
496 }
497 }
498 function deleted_post_meta( $meta_ids, $post_ID, $meta_key,$meta_value ) {
499 if ($meta_key != '_thumbnail_id') {
500 return;
501 }
502 $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
503 $res = $this->callAPI(
504 'POST',
505 '/entries/' . $entryCode . '/thumbnail',
506 [ "reset" => 1 ]
507 );
508 }
509 function the_content( $post_content ) {
510 if ( is_single() && in_the_loop() && is_main_query() ) {
511 }
512 // codoc タグがあるかどうか (202001:span -> div に変更)
513 preg_match('/(<(span|div)[^>]+data-id="codoc-tag"(?:[^>]+|)>(?:.+|)<\/(?:div|span)>)/',$post_content,$matches);
514 // data-wp-plugin-ver が無いタグは分割しない
515 if (!$matches) {
516 return $post_content;
517 }
518 // codocタグで分割 (202001: gutenbergで直前のdivタグを削除)
519 $tag_regex = '/(?:<div(?:[^>]+|)>|)<(?:span|div)[^>]+data-id="codoc-tag"(?:[^>]+|)>(?:.+|)<\/(?:span|div)>(?:<\/div>|)/';
520 if ( is_preview() ) {
521 $post_content = preg_replace($tag_regex,'<div class="codoc-continue">ここから上は無料で表示されます</div>',$post_content);
522 return $post_content;
523 }
524 // codoc タグの前後で分ける
525 $splited = preg_split($tag_regex,$post_content);
526 // codoc タグにID属性のentrycodeとdata-without-body(無料分を非表示)をつける
527 $post = get_post();
528 $entryCode = sprintf('"codoc-entry-%s" ',get_post_meta($post->ID,'codoc_entry_code',true));
529 $codoc_tag = preg_replace('/<((?:span|div)[^>]+)data-id="[^"]+"((?:[^>]+|))>/','<${1} ${2} data-without-body="1" id=' . $entryCode . ">", $matches[1]);
530
531 # THE THOR の page-lp.php が " " をけずるための対策
532 # "div class" -> "div class"
533 $codoc_tag = preg_replace('/div +class/','div class',$codoc_tag);
534 // 無料部分のみ表示
535 return $splited[0] . sprintf('<div class="wp-block-codoc-codoc-block">%s</div>',$codoc_tag);
536 }
537
538
539 }
540
541