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

459 lines 18.3 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();
13
14 // paywall用の本文非表示化とcodocタグへの属性追加
15 add_filter('the_content',[$this,'the_content']);
16
17 $auth_info = get_option(CODOC_AUTHINFO_OPTION_NAME);
18
19 if ($auth_info) {
20 // データ同期 (save_postはis_adminで実行されないケースがある)
21 add_action( 'save_post', [$this,'save_post'], 20, 3 );
22 add_action( 'added_post_meta', [$this,'updated_post_meta'], 10, 3 );
23 add_action( 'updated_post_meta',[$this,'updated_post_meta'], 10, 3 );
24 add_action( 'deleted_post_meta',[$this,'deleted_post_meta'], 10, 4 );
25 }
26 if (is_admin() and $auth_info) { //管理画面
27 // Gutenberg のサポートがない場合は何もしない
28 if ( function_exists( 'register_block_type' ) ) {
29 // gutenberg
30 require_once 'src/init.php';
31 add_action('wp_loaded', function() {
32 wp_localize_script('wordpress-cgb-block-js', 'OPTIONS', array(
33 'codoc_url' => CODOC_URL,
34 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
35 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
36 'codoc_sdk_path' => CODOC_SDK_PATH,
37 ));
38 });
39 }
40 // tinymce
41 $this->add_mce();
42 } else { // ブログ画面
43 // codocのJS登録
44 add_action( 'wp_enqueue_scripts', function() {
45 wp_enqueue_script( 'codoc-injector-js', CODOC_URL . '/js/cms.js' );
46 });
47 // 登録したscriptタグに属性をつける
48 add_filter('script_loader_tag', [$this,'modifier_script_tag'],10,2);
49 // tinymce用のショートコード
50 add_shortcode('codoc', [$this, 'injector_shortcode']);
51 }
52 return $this;
53 }
54
55 public function modifier_script_tag($tag,$handle) {
56 if($handle !== 'codoc-injector-js') {
57 return $tag;
58 }
59 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
60 $data_css = '';
61 if ($css_path = $CODOC_SETTINGS['css_path']) {
62 $data_css = sprintf(' data-css="%s" ',$css_path);
63 }
64 //return str_replace(' src=', $data_css . ' defer src=', $tag);
65 return preg_replace('/(src=[^>]+)/',' ${1} ' . $data_css . ' defer',$tag);
66 }
67 public function injector_shortcode($atts) {
68 global $post;
69 ob_start();
70 require 'views/codoc-injector.php';
71 return ob_get_clean();
72 }
73 # settings / 設定関連
74 public function add_settings() {
75 global $CODOC_SETTINGS;
76 add_action( 'admin_menu' ,function(){
77 add_options_page(
78 'codoc の設定', //ページタイトル
79 'codoc', //設定メニューに表示されるメニュータイトル
80 'edit_users', //権限
81 'codoc', //設定ページのURL。options-general.php?page=codoc
82 function() {
83 echo '<div clas="wrap">';
84 echo '<form method="post" action="options.php">';
85 settings_fields( 'codoc_option_group' );
86 do_settings_sections( 'codoc' );
87 submit_button(); // 送信ボタン
88 echo '</form></div>';
89 }
90 );
91 });
92
93 add_action( "admin_init", function() {
94 // codocからの認証データ処理
95 if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['fetch_token_key'])) {
96 $key = sanitize_text_field($_GET['fetch_token_key']);
97 $usercode = sanitize_text_field($_GET['usercode']);
98 update_option(CODOC_USERCODE_OPTION_NAME,$usercode);
99 //$data = $this->callAPI('GET','/token',[ "fetch_token_key" => $key ]);
100 $data = $this->util->get_token([ "fetch_token_key" => $key ],["usercode" => $usercode, "token" => "1"]);
101 if ($data->status and $token = $data->token) {
102 update_option(CODOC_TOKEN_OPTION_NAME,$token);
103 //$data = $this->callAPI('GET','');
104 $data = $this->util->get_user_info([],["usercode" => $usercode, "token" => $token]);
105 if ($data->status and $user = $data->user) {
106 update_option(CODOC_AUTHINFO_OPTION_NAME,[
107 'email' => $user->email,
108 'name' => $user->name,
109 ]);
110 }
111 #$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
112 #$current_url = preg_replace('/(.*)fetch_token_key.*/','${1}&codoc_auth_finished=1',$current_url);
113 //add_settings_error( 'general', 'settings_updated', __( 'OK' ), 'success' );
114 $current_url = admin_url('options-general.php') . '?page=codoc&codoc_auth_finished=1';
115
116 wp_redirect( $current_url);
117 exit;
118 }
119 }
120
121 global $CODOC_USERCODE;
122 global $CODOC_SETTINGS;
123 global $CODOC_TOKEN;
124 global $CODOC_AUTHINFO;
125 $CODOC_USERCODE = get_option(CODOC_USERCODE_OPTION_NAME);
126 $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
127 $CODOC_TOKEN = get_option(CODOC_TOKEN_OPTION_NAME);
128 $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
129 if( !$CODOC_SETTINGS ) {
130 //デフォルト値
131 $CODOC_SETTINGS = array(
132 'css_path' => '',
133 );
134 update_option( CODOC_SETTINGS_OPTION_NAME, $CODOC_SETTINGS );
135 }
136 if (!isset($CODOC_SETTINGS['str_replace_binded_url_from'])) {
137 $CODOC_SETTINGS['str_replace_binded_url_from'] = '';
138 }
139 if (!isset($CODOC_SETTINGS['str_replace_binded_url_to'])) {
140 $CODOC_SETTINGS['str_replace_binded_url_to'] = '';
141 }
142 if (!isset($CODOC_SETTINGS['str_before_codoc_tag'])) {
143 $CODOC_SETTINGS['str_before_codoc_tag'] = '';
144 }
145 if (!isset($CODOC_SETTINGS['str_after_codoc_tag'])) {
146 $CODOC_SETTINGS['str_after_codoc_tag'] = '';
147 }
148
149 add_settings_section(
150 'setting_section_id', // id
151 'codoc 設定ページ', // title
152 function (){}, // callback
153 'codoc' // page
154 );
155 // 認証がある場合
156 if ($CODOC_AUTHINFO) {
157 register_setting(
158 'codoc_option_group', // option group
159 CODOC_SETTINGS_OPTION_NAME // option name(DB)
160 );
161 add_settings_field(
162 'css_path', // id
163 'カスタマイズ用CSSパス', // title
164 function() {
165 global $CODOC_SETTINGS;
166 echo sprintf('<input type="text" name="%s[css_path]" value="%s">',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['css_path']);
167 },
168 'codoc', //page
169 'setting_section_id' //Section
170 );
171 add_settings_field(
172 'str_replace_binded_url', // id
173 'codoc側に登録するパーマリンクを置換', // title
174 function() {
175 global $CODOC_SETTINGS;
176 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']);
177 echo ('');
178 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']);
179 echo ('に変換');
180 },
181 'codoc', //page
182 'setting_section_id' //Section
183 );
184
185 add_settings_field(
186 'str_around_codoc_tag', // id
187 'codocタグの前後にHTMLを挿�
188 �', // title
189 function() {
190 global $CODOC_SETTINGS;
191 echo sprintf('<textarea name="%s[str_before_codoc_tag]" cols="40">%s</textarea>',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['str_before_codoc_tag']);
192 echo ('を前に挿�
193 �<br />');
194 echo sprintf('<textarea name="%s[str_after_codoc_tag]" cols="40">%s</textarea>',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['str_after_codoc_tag']);
195 echo ('を後に挿�
196 �');
197
198 },
199 'codoc', //page
200 'setting_section_id' //Section
201 );
202
203 register_setting(
204 'codoc_option_group', // option group
205 CODOC_USERCODE_OPTION_NAME
206 );
207 register_setting(
208 'codoc_option_group', // option group
209 CODOC_TOKEN_OPTION_NAME
210 );
211
212 if (isset($_GET['codoc_auth_finished']) and $_GET['codoc_auth_finished']) {
213 add_settings_error( 'general', 'settings_updated', __( 'codocの認証が完了しました' ), 'success' );
214 }
215
216 add_settings_field(
217 'codoc_auth',
218 '認証',
219 function() {
220 global $CODOC_USERCODE;
221 global $CODOC_TOKEN;
222 global $CODOC_AUTHINFO;
223 $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';";
224
225 echo sprintf('<p><font color="green" id="codoc-auth-message"><strong>%s</strong> で認証済</font></p>',$CODOC_AUTHINFO['email']);
226
227 echo sprintf('<input id="codoc-usercode" type="hidden" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
228 echo sprintf('<input id="codoc-token" type="hidden" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
229 echo sprintf('<p>認証を<a href="javascript:void(0);" onClick="' . $script . '">解除する</p>');
230 },
231 'codoc',
232 'setting_section_id'
233 );
234
235 }
236
237 // ない場合
238 if (!$CODOC_AUTHINFO and !isset($_GET['auth_by_myself'])) {
239 add_settings_field(
240 'codoc_auth',
241 '認証',
242 function() {
243
244 //$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
245 $current_url = admin_url('options-general.php') . '?page=codoc';
246 $login_url = sprintf("location.href='%s'",CODOC_URL . '/me/token?from=wp&return_url=' . urlencode($current_url));
247 $register_url = sprintf("location.href='%s'",CODOC_URL . '/register?from=wp&return_url=' . urlencode($current_url));
248 // submitを消しておく
249 echo ('<script type="text/javascript">window.onload=function(){document.getElementById(\'submit\').style.display = \'none\'}</script>');
250 echo ('codocをWordPressでご利用いただくには認証が�
251 要です。<br />');
252 echo sprintf('ユーザーコードとAPIトークンを<a href="%s&auth_by_myself=1">直接�
253 �力</a>することでも認証できます。<br /><br />',$current_url);
254 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);
255
256
257 },
258 'codoc',
259 'setting_section_id'
260 );
261 }
262 // ない場合かつ自分で認証する場合
263 if (!$CODOC_AUTHINFO and (
264 (isset($_GET['auth_by_myself']) and $_GET['auth_by_myself']) or
265 (isset($_POST['auth_by_myself']) and $_POST['auth_by_myself'])
266 )) {
267 register_setting(
268 'codoc_option_group', // option group
269 CODOC_USERCODE_OPTION_NAME
270 );
271 register_setting(
272 'codoc_option_group', // option group
273 CODOC_TOKEN_OPTION_NAME
274 );
275 add_settings_field(
276 'codoc_usercode',
277 'ユーザーコード',
278 function() {
279 global $CODOC_USERCODE;
280 echo '<input type="hidden" name="auth_by_myself" value="1">';
281 echo sprintf('<input type="text" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
282 },
283 'codoc',
284 'setting_section_id'
285 );
286 add_settings_field(
287 'codoc_token',
288 'APIトークン',
289 function() {
290 global $CODOC_TOKEN;
291 echo sprintf('<input type="text" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
292 },
293 'codoc',
294 'setting_section_id'
295 );
296 }
297
298 // 認証�
299 報を保存
300 add_action( 'update_option_' . CODOC_USERCODE_OPTION_NAME, function( $old_value, $new_value ) {
301 global $CODOC_RE_AUTHORIZE;
302 $CODOC_RE_AUTHORIZE = 1;
303 },9,2); // $hook, $function_to_add, $priority, $accepted_args
304 add_action( 'update_option_' . CODOC_TOKEN_OPTION_NAME, function( $old_value, $new_value ) {
305 global $CODOC_RE_AUTHORIZE;
306 $CODOC_RE_AUTHORIZE = 1;
307 },10,2);
308 add_action('updated_option',function(){
309 global $CODOC_RE_AUTHORIZE;
310 if ($CODOC_RE_AUTHORIZE) {
311 //$data = $this->callAPI('GET','');
312 $data = $this->util->get_user_info([],[
313 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
314 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
315 ]);
316 if ($data->status and $user = $data->user) {
317 update_option(CODOC_AUTHINFO_OPTION_NAME,[
318 'email' => $user->email,
319 'name' => $user->name,
320 ]);
321 } else {
322 update_option(CODOC_AUTHINFO_OPTION_NAME,'');
323 }
324 }
325 });
326
327 });
328 // プラグイン一覧に設定のリンクをいれる
329 add_filter( 'plugin_action_links_' . plugin_basename( plugin_dir_path( __FILE__ ) . 'codoc' . '.php' ),
330 function( $links ) {
331 $setting_link = sprintf( '<a href="%s">%s</a>', esc_url( add_query_arg( 'page', 'codoc', admin_url( 'options-general.php' ) ) ), esc_html( '設定' ) );
332 array_unshift( $links, $setting_link );
333
334 return $links;
335 }
336 );
337
338 }
339 public function add_mce() {
340 add_action( 'admin_enqueue_scripts', function() {
341 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
342 return;
343 }
344 $current_screen = get_current_screen();
345 if ( ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) || ( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) ) {
346 // Gutenberg Editor
347 // なにもしない
348 } else {
349 // tinymce
350 if ( get_user_option( 'rich_editing' ) == 'true' ) {
351 // プラグイン�
352 で使うCSRF を生成
353 $path = plugins_url( 'codoc/src_mce/codoc-editor-onload.js', __DIR__ );
354 wp_enqueue_script( 'codoc-editor-onload', $path, array('jquery'), '', true );
355 // I just want to insert this global variables but i don't know how i can do it..
356 wp_localize_script(
357 'codoc-editor-onload',
358 'CODOCEDITOR',
359 array(
360 'action' => 'codoc_shortcodes',
361 'nonce' => wp_create_nonce( 'codoc_shortcodes' ),
362
363 'codoc_url' => CODOC_URL,
364 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
365 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
366 'codoc_sdk_path' => CODOC_SDK_PATH,
367 )
368 );
369
370 // ここでtinymceのプラグイン追加
371 //wp_enqueue_style( 'codoc-admin-style', plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
372 //add_editor_style( plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
373 wp_enqueue_style( 'codoc-admin-style', CODOC_URL . CODOC_SDK_PATH . '.tinymce.css?c=' . date('Ymd') );
374 add_editor_style( CODOC_URL . CODOC_SDK_PATH . '.tinymce.css' );
375
376 add_filter( 'mce_external_plugins', function( $plugin_array ) {
377 //$plugin_array['codoc'] = plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ );
378 $plugin_array['codoc'] = CODOC_URL . CODOC_SDK_PATH . '.tinymce.js?c=' . date('Ymd');
379 return $plugin_array;
380 } );
381 add_filter( 'mce_buttons', function( $buttons ) {
382 array_push( $buttons, "|", "codoc" );
383 return $buttons;
384 } );
385
386 }
387 }
388 } );
389 }
390 public function save_post($post_ID,$post,$update) {
391 if (preg_match('/^(auto-draft|inherit)$/',$post->post_status)) {
392 return;
393 }
394
395 $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
396 $res = $this->util->sync_entry([
397 "post_title" => $post->post_title,
398 "post_content" => $post->post_content,
399 "post_status" => ($post->post_status == 'publish' ? 1 : 0),
400 "post_permalink" => get_permalink($post_ID),
401 "codoc_entry_code" => $entryCode,
402 ],[
403 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
404 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
405 ]);
406
407 if (is_object($res) and $res->status and !$entryCode) {
408 update_post_meta($post_ID,'codoc_entry_code',$res->entry->code);
409 }
410
411 return true;
412 }
413 function updated_post_meta( $meta_ID, $post_ID, $meta_key ) {
414 if ($meta_key != '_thumbnail_id') {
415 return;
416 }
417 if ( has_post_thumbnail($post_ID) ) {
418 $attachment = wp_get_attachment_metadata( get_post_thumbnail_id($post_ID));
419 $upload_dir = wp_upload_dir();
420 $file_path = sprintf ('%s/%s',$upload_dir['basedir'],$attachment['file']);
421
422 return $this->util->post_thumbnail([
423 "file_path" => $file_path,
424 "boundary" => wp_generate_password(24),
425 "codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true),
426 ],[
427 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
428 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
429 ]);
430 }
431 }
432 function deleted_post_meta( $meta_ids, $post_ID, $meta_key,$meta_value ) {
433 if ($meta_key != '_thumbnail_id') {
434 return;
435 }
436 return $this->util->reset_thumbnail(
437 ["codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true)],
438 [
439 "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
440 "token" => get_option(CODOC_TOKEN_OPTION_NAME),
441 ]
442 );
443 }
444
445 function the_content( $post_content ) {
446 if ( is_single() && in_the_loop() && is_main_query() ) {
447 }
448 $post = get_post();
449 return $this->util->filter_content([
450 "post_content" => $post_content,
451 "preview" => is_preview(),
452 "codoc_entry_code" => get_post_meta($post->ID,'codoc_entry_code',true),
453 "codoc_settings" => get_option(CODOC_SETTINGS_OPTION_NAME),
454 ]);
455 }
456
457 }
458
459