PluginProbe
codoc / 0.9
codoc v0.9
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
← All changes | class-codoc.php +102 -154 0.50.9 View file →
@@ -1,6 +1,6 @@
1 1 <?php
2 -
2 +require_once(plugin_dir_path( __FILE__ ) .'class-codoc-util.php');
3 3 final class Codoc {
4 4
5 5 public function __construct() {
6 6 if (is_admin()) {
@@ -6,12 +6,19 @@
6 6 if (is_admin()) {
7 7 // setting
8 8 $this->add_settings();
9 9 }
10 +
11 + // usercode, token はadminページのみDBから取得する
12 + $this->util = new CodocUtil(["usercode" => 1, "token" => 1 ]);
13 +
10 14 $auth_info = get_option(CODOC_AUTHINFO_OPTION_NAME);
11 15 if (!$auth_info) {
12 16 return $this;
13 17 }
18 + $this->util->usercode = get_option(CODOC_USERCODE_OPTION_NAME);
19 + $this->util->token = get_option(CODOC_TOKEN_OPTION_NAME);
20 +
14 21
15 22 // データ同期 (save_postはis_adminで実行されないケースがある)
16 23 add_action( 'save_post', [$this,'save_post'], 20, 3 );
17 24 add_action( 'added_post_meta', [$this,'updated_post_meta'], 10, 3 );
@@ -16,25 +23,33 @@
16 23 add_action( 'save_post', [$this,'save_post'], 20, 3 );
17 24 add_action( 'added_post_meta', [$this,'updated_post_meta'], 10, 3 );
18 25 add_action( 'updated_post_meta',[$this,'updated_post_meta'], 10, 3 );
19 26 add_action( 'deleted_post_meta',[$this,'deleted_post_meta'], 10, 4 );
27 + // paywall用の本文非表示化とcodocタグへの属性追加
28 + add_filter('the_content',[$this,'the_content']);
20 29
21 30 if (is_admin()) {
22 - // gutenberg
23 - require_once 'src/init.php';
31 + // Gutenberg のサポートがない場合は何もしない
32 + if ( function_exists( 'register_block_type' ) ) {
33 + // gutenberg
34 + require_once 'src/init.php';
35 + add_action('wp_loaded', function() {
36 + wp_localize_script('wordpress-cgb-block-js', 'OPTIONS', array(
37 + 'codoc_url' => CODOC_URL,
38 + 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
39 + 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
40 + 'codoc_sdk_path' => CODOC_SDK_PATH,
41 + ));
42 + });
43 + }
24 44 // tinymce
25 45 $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 - });
46 +
33 47 return $this;
34 48 }
49 +
50 + // codocのJS登録
35 51
36 - // codocのJS登録
37 52 add_action( 'wp_enqueue_scripts', function() {
38 53 wp_enqueue_script( 'codoc-injector-js', CODOC_URL . '/js/cms.js' );
39 54 });
40 55 // 登録したscriptタグに属性をつける
@@ -41,10 +56,8 @@
41 56 add_filter('script_loader_tag', [$this,'modifier_script_tag'],10,2);
42 57 // tinymce用のショートコード
43 58 add_shortcode('codoc', [$this, 'injector_shortcode']);
44 59
45 - // paywall用の本文非表示化とcodocタグへの属性追加
46 - add_filter('the_content',[$this,'the_content']);
47 60 return $this;
48 61 }
49 62
50 63 public function modifier_script_tag($tag,$handle) {
@@ -55,9 +68,10 @@
55 68 $data_css = '';
56 69 if ($css_path = $CODOC_SETTINGS['css_path']) {
57 70 $data_css = sprintf(' data-css="%s" ',$css_path);
58 71 }
59 - return str_replace(' src=', $data_css . ' defer src=', $tag);
72 + //return str_replace(' src=', $data_css . ' defer src=', $tag);
73 + return preg_replace('/(src=[^>]+)/',' ${1} ' . $data_css . ' defer',$tag);
60 74 }
61 75 public function injector_shortcode($atts) {
62 76 global $post;
63 77 ob_start();
@@ -131,12 +145,12 @@
131 145 if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['fetch_token_key'])) {
132 146 $key = sanitize_text_field($_GET['fetch_token_key']);
133 147 $usercode = sanitize_text_field($_GET['usercode']);
134 148 update_option(CODOC_USERCODE_OPTION_NAME,$usercode);
135 - $data = $this->callAPI('GET','/token',[ "fetch_token_key" => $key ]);
149 + $data = $this->util->callAPI('GET','/token',[ "fetch_token_key" => $key ]);
136 150 if ($data->status and $token = $data->token) {
137 151 update_option(CODOC_TOKEN_OPTION_NAME,$token);
138 - $data = $this->callAPI('GET','');
152 + $data = $this->util->callAPI('GET','');
139 153 if ($data->status and $user = $data->user) {
140 154 update_option(CODOC_AUTHINFO_OPTION_NAME,[
141 155 'email' => $user->email,
142 156 'name' => $user->name,
@@ -143,9 +157,9 @@
143 157 ]);
144 158 }
145 159 #$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
146 160 #$current_url = preg_replace('/(.*)fetch_token_key.*/','${1}&codoc_auth_finished=1',$current_url);
147 - add_settings_error( 'general', 'settings_updated', __( 'OKKK' ), 'success' );
161 + //add_settings_error( 'general', 'settings_updated', __( 'OK' ), 'success' );
148 162 $current_url = admin_url('options-general.php') . '?page=codoc&codoc_auth_finished=1';
149 163
150 164 wp_redirect( $current_url);
151 165 exit;
@@ -172,8 +186,14 @@
172 186 }
173 187 if (!isset($CODOC_SETTINGS['str_replace_binded_url_to'])) {
174 188 $CODOC_SETTINGS['str_replace_binded_url_to'] = '';
175 189 }
190 + if (!isset($CODOC_SETTINGS['str_before_codoc_tag'])) {
191 + $CODOC_SETTINGS['str_before_codoc_tag'] = '';
192 + }
193 + if (!isset($CODOC_SETTINGS['str_after_codoc_tag'])) {
194 + $CODOC_SETTINGS['str_after_codoc_tag'] = '';
195 + }
176 196
177 197 add_settings_section(
178 198 'setting_section_id', // id
179 199 'codoc 設定ページ', // title
@@ -209,8 +229,23 @@
209 229 'codoc', //page
210 230 'setting_section_id' //Section
211 231 );
212 232
233 + add_settings_field(
234 + 'str_around_codoc_tag', // id
235 + 'codocタグの前後にHTMLを挿入', // title
236 + function() {
237 + global $CODOC_SETTINGS;
238 + echo sprintf('<textarea name="%s[str_before_codoc_tag]" cols="40">%s</textarea>',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['str_before_codoc_tag']);
239 + echo ('を前に挿入<br />');
240 + echo sprintf('<textarea name="%s[str_after_codoc_tag]" cols="40">%s</textarea>',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['str_after_codoc_tag']);
241 + echo ('を後に挿入');
242 +
243 + },
244 + 'codoc', //page
245 + 'setting_section_id' //Section
246 + );
247 +
213 248 register_setting(
214 249 'codoc_option_group', // option group
215 250 CODOC_USERCODE_OPTION_NAME
216 251 );
@@ -252,10 +287,10 @@
252 287 function() {
253 288
254 289 //$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
255 290 $current_url = admin_url('options-general.php') . '?page=codoc';
256 - $login_url = sprintf("location.href='%s'",CODOC_URL . '/me/token?from_wp=1&return_url=' . urlencode($current_url));
257 - $register_url = sprintf("location.href='%s'",CODOC_URL . '/register?from_wp=1&return_url=' . urlencode($current_url));
291 + $login_url = sprintf("location.href='%s'",CODOC_URL . '/me/token?from=wp&return_url=' . urlencode($current_url));
292 + $register_url = sprintf("location.href='%s'",CODOC_URL . '/register?from=wp&return_url=' . urlencode($current_url));
258 293 // submitを消しておく
259 294 echo ('<script type="text/javascript">window.onload=function(){document.getElementById(\'submit\').style.display = \'none\'}</script>');
260 295 echo ('codocをWordPressでご利用いただくには認証が必要です。<br />');
261 296 echo sprintf('ユーザーコードとAPIトークンを<a href="%s&auth_by_myself=1">直接入力</a>することでも認証できます。<br /><br />',$current_url);
@@ -310,9 +345,9 @@
310 345 },10,2);
311 346 add_action('updated_option',function(){
312 347 global $CODOC_RE_AUTHORIZE;
313 348 if ($CODOC_RE_AUTHORIZE) {
314 - $data = $this->callAPI('GET','');
349 + $data = $this->util->callAPI('GET','');
315 350 if ($data->status and $user = $data->user) {
316 351 update_option(CODOC_AUTHINFO_OPTION_NAME,[
317 352 'email' => $user->email,
318 353 'name' => $user->name,
@@ -323,12 +358,23 @@
323 358 }
324 359 });
325 360
326 361 });
362 + // プラグイン一覧に設定のリンクをいれる
363 + add_filter( 'plugin_action_links_' . plugin_basename( plugin_dir_path( __FILE__ ) . 'codoc' . '.php' ),
364 + function( $links ) {
365 + $setting_link = sprintf( '<a href="%s">%s</a>', esc_url( add_query_arg( 'page', 'codoc', admin_url( 'options-general.php' ) ) ), esc_html( '設定' ) );
366 + array_unshift( $links, $setting_link );
367 +
368 + return $links;
369 + }
370 + );
371 +
327 372 }
328 373 public function add_mce() {
329 374 // Add Shortcode options in the WordPres visual editors
330 - // wp_enqueue_script( 'codoc-editor-script', plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ ));
375 + //wp_enqueue_script( 'codoc-editor-script', CODOC_URL . 'codoc/src_mce/codoc-editor.js');
376 +
331 377 add_action( 'init', function() {
332 378 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
333 379 return;
334 380 }
@@ -341,15 +387,26 @@
341 387 'codoc-editor-onload',
342 388 'CODOCEDITOR',
343 389 array(
344 390 'action' => 'codoc_shortcodes',
345 - 'nonce' => wp_create_nonce( 'codoc_shortcodes' )
391 + 'nonce' => wp_create_nonce( 'codoc_shortcodes' ),
392 +
393 + 'codoc_url' => CODOC_URL,
394 + 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
395 + 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
396 + 'codoc_sdk_path' => CODOC_SDK_PATH,
346 397 )
347 398 );
399 +
348 400 // ここでtinymceのプラグイン追加
349 - wp_enqueue_style( 'codoc-admin-style', plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
401 + //wp_enqueue_style( 'codoc-admin-style', plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
402 + //add_editor_style( plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
403 + wp_enqueue_style( 'codoc-admin-style', CODOC_URL . CODOC_SDK_PATH . '.tinymce.css?c=' . date('Ymd') );
404 + add_editor_style( CODOC_URL . CODOC_SDK_PATH . '.tinymce.css' );
405 +
350 406 add_filter( 'mce_external_plugins', function( $plugin_array ) {
351 - $plugin_array['codoc'] = plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ );
407 + //$plugin_array['codoc'] = plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ );
408 + $plugin_array['codoc'] = CODOC_URL . CODOC_SDK_PATH . '.tinymce.js?c=' . date('Ymd');
352 409 return $plugin_array;
353 410 } );
354 411 add_filter( 'mce_buttons', function( $buttons ) {
355 412 array_push( $buttons, "|", "codoc" );
@@ -354,32 +411,9 @@
354 411 add_filter( 'mce_buttons', function( $buttons ) {
355 412 array_push( $buttons, "|", "codoc" );
356 413 return $buttons;
357 414 } );
358 - add_action( 'wp_ajax_codoc_shortcodes', function(){
359 - check_ajax_referer( 'codoc_shortcodes' );
360 - if ($usercode = sanitize_text_field($_GET['usercode'])) {
361 - update_option('codoc_usercode',$usercode);
362 - }
363 - $usercode = get_option(CODOC_USERCODE_OPTION_NAME) ? get_option(CODOC_USERCODE_OPTION_NAME) : 'nocode';
364 - $uri = CODOC_URL . '/api/v1/paywall/' . $usercode . '/entries';
365 - if ($entrycode = sanitize_text_field($_GET['entrycode'])) {
366 - $uri = $uri . '/' . $entrycode;
367 - }
368 - $args = preg_match('/local/',CODOC_URL) ? ['sslverify' => false ] : [];
369 - $response = wp_remote_request( $uri, $args );
370 -
371 - if ($response instanceof WP_Error) {
372 - exit;
373 - }
374 -
375 - $response['body'] = json_decode($response['body'], true);
376 - $entries = $response['body']['entries'];
377 415
378 - require 'views/codoc-shortcodes-list.php';
379 -
380 - wp_die();
381 - } );
382 416 }
383 417 } );
384 418 }
385 419 public function save_post($post_ID,$post,$update) {
@@ -385,63 +419,18 @@
385 419 public function save_post($post_ID,$post,$update) {
386 420 if (preg_match('/^(auto-draft|inherit)$/',$post->post_status)) {
387 421 return;
388 422 }
389 -
390 - $post_content = $post->post_content;
391 - preg_match('/wp:codoc\/codoc-block +?({.*})/',$post_content,$matches);
392 - // GUTENBERG で指定されたjson(記事情報)がない場合
393 - if (!$matches) {
394 - return;
395 - }
396 - // GUTENBERG で保存している内容を取得
397 - $codoc_info = json_decode($matches[1],true);
398 - // codoc タグがない場合はなにもしない
399 - preg_match('/(<span +data-id="codoc-tag"[^>]+>(?:.+|)<\/span>)/',$post_content,$matches);
400 - if (!$matches) {
401 - return;
402 - }
403 - // TODO: split or html parse? HTMLがつながってる場合はおかしくなる
404 - $splited = preg_split('/<\!-- +wp:codoc\/codoc-block .*<\!-- +\/wp:codoc\/codoc-block +-->/s',$post_content);
405 - $status = $post->post_status == 'publish' ? 1 : 0;
406 - # $body_free = '';
407 - # $body_paywalled = '';
408 - # if (count($splited) >= 2) {
409 - #
410 - # }
411 - $binded_url = get_permalink($post_ID);
412 - $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
413 - if (isset($CODOC_SETTINGS['str_replace_binded_url_from']) and
414 - isset($CODOC_SETTINGS['str_replace_binded_url_to']) and
415 - $CODOC_SETTINGS['str_replace_binded_url_from']) {
416 - $binded_url = str_replace(sanitize_text_field($CODOC_SETTINGS['str_replace_binded_url_from']),
417 - sanitize_text_field($CODOC_SETTINGS['str_replace_binded_url_to']),
418 - $binded_url);
419 - }
420 -
421 - $params = [
422 - 'title' => $post->post_title,
423 - 'body_free' => $splited[0],
424 - 'body_paywalled' => $splited[1],
425 - 'status' => $status,
426 - 'binded_url' => $binded_url,
427 - 'show_price' => isset($codoc_info['showPrice']) ? ($codoc_info['showPrice'] ? 1 : 0) : 0,
428 - 'price' => isset($codoc_info['price']) ? $codoc_info['price'] : 100,
429 - 'limited' => isset($codoc_info['limited']) ? ($codoc_info['limited'] ? 1 : 0) : 0,
430 - 'limited_count' => isset($codoc_info['limitedCount']) ? $codoc_info['limitedCount'] : 1,
431 - 'affiliate_mode' => isset($codoc_info['affiliateMode']) ? ($codoc_info['affiliateMode'] ? 1 : 0) : 0,
432 - 'affiliate_rate' => isset($codoc_info['affiliateRate']) ? $codoc_info['affiliateRate'] : '0.0500',
433 - 'show_support' => isset($codoc_info['showSupport']) ? ($codoc_info['showSupport'] ? 1 : 0) : 0,
434 - 'subscriptions' => isset($codoc_info['subscriptions']) ? array_keys($codoc_info['subscriptions']) : [],
435 - ];
436 423 $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
437 - if ($entryCode) {
438 - $res = $this->callAPI('PUT','/entries/' . $entryCode ,$params);
439 - } else {
440 - $res = $this->callAPI('POST', '/entries', $params);
441 - if (is_object($res) and $res->status) {
442 - update_post_meta($post_ID,'codoc_entry_code',$res->entry->code);
443 - }
424 + $res = $this->util->sync_entry([
425 + "post_title" => $post->post_title,
426 + "post_content" => $post->post_content,
427 + "post_status" => ($post->post_status == 'publish' ? 1 : 0), # 0, 1
428 + "post_permalink" => get_permalink($post_ID),
429 + "codoc_entry_code" => $entryCode,
430 + ]);
431 + if (is_object($res) and $res->status and !$entryCode) {
432 + update_post_meta($post_ID,'codoc_entry_code',$res->entry->code);
444 433 }
445 434 return true;
446 435 }
447 436 function updated_post_meta( $meta_ID, $post_ID, $meta_key ) {
@@ -451,35 +440,13 @@
451 440 if ( has_post_thumbnail($post_ID) ) {
452 441 $attachment = wp_get_attachment_metadata( get_post_thumbnail_id($post_ID));
453 442 $upload_dir = wp_upload_dir();
454 443 $file_path = sprintf ('%s/%s',$upload_dir['basedir'],$attachment['file']);
455 -
456 - if (is_readable($file_path)) {
457 - $name = 'file';
458 -
459 - $boundary = wp_generate_password(24);
460 -
461 - $payload = '';
462 - $payload .= '--' . $boundary;
463 - $payload .= "\r\n";
464 - $payload .= 'Content-Disposition: form-data; name="' . $name . '"; filename="' . basename( $file_path ) . '"' . "\r\n";
465 - $payload .= "Content-Type: application/octet-stream\r\n";
466 - $payload .= "Content-Transfer-Encoding: binary\r\n";
467 - $payload .= "\r\n";
468 - $payload .= file_get_contents( $file_path );
469 - $payload .= "\r\n";
470 -
471 - $payload .= '--' . $boundary . '--';
472 -
473 -
474 - $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
475 - $res = $this->callAPI(
476 - 'POST',
477 - '/entries/' . $entryCode . '/thumbnail',
478 - $payload,
479 - ['content-type' => 'multipart/form-data; boundary=' . $boundary]
480 - );
481 - }
444 + return $this->util->post_thumbnail([
445 + "file_path" => $file_path,
446 + "boundary" => wp_generate_password(24),
447 + "codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true),
448 + ]);
482 449 }
483 450 }
484 451 function deleted_post_meta( $meta_ids, $post_ID, $meta_key,$meta_value ) {
485 452 if ($meta_key != '_thumbnail_id') {
@@ -484,39 +451,20 @@
484 451 function deleted_post_meta( $meta_ids, $post_ID, $meta_key,$meta_value ) {
485 452 if ($meta_key != '_thumbnail_id') {
486 453 return;
487 454 }
488 - $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
489 - $res = $this->callAPI(
490 - 'POST',
491 - '/entries/' . $entryCode . '/thumbnail',
492 - [ "reset" => 1 ]
493 - );
455 + return $this->util->reset_thumbnail(["codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true)]);
494 456 }
495 457 function the_content( $post_content ) {
496 458 if ( is_single() && in_the_loop() && is_main_query() ) {
497 459 }
498 - // codoc タグがあるかどうか
499 - preg_match('/(<span +data-id="codoc-tag[^>]+>(?:.+|)<\/span>)/',$post_content,$matches);
500 - // data-wp-plugin-ver が無いタグは分割しない
501 - if (!$matches) {
502 - return $post_content;
503 - }
504 - if ( is_preview() ) {
505 - return $post_content;
506 - }
507 - // codoc タグの前後で分ける
508 - $splited = preg_split('/<div><span data-id="codoc-tag" class="codoc-entries">(?:.+|)<\/span><\/div>/',$post_content);
509 - //$splited = preg_split('/<div +class="wp-block-codoc-codoc-block">.*<\/div>/s',$post_content);
510 - // codco タグにentrycodeをつける
511 460 $post = get_post();
512 - $entryCode = sprintf('"codoc-entry-%s" ',get_post_meta($post->ID,'codoc_entry_code',true));
513 - $codoc_tag = str_replace('span','span id=' . $entryCode, $matches[1]);
514 - // codoc タグに属性をつける
515 - $codoc_tag = str_replace('span','span data-without-body="1" ',$codoc_tag);
516 - // 無料部分のみ表示
517 - return $splited[0] . sprintf('<div class="wp-block-codoc-codoc-block">%s</div>',$codoc_tag);
461 + return $this->util->filter_content([
462 + "post_content" => $post_content,
463 + "preview" => is_preview(),
464 + "codoc_entry_code" => sprintf('"codoc-entry-%s" ',get_post_meta($post->ID,'codoc_entry_code',true)),
465 + "codoc_settings" => get_option(CODOC_SETTINGS_OPTION_NAME),
466 + ]);
518 467 }
519 -
520 468
521 469 }
522 470