# codoc/0.9.11/class-codoc.php

codoc, version 0.9.11. 808 lines.

- Page: https://pluginprobe.com/plugins/codoc/0.9.11/code/class-codoc.php
- Raw: https://pluginprobe.com/plugins/codoc/0.9.11/raw/class-codoc.php
- Modified: 2020-12-25T06:42:34+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/codoc/0.9.11/code/class-codoc.php#L10-L20`.

```php
<?php
require_once(plugin_dir_path( __FILE__ ) .'class-codoc-util.php');
final class Codoc {

    public function __construct() {
        if (is_admin()) {
            // setting
            $this->add_settings();
        }

        // usercode, token はadminページのみDBから取得する
        $this->util = new CodocUtil([ 'usercode' => null, 'token' => null, 'codoc_url' => $this->get_codoc_url() ]);
        
        # the_content フィルタを実行しない状態
        $this->do_not_filter_the_content = false;

        // paywall用の本文非表示化とcodocタグへの属性追加
        $priority = 10;
        $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
        if (isset($CODOC_SETTINGS["debug_params"])) {
            $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
            if (isset($params_decoded["the_content_filter_priority"])) {
                $priority = $params_decoded["the_content_filter_priority"];
            }
        }
        add_filter('the_content',[$this,'the_content'],$priority);
        
        // 2020-07-25 excerpt対応
        add_filter('excerpt_allowed_blocks',[$this,'excerpt_allowed_blocks']);
        
        $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'      => $this->get_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',      $this->get_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 get_codoc_url() {
        $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
        if (isset($CODOC_SETTINGS["debug_params"])) {
            $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
            if (isset($params_decoded["codoc_url"])) {
                return $params_decoded["codoc_url"];
            }
        }
        return CODOC_URL;
    }
    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);
        }
        // connect用パラメータ
        $connect_attributes = '';
        if (isset($CODOC_SETTINGS["codoc_connect_code"])) {
            $connect_code = $CODOC_SETTINGS["codoc_connect_code"];
            $connect_attributes = sprintf(' data-connect-code="%s"',$connect_code);
            $tag = preg_replace('/cms\.js/','cms-connect.js',$tag);
        }
        if (isset($CODOC_SETTINGS["debug_params"])) {
            $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
            if (isset($params_decoded["connect_registration_mode"])) {
                $connect_attributes = $connect_attributes  . sprintf(' data-connect-registration-mode="%s"',$params_decoded["connect_registration_mode"]);
            }
        }
        
        //return str_replace(' src=', $data_css . ' defer src=', $tag);
        return preg_replace('/(src=[^>]+)/',' ${1} ' . $data_css . $connect_attributes . ' 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 '<div class="codoc-settings">';
                    echo '<form method="post" action="options.php">';
                    settings_fields( 'codoc_option_group' );
                    do_settings_sections( 'codoc' );
                    submit_button(); // 送信ボタン
                    echo '</form></div>';
                }
            );
        });

        add_action('admin_print_styles', 'codoc_admin_styles');
        function codoc_admin_styles($hook) {
          wp_enqueue_style('codoc-options-style', plugins_url( 'codoc/css/codoc-options.css', __DIR__ ));
        }

        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'] = '';
            }

            if (!isset($CODOC_SETTINGS['always_show_support'])) {
                $CODOC_SETTINGS['always_show_support'] = '0';
            }
            if (!isset($CODOC_SETTINGS['show_support_message'])) {
                $CODOC_SETTINGS['show_support_message'] = '';
            }
            if (!isset($CODOC_SETTINGS['show_support_categories'])) {
                $CODOC_SETTINGS['show_support_categories'] = '';
            }
            if (!isset($CODOC_SETTINGS['show_support_location'])) {
                $CODOC_SETTINGS['show_support_location'] = 'bottom';
            }
            if (!isset($CODOC_SETTINGS['do_not_filter_the_content'])) {
                $CODOC_SETTINGS['do_not_filter_the_content'] = '0';
            }

            if (!isset($CODOC_SETTINGS['entry_button_text'])) {
                $CODOC_SETTINGS['entry_button_text'] = '';
            }
            if (!isset($CODOC_SETTINGS['subscription_button_text'])) {
                $CODOC_SETTINGS['subscription_button_text'] = '';
            }
            if (!isset($CODOC_SETTINGS['support_button_text'])) {
                $CODOC_SETTINGS['support_button_text'] = '';
            }
            if (!isset($CODOC_SETTINGS['subscription_message'])) {
                $CODOC_SETTINGS['subscription_message'] = '';
            }
            if (!isset($CODOC_SETTINGS['support_message'])) {
                $CODOC_SETTINGS['support_message'] = '';
            }
            if (!isset($CODOC_SETTINGS['show_like'])) {
                $CODOC_SETTINGS['show_like'] = '1';
            }
            if (!isset($CODOC_SETTINGS['show_about_codoc'])) {
                $CODOC_SETTINGS['show_about_codoc'] = '1';
            }
            if (!isset($CODOC_SETTINGS['show_powered_by'])) {
                $CODOC_SETTINGS['show_powered_by'] = '1';
            }

            if (!isset($CODOC_SETTINGS['codoc_tag_attributes'])) {
                $CODOC_SETTINGS['codoc_tag_attributes'] = '';
            }
            if (!isset($CODOC_SETTINGS['codoc_connect_code'])) {
                $CODOC_SETTINGS['codoc_connect_code'] = '';
            }
            if (!isset($CODOC_SETTINGS['debug_params'])) {
                $CODOC_SETTINGS['debug_params'] = '';
            }
            
            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
                    'テーマ',  // title
                    function() {
                        global $CODOC_SETTINGS;
                        echo '<div class="excerpt">テーマを指定してペイウォールのデザインを変えることができます。<br>パスを指定を選択することでCSSを直接指定するこもと可能です。</div>';
                        echo sprintf('<div class="inputGroup"><input type="text" name="%s[css_path]" value="%s" id="codoc_css_path" readonly>',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['css_path']);
                        echo '' .
                        '<script type="text/javascript">                                              ' .
                        '    function gen_css_path(select) {                                          ' .
                        '        if (select.value == "dark") {                                        ' .
                        '            document.getElementById("darkmode-caution").style.display="block";' .
                        '        } else {                                                             ' .
                        '            document.getElementById("darkmode-caution").style.display="none";' .
                        '        }                                                                    ' .
                        '        if (select.value == "path") {                                        ' .
                        '            document.getElementById("codoc_css_path").readOnly=false;        ' .
                        '            if (!document.getElementById("codoc_css_path").value.match(/\//g)) {' .
                        '            document.getElementById("codoc_css_path").value="";              ' .
                        '            }                                                                ' .
                        '        } else {                                                             ' .
                        '            document.getElementById("codoc_css_path").readOnly=true;         ' .
                        '            document.getElementById("codoc_css_path").value=select.value;    ' .
                        '        }                                                                    ' .
                        '    }                                                                        ' .
                        '</script>                                                                ' ;

                        echo sprintf('<select name="theme_name" onChange="gen_css_path(this)" id="codoc_theme_select">');
                        foreach (["blue","red","green","black","dark","blue-square","red-square","green-square","black-square","dark-square"] as $theme) {
                            if ($theme == "blue") {
                                echo sprintf('<option value="%s" %s>青</option>', $theme, ($CODOC_SETTINGS["css_path"] == "blue" ? "selected" : ""));
                            }
                            if ($theme == "red") {
                                echo sprintf('<option value="%s" %s>赤</option>', $theme, ($CODOC_SETTINGS["css_path"] == "red" ? "selected" : ""));
                            }
                            if ($theme == "green") {
                                echo sprintf('<option value="%s" %s>緑</option>', $theme, ($CODOC_SETTINGS["css_path"] == "green" ? "selected" : ""));
                            }
                            if ($theme == "black") {
                                echo sprintf('<option value="%s" %s>黒</option>', $theme, ($CODOC_SETTINGS["css_path"] == "black" ? "selected" : ""));
                            }
                            if ($theme == "dark") {
                                echo sprintf('<option value="%s" %s>ダークモード</option>', $theme, ($CODOC_SETTINGS["css_path"] == "dark" ? "selected" : ""));
                            }
                            if ($theme == "blue-square") {
                                echo sprintf('<option value="%s" %s>青(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "blue-square" ? "selected" : ""));
                            }
                            if ($theme == "red-square") {
                                echo sprintf('<option value="%s" %s>赤（四角）</option>', $theme, ($CODOC_SETTINGS["css_path"] == "red-square" ? "selected" : ""));
                            }
                            if ($theme == "green-square") {
                                echo sprintf('<option value="%s" %s>緑（四角）</option>', $theme, ($CODOC_SETTINGS["css_path"] == "green-square" ? "selected" : ""));
                            }
                            if ($theme == "black-square") {
                                echo sprintf('<option value="%s" %s>黒（四角）</option>', $theme, ($CODOC_SETTINGS["css_path"] == "black-square" ? "selected" : ""));
                            }
                            if ($theme == "dark-square") {
                                echo sprintf('<option value="%s" %s>ダークモード（四角）</option>', $theme, ($CODOC_SETTINGS["css_path"] == "dark-square" ? "selected" : ""));
                            }
                        }
                        echo sprintf('<option value="path" %s>パス指定</option>', (preg_match("/\//",$CODOC_SETTINGS["css_path"]) ? "selected" : ""));
                        echo '<script type="text/javascript">gen_css_path(document.getElementById(\'codoc_theme_select\'))</script>';
                        echo sprintf('</select></div>');
                        echo '<p id="darkmode-caution" style="display:none">ダークモード向けテーマは文字色が白となり、背景色によっては文字が見えない状態となるためご注意ください。</p>';
                    },
                    'codoc',                   //page
                    'setting_section_id'       //Section
                );
                add_settings_field(
                    'paywall_text',                  // id
                    '各種文言',  // title
                    function() {
                        global $CODOC_SETTINGS;
                        echo '<div class="excerpt">ペイウォール内の一部文言を変更できます。</div>';
                        echo '<table class="innerTable"><tbody>';
                        echo '<tr><th>いいねの表示</th><td>';
                        echo sprintf('<input type="radio" value="1" name="%s[show_like]" id="show_like_on" %s><label for="show_like_on">する</label>　',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_like'] == '1' ? "checked" : ""));
                        echo sprintf('<input type="radio" value="0" name="%s[show_like]" id="show_like_off" %s><label for="show_like_off">しない</label>　<br / >',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_like'] == '0' ? "checked" : ""));
                        echo '</td></tr>';

                        echo '<tr><th>codocについての表示</th><td>';
                        echo sprintf('<input type="radio" value="1" name="%s[show_about_codoc]" id="show_about_codoc_on" %s><label for="show_about_codoc_on">する</label>　',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_about_codoc'] == '1' ? "checked" : ""));
                        echo sprintf('<input type="radio" value="0" name="%s[show_about_codoc]" id="show_about_codoc_off" %s><label for="show_about_codoc_off">しない</label>　<br / >',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_about_codoc'] == '0' ? "checked" : ""));
                        echo '</td></tr>';
                        
                        echo '<tr><th>PoweredByの表示</th><td>';
                        echo sprintf('<input type="radio" value="1" name="%s[show_powered_by]" id="show_powered_by_on" %s><label for="show_powered_by_on">する</label>　',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_powered_by'] == '1' ? "checked" : ""));
                        echo sprintf('<input type="radio" value="0" name="%s[show_powered_by]" id="show_powered_by_off" %s><label for="show_powered_by_off">しない</label>　<br / >',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_powered_by'] == '0' ? "checked" : ""));
                        echo '</td></tr>';
                        
                        echo '<tr><th>記事購入ボタンのテキスト</th><td>';
                        echo sprintf('<input type="text" name="%s[entry_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['entry_button_text']));
                        echo '</td></tr>';
                        
                        echo '<tr><th>サブスクリプション購入ボタンのテキスト</th><td>';
                        echo sprintf('<input type="text" name="%s[subscription_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_button_text']));
                        echo '</td></tr>';

                        echo '<tr><th>サポートボタンのテキスト</th><td>';
                        echo sprintf('<input type="text" name="%s[support_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_button_text']));
                        echo '</td></tr>';
                        
                        echo '<tr><th>「サブスクリプションに含まれる記事」のテキスト</th><td>';
                        echo sprintf('<input type="text" name="%s[subscription_message]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_message']));
                        echo '</td></tr>';
                        
                        echo '<tr><th>サポート説明のテキスト</th><td>';                        
                        echo sprintf('<input type="text" name="%s[support_message]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_message']));
                        echo '</td></tr>';
                        
                        echo '</tbody></table>';
                    },
                    'codoc',                   //page
                    'setting_section_id'       //Section
                );
                
                add_settings_field(
                    'codoc_tag_attributes',                  // id
                    'codocタグの属性',  // title
                    function() {
                        global $CODOC_SETTINGS;
                        echo '<div class="excerpt">codocタグに特定の属性を追加することができます。</div>';
                        echo sprintf('<input type="text" name="%s[codoc_tag_attributes]" value="%s">',CODOC_SETTINGS_OPTION_NAME,htmlspecialchars($CODOC_SETTINGS['codoc_tag_attributes']));
                    },
                    'codoc',                   //page
                    'setting_section_id'       //Section
                );
                add_settings_field(
                    'codoc_connect_code',                  // id
                    'サービス連携コード',  // title
                    function() {
                        global $CODOC_SETTINGS;
                        echo '<div class="excerpt">サービス連携ウィジェットを利用するためにはアカウント設定でサービス連携を有効化し、サービス連携コードを指定してください</div>';
                        echo sprintf('<input type="text" name="%s[codoc_connect_code]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['codoc_connect_code']));
                    },
                    'codoc',                   //page
                    'setting_section_id'       //Section
                );
                
                add_settings_field(
                    'str_replace_binded_url',                  // id
                    'パーマリンク',  // title
                    function() {
                        global $CODOC_SETTINGS;
                        echo '<div class="excerpt">codoc側に登録するパーマリンクを置換することができます。</div>';
                        echo sprintf('<input type="text" name="%s[str_replace_binded_url_from]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['str_replace_binded_url_from']));
                        echo ('<span class="suptext">を</span>');
                        echo sprintf('<input type="text" name="%s[str_replace_binded_url_to]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['str_replace_binded_url_to']));
                        echo ('に変換');
                    },
                    'codoc',                   //page
                    'setting_section_id'       //Section
                );

                add_settings_field(
                    'str_around_codoc_tag',                    // id
                    'HTMLの挿入',  // title
                    function() {
                        global $CODOC_SETTINGS;
                        echo '<div class="excerpt">codocタグの前後にHTMLを挿入することができます。</div>';
                        echo sprintf('<div class="inputRow"><textarea name="%s[str_before_codoc_tag]" cols="40">%s</textarea>',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['str_before_codoc_tag']));
                        echo ('を前に挿入</div>');
                        echo sprintf('<div class="inputRow"><textarea name="%s[str_after_codoc_tag]" cols="40">%s</textarea>',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['str_after_codoc_tag']));
                        echo ('を後に挿入</div>');

                    },
                    'codoc',                   //page
                    'setting_section_id'       //Section
                );

                add_settings_field(
                    'always_show_support_tag',                 // id
                    'サポートの自動挿入',  // title
                    function() {
                        global $CODOC_SETTINGS;
                        echo '<div class="excerpt">codocブロックを挿入することなく投稿にサポート機能を追加します</div>';
                        echo '<table class="innerTable"><tbody>';
                        echo '<tr><th>自動挿入</th><td>';
                        echo sprintf('<input type="radio" value="1" name="%s[always_show_support]" id="always_show_support_on" %s><label for="always_show_support_on">する</label>　',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['always_show_support'] == '1' ? "checked" : ""));
                        echo sprintf('<input type="radio" value="0" name="%s[always_show_support]" id="always_show_support_off" %s><label for="always_show_support_off">しない</label>　<br / >',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['always_show_support'] == '0' ? "checked" : ""));
                        echo '</td></tr>';
                        echo '<tr><th>表示位置</th><td>';
                        echo sprintf('<input type="radio" value="top" name="%s[show_support_location]" id="show_support_location_top" %s><label for="show_support_location_top">冒頭</label>　',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_support_location'] == 'top' ? "checked" : ""));
                        echo sprintf('<input type="radio" value="bottom" name="%s[show_support_location]" id="show_support_location_bottom" %s><label for="show_support_location_bottom">末尾</label>　<br / >',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_support_location'] == 'bottom' ? "checked" : ""));
                        echo '</td></tr>';
                        echo '<tr><th>説明文</th><td>';
                        echo sprintf('<input type="text" placeholder="サポートの説明文をカスタマイズできます" size="50%%" name="%s[show_support_message]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['show_support_message']));
                        echo '</td></tr>';
                        echo '<tr><th>対象カテゴリ名</th><td>';
                        echo sprintf('<input placeholder="&quot;|&quot;区切りで複数指定できます" type="text" size="50%%" name="%s[show_support_categories]" value="%s"><br />',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['show_support_categories']));
                        echo '</td></tr>';
                        echo '</tbody></table>';

                    },
                    'codoc',                   //page
                    'setting_section_id'       //Section
                );
                add_settings_field(
                    'do_not_filter_the_content',                   // id
                    '支障が出る処理を無効化',  // title
                    function() {
                        global $CODOC_SETTINGS;
                        echo '<div class="excerpt">codocの動作に支障が出る他のプラグインによる<strong>フィルター処理</strong>を無効化できます。codocが上手く動かない場合のみ利用してください。</div>';
                        echo sprintf('<input type="radio" value="1" name="%s[do_not_filter_the_content]" id="do_not_filter_the_content_on" %s><label for="do_not_filter_the_content_on">する</label>　',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['do_not_filter_the_content'] == '1' ? "checked" : ""));
                        echo sprintf('<input type="radio" value="0" name="%s[do_not_filter_the_content]" id="do_not_filter_the_content_off" %s><label for="do_not_filter_the_content_off">しない</label>　',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['do_not_filter_the_content'] == '0' ? "checked" : ""));
                    },
                    'codoc',                   //page
                    'setting_section_id'       //Section
                );
                add_settings_field(
                    'debug_params',                   // id
                    'デバック用',  // title
                    function() {
                        global $CODOC_SETTINGS;
                        echo '<div class="excerpt">デバック用のパラメーターを指定できます。codocサポートから依頼がある場合のみ利用してください。</div>';
                        echo sprintf('<input placeholder="" type="text" size="50%%" name="%s[debug_params]" value="%s"><br />',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['debug_params']));
                    },
                    '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('<p><font color="green" id="codoc-auth-message"><strong>%s</strong> で認証済</font></p>',$CODOC_AUTHINFO['email']);

                        echo sprintf('<input id="codoc-usercode" type="hidden" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
                        echo sprintf('<input id="codoc-token" type="hidden" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
                        echo sprintf('<p>認証を<a href="javascript:void(0);" onClick="' . $script . '">解除する</p>');
                    },
                    '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'",$this->get_codoc_url() . '/me/token?from=wp&return_url=' . urlencode($current_url));
                        $register_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/register?from=wp&return_url=' . urlencode($current_url));
                        // submitを消しておく
                        echo ('<script type="text/javascript">window.onload=function(){document.getElementById(\'submit\').style.display = \'none\'}</script>');
                        echo ('codocをWordPressでご利用いただくには認証が必要です。<br />');
                        echo sprintf('ユーザーコードとAPIトークンを<a href="%s&auth_by_myself=1">直接入力</a>することでも認証できます。<br /><br />',$current_url);
                        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);


                    },
                    '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 '<input type="hidden" name="auth_by_myself" value="1">';
                        echo sprintf('<input type="text" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
                    },
                    'codoc',
                    'setting_section_id'
                );
                add_settings_field(
                    'codoc_token',
                    'APIトークン',
                    function() {
                        global $CODOC_TOKEN;
                        echo sprintf('<input type="text" name="%s" value="%s">',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('update_option_' . CODOC_SETTINGS_OPTION_NAME,function(){
                $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
                if (isset($CODOC_SETTINGS['always_show_support']) and $CODOC_SETTINGS['always_show_support']) {
                    $data = $this->util->get_support_entry([],[
                        "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
                        "token"    => get_option(CODOC_TOKEN_OPTION_NAME),
                    ]);
                    if ($data->status and $entry = $data->entry) {
                        update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,$entry->code);
                    } else {
                        update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
                    }
                } elseif(isset($CODOC_SETTINGS['always_show_support']) and !$CODOC_SETTINGS['always_show_support']) {
                    update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
                }
            });

            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( '<a href="%s">%s</a>', 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'      => $this->get_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', $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.css?c=' . date('Ymd') );
                    add_editor_style( $this->get_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'] = $this->get_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 get_filtered_content($post_emulated) {
        // 記事ページであることをエミュレートしてフィルター実行
        $post_backuped = null;
        if (isset($GLOBALS['post'])) {
            $post_backuped = $GLOBALS['post'];
        }
        $GLOBALS['post'] = $post_emulated;

        $wp_query_backuped = null;
        if (isset($GLOBALS['wp_query'])) {
            $wp_query_backuped = $GLOBALS['wp_query'];
            $wp_query = $GLOBALS['wp_query'];
            $is_single_backuped =  $wp_query->is_single;
            $wp_query->is_single = true;
            $wp_query->post = $post_emulated;
            $wp_query->queried_object = $post_emulated;
            $wp_query->queried_object_id = $post_emulated->id;

            $GLOBALS['wp_query'] = $wp_query;
        }
        // $this->the_content でオリジナルを返してもらうため
        $this->do_not_filter_the_content = true;
        $content = preg_replace(
            '/ (\/)?wp:codoc\/codoc-block /',' \\1wptmp:codoc/codoc-block ',
            $post_emulated->post_content
        );
        #$content = do_shortcode( $content );
        $content_filtered = apply_filters( 'the_content', $content);
        $this->do_not_filter_the_content = false;

        $GLOBALS['post'] = $post_backuped;

        if ($wp_query_backuped) {
            $GLOBALS['wp_query'] = $wp_query_backuped;
        }

        $content_filtered = preg_replace(
            '/ (\/)?wptmp:codoc\/codoc-block /',' \\1wp:codoc/codoc-block ',
            $content_filtered
        );

        return $content_filtered;
    }

    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);
        $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME);
        $post_content = (isset($codoc_settings['do_not_filter_the_content']) and $codoc_settings['do_not_filter_the_content']) ?
                      $post->post_content : $this->get_filtered_content($post);
        $res =  $this->util->sync_entry([
            "post_title"       => $post->post_title,
            "post_content"     => $post_content,
            "post_status"      => ($post->post_status == 'publish' ? 1 : 0),
            "post_permalink"   => get_permalink($post_ID),
            "codoc_entry_code" => $entryCode,
            "codoc_settings"   => $codoc_settings,
        ],[
            "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() ) {
        }
        // get_filtered_content から do_not_filter_the_contentを有効にされるパターン
        // オプションの設定値の意味合い（他のフィルタを無視）とは違うため注意
        if ($this->do_not_filter_the_content) {
            return $post_content;
        }
        $post = get_post();
        # is_amp で実装しているテンプレート用
        $is_amp_endpoint = (function_exists('is_amp_endpoint') && is_amp_endpoint()) ? true :
                           ((function_exists('is_amp') && is_amp()) ? true : false);
        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"  => $is_amp_endpoint,
            "post_permalink"   => get_permalink($post->ID),
            "codoc_support_entry_code" => get_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME),
        ]);
    }

    function excerpt_allowed_blocks ($allowed_blocks) {
        if (is_array($allowed_blocks)) {
            array_push($allowed_blocks,'codoc/codoc-block');
        }
        return $allowed_blocks;
    }
}

```
