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

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