add_settings(); } // usercode, token はadminページのみDBから取得する $this->util = new CodocUtil(); // paywall用の本文非表示化とcodocタグへの属性追加 add_filter('the_content',[$this,'the_content']); $auth_info = get_option(CODOC_AUTHINFO_OPTION_NAME); if ($auth_info) { // データ同期 (save_postはis_adminで実行されないケースがある) add_action( 'save_post', [$this,'save_post'], 20, 3 ); add_action( 'added_post_meta', [$this,'updated_post_meta'], 10, 3 ); add_action( 'updated_post_meta',[$this,'updated_post_meta'], 10, 3 ); add_action( 'deleted_post_meta',[$this,'deleted_post_meta'], 10, 4 ); } if (is_admin() and $auth_info) { //管理画面 // Gutenberg のサポートがない場合は何もしない if ( function_exists( 'register_block_type' ) ) { // gutenberg require_once 'src/init.php'; add_action('wp_loaded', function() { wp_localize_script('wordpress-cgb-block-js', 'OPTIONS', array( 'codoc_url' => CODOC_URL, 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME), 'codoc_plugin_version' => CODOC_PLUGIN_VERSION, 'codoc_sdk_path' => CODOC_SDK_PATH, )); }); } // tinymce $this->add_mce(); } else { // ブログ画面 // codocのJS登録 add_action( 'wp_enqueue_scripts', function() { wp_enqueue_script( 'codoc-injector-js', CODOC_URL . '/js/cms.js' ); }); // 登録したscriptタグに属性をつける add_filter('script_loader_tag', [$this,'modifier_script_tag'],10,2); // tinymce用のショートコード add_shortcode('codoc', [$this, 'injector_shortcode']); } return $this; } public function modifier_script_tag($tag,$handle) { if($handle !== 'codoc-injector-js') { return $tag; } $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME); $data_css = ''; if ($css_path = $CODOC_SETTINGS['css_path']) { $data_css = sprintf(' data-css="%s" ',$css_path); } //return str_replace(' src=', $data_css . ' defer src=', $tag); return preg_replace('/(src=[^>]+)/',' ${1} ' . $data_css . ' defer',$tag); } public function injector_shortcode($atts) { global $post; ob_start(); require 'views/codoc-injector.php'; return ob_get_clean(); } # settings / 設定関連 public function add_settings() { global $CODOC_SETTINGS; add_action( 'admin_menu' ,function(){ add_options_page( 'codoc の設定', //ページタイトル 'codoc', //設定メニューに表示されるメニュータイトル 'edit_users', //権限 'codoc', //設定ページのURL。options-general.php?page=codoc function() { echo '
'; echo '
'; settings_fields( 'codoc_option_group' ); do_settings_sections( 'codoc' ); submit_button(); // 送信ボタン echo '
'; } ); }); add_action( "admin_init", function() { // codocからの認証データ処理 if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['fetch_token_key'])) { $key = sanitize_text_field($_GET['fetch_token_key']); $usercode = sanitize_text_field($_GET['usercode']); update_option(CODOC_USERCODE_OPTION_NAME,$usercode); //$data = $this->callAPI('GET','/token',[ "fetch_token_key" => $key ]); $data = $this->util->get_token([ "fetch_token_key" => $key ],["usercode" => $usercode, "token" => "1"]); if ($data->status and $token = $data->token) { update_option(CODOC_TOKEN_OPTION_NAME,$token); //$data = $this->callAPI('GET',''); $data = $this->util->get_user_info([],["usercode" => $usercode, "token" => $token]); if ($data->status and $user = $data->user) { update_option(CODOC_AUTHINFO_OPTION_NAME,[ 'email' => $user->email, 'name' => $user->name, ]); } #$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; #$current_url = preg_replace('/(.*)fetch_token_key.*/','${1}&codoc_auth_finished=1',$current_url); //add_settings_error( 'general', 'settings_updated', __( 'OK' ), 'success' ); $current_url = admin_url('options-general.php') . '?page=codoc&codoc_auth_finished=1'; wp_redirect( $current_url); exit; } } global $CODOC_USERCODE; global $CODOC_SETTINGS; global $CODOC_TOKEN; global $CODOC_AUTHINFO; $CODOC_USERCODE = get_option(CODOC_USERCODE_OPTION_NAME); $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME); $CODOC_TOKEN = get_option(CODOC_TOKEN_OPTION_NAME); $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME); if( !$CODOC_SETTINGS ) { //デフォルト値 $CODOC_SETTINGS = array( 'css_path' => '', ); update_option( CODOC_SETTINGS_OPTION_NAME, $CODOC_SETTINGS ); } if (!isset($CODOC_SETTINGS['str_replace_binded_url_from'])) { $CODOC_SETTINGS['str_replace_binded_url_from'] = ''; } if (!isset($CODOC_SETTINGS['str_replace_binded_url_to'])) { $CODOC_SETTINGS['str_replace_binded_url_to'] = ''; } if (!isset($CODOC_SETTINGS['str_before_codoc_tag'])) { $CODOC_SETTINGS['str_before_codoc_tag'] = ''; } if (!isset($CODOC_SETTINGS['str_after_codoc_tag'])) { $CODOC_SETTINGS['str_after_codoc_tag'] = ''; } add_settings_section( 'setting_section_id', // id 'codoc 設定ページ', // title function (){}, // callback 'codoc' // page ); // 認証がある場合 if ($CODOC_AUTHINFO) { register_setting( 'codoc_option_group', // option group CODOC_SETTINGS_OPTION_NAME // option name(DB) ); add_settings_field( 'css_path', // id 'カスタマイズ用CSSパス', // title function() { global $CODOC_SETTINGS; echo sprintf('',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['css_path']); }, 'codoc', //page 'setting_section_id' //Section ); add_settings_field( 'str_replace_binded_url', // id 'codoc側に登録するパーマリンクを置換', // title function() { global $CODOC_SETTINGS; echo sprintf('',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['str_replace_binded_url_from']); echo ('を'); echo sprintf('',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['str_replace_binded_url_to']); echo ('に変換'); }, 'codoc', //page 'setting_section_id' //Section ); add_settings_field( 'str_around_codoc_tag', // id 'codocタグの前後にHTMLを挿入', // title function() { global $CODOC_SETTINGS; echo sprintf('',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['str_before_codoc_tag']); echo ('を前に挿入
'); echo sprintf('',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['str_after_codoc_tag']); echo ('を後に挿入'); }, 'codoc', //page 'setting_section_id' //Section ); register_setting( 'codoc_option_group', // option group CODOC_USERCODE_OPTION_NAME ); register_setting( 'codoc_option_group', // option group CODOC_TOKEN_OPTION_NAME ); if (isset($_GET['codoc_auth_finished']) and $_GET['codoc_auth_finished']) { add_settings_error( 'general', 'settings_updated', __( 'codocの認証が完了しました' ), 'success' ); } add_settings_field( 'codoc_auth', '認証', function() { global $CODOC_USERCODE; global $CODOC_TOKEN; global $CODOC_AUTHINFO; $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';"; echo sprintf('

%s で認証済

',$CODOC_AUTHINFO['email']); echo sprintf('',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE); echo sprintf('',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN); echo sprintf('

認証を解除する

'); }, 'codoc', 'setting_section_id' ); } // ない場合 if (!$CODOC_AUTHINFO and !isset($_GET['auth_by_myself'])) { add_settings_field( 'codoc_auth', '認証', function() { //$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $current_url = admin_url('options-general.php') . '?page=codoc'; $login_url = sprintf("location.href='%s'",CODOC_URL . '/me/token?from=wp&return_url=' . urlencode($current_url)); $register_url = sprintf("location.href='%s'",CODOC_URL . '/register?from=wp&return_url=' . urlencode($current_url)); // submitを消しておく echo (''); echo ('codocをWordPressでご利用いただくには認証が必要です。
'); echo sprintf('ユーザーコードとAPIトークンを
直接入力することでも認証できます。

',$current_url); echo sprintf(' 

',$login_url,$register_url); }, 'codoc', 'setting_section_id' ); } // ない場合かつ自分で認証する場合 if (!$CODOC_AUTHINFO and ( (isset($_GET['auth_by_myself']) and $_GET['auth_by_myself']) or (isset($_POST['auth_by_myself']) and $_POST['auth_by_myself']) )) { register_setting( 'codoc_option_group', // option group CODOC_USERCODE_OPTION_NAME ); register_setting( 'codoc_option_group', // option group CODOC_TOKEN_OPTION_NAME ); add_settings_field( 'codoc_usercode', 'ユーザーコード', function() { global $CODOC_USERCODE; echo ''; echo sprintf('',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE); }, 'codoc', 'setting_section_id' ); add_settings_field( 'codoc_token', 'APIトークン', function() { global $CODOC_TOKEN; echo sprintf('',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN); }, 'codoc', 'setting_section_id' ); } // 認証情報を保存 add_action( 'update_option_' . CODOC_USERCODE_OPTION_NAME, function( $old_value, $new_value ) { global $CODOC_RE_AUTHORIZE; $CODOC_RE_AUTHORIZE = 1; },9,2); // $hook, $function_to_add, $priority, $accepted_args add_action( 'update_option_' . CODOC_TOKEN_OPTION_NAME, function( $old_value, $new_value ) { global $CODOC_RE_AUTHORIZE; $CODOC_RE_AUTHORIZE = 1; },10,2); add_action('updated_option',function(){ global $CODOC_RE_AUTHORIZE; if ($CODOC_RE_AUTHORIZE) { //$data = $this->callAPI('GET',''); $data = $this->util->get_user_info([],[ "usercode" => get_option(CODOC_USERCODE_OPTION_NAME), "token" => get_option(CODOC_TOKEN_OPTION_NAME), ]); if ($data->status and $user = $data->user) { update_option(CODOC_AUTHINFO_OPTION_NAME,[ 'email' => $user->email, 'name' => $user->name, ]); } else { update_option(CODOC_AUTHINFO_OPTION_NAME,''); } } }); }); // プラグイン一覧に設定のリンクをいれる add_filter( 'plugin_action_links_' . plugin_basename( plugin_dir_path( __FILE__ ) . 'codoc' . '.php' ), function( $links ) { $setting_link = sprintf( '%s', esc_url( add_query_arg( 'page', 'codoc', admin_url( 'options-general.php' ) ) ), esc_html( '設定' ) ); array_unshift( $links, $setting_link ); return $links; } ); } public function add_mce() { add_action( 'admin_enqueue_scripts', function() { if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) { return; } $current_screen = get_current_screen(); if ( ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) || ( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) ) { // Gutenberg Editor // なにもしない } else { // tinymce if ( get_user_option( 'rich_editing' ) == 'true' ) { // プラグイン内で使うCSRF を生成 $path = plugins_url( 'codoc/src_mce/codoc-editor-onload.js', __DIR__ ); wp_enqueue_script( 'codoc-editor-onload', $path, array('jquery'), '', true ); // I just want to insert this global variables but i don't know how i can do it.. wp_localize_script( 'codoc-editor-onload', 'CODOCEDITOR', array( 'action' => 'codoc_shortcodes', 'nonce' => wp_create_nonce( 'codoc_shortcodes' ), 'codoc_url' => CODOC_URL, 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME), 'codoc_plugin_version' => CODOC_PLUGIN_VERSION, 'codoc_sdk_path' => CODOC_SDK_PATH, ) ); // ここでtinymceのプラグイン追加 //wp_enqueue_style( 'codoc-admin-style', plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) ); //add_editor_style( plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) ); wp_enqueue_style( 'codoc-admin-style', CODOC_URL . CODOC_SDK_PATH . '.tinymce.css?c=' . date('Ymd') ); add_editor_style( CODOC_URL . CODOC_SDK_PATH . '.tinymce.css' ); add_filter( 'mce_external_plugins', function( $plugin_array ) { //$plugin_array['codoc'] = plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ ); $plugin_array['codoc'] = CODOC_URL . CODOC_SDK_PATH . '.tinymce.js?c=' . date('Ymd'); return $plugin_array; } ); add_filter( 'mce_buttons', function( $buttons ) { array_push( $buttons, "|", "codoc" ); return $buttons; } ); } } } ); } public function save_post($post_ID,$post,$update) { if (preg_match('/^(auto-draft|inherit)$/',$post->post_status)) { return; } $entryCode = get_post_meta($post_ID,'codoc_entry_code',true); $res = $this->util->sync_entry([ "post_title" => $post->post_title, "post_content" => $post->post_content, "post_status" => ($post->post_status == 'publish' ? 1 : 0), "post_permalink" => get_permalink($post_ID), "codoc_entry_code" => $entryCode, ],[ "usercode" => get_option(CODOC_USERCODE_OPTION_NAME), "token" => get_option(CODOC_TOKEN_OPTION_NAME), ]); if (is_object($res) and $res->status and !$entryCode) { update_post_meta($post_ID,'codoc_entry_code',$res->entry->code); } return true; } function updated_post_meta( $meta_ID, $post_ID, $meta_key ) { if ($meta_key != '_thumbnail_id') { return; } if ( has_post_thumbnail($post_ID) ) { $attachment = wp_get_attachment_metadata( get_post_thumbnail_id($post_ID)); $upload_dir = wp_upload_dir(); $file_path = sprintf ('%s/%s',$upload_dir['basedir'],$attachment['file']); return $this->util->post_thumbnail([ "file_path" => $file_path, "boundary" => wp_generate_password(24), "codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true), ],[ "usercode" => get_option(CODOC_USERCODE_OPTION_NAME), "token" => get_option(CODOC_TOKEN_OPTION_NAME), ]); } } function deleted_post_meta( $meta_ids, $post_ID, $meta_key,$meta_value ) { if ($meta_key != '_thumbnail_id') { return; } return $this->util->reset_thumbnail( ["codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true)], [ "usercode" => get_option(CODOC_USERCODE_OPTION_NAME), "token" => get_option(CODOC_TOKEN_OPTION_NAME), ] ); } function the_content( $post_content ) { if ( is_single() && in_the_loop() && is_main_query() ) { } $post = get_post(); return $this->util->filter_content([ "post_content" => $post_content, "preview" => is_preview(), "codoc_entry_code" => get_post_meta($post->ID,'codoc_entry_code',true), "codoc_settings" => get_option(CODOC_SETTINGS_OPTION_NAME), "is_amp_endpoint" => (function_exists('is_amp_endpoint') && is_amp_endpoint()), "post_permalink" => get_permalink($post->ID), ]); } }