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 = 999999999;
$priority = 100000; # フィルターは最後に実施する default 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);
// 2021-09-24 the_content を利用しない場合は個別に呼び出ししてもらう
add_filter('codoc_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 );
}
global $pagenow;
//管理画面でcodoc認証があり投稿画面の場合
if (is_admin() and $auth_info and preg_match('/^post/',$pagenow)) {
// Gutenberg のサポートがない場合は何もしない
if ( function_exists( 'register_block_type' ) ) {
// WPに登録ブロックとして認識させる(cgbは登録しないっぽい)
\WP_Block_Type_Registry::get_instance()->register('codoc/codoc-block');
// 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();
} elseif(is_admin() and $auth_info and preg_match('/^edit/',$pagenow)) {
// 記事編集ページ
} elseif(!is_admin()) { // ブログ画面
// codocのJS登録
add_action( 'wp_enqueue_scripts', function() {
$CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
$load_script_condition = '';
if (isset($CODOC_SETTINGS["debug_params"]) and
$params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true) and
isset($params_decoded["load_script_condition"])
) {
$load_script_condition = $params_decoded["load_script_condition"];
}
if ($load_script_condition == 'not_list_page') {
// not_list_pageの場合はトップページ等でスクリプトをロードしない
if (!(is_archive() or is_category() or is_home() or is_front_page())) {
wp_enqueue_script( 'codoc-injector-js', $this->get_codoc_url() . '/js/cms.js' );
}
} else {
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']);
// テーマをbodyにも反映
add_filter('body_class', function($classes) {
$CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
$css_path = 'blue';
if (isset($CODOC_SETTINGS["css_path"]) and $CODOC_SETTINGS["css_path"]) {
$css_path = $CODOC_SETTINGS["css_path"];
}
array_push($classes,sprintf( "codoc-theme-%s",$css_path));
return $classes;
});
}
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["codoc_connect_registration_mode"]) and $CODOC_SETTINGS["codoc_connect_registration_mode"]) {
$connect_attributes = $connect_attributes .
sprintf(' data-connect-registration-mode="%s"',$CODOC_SETTINGS["codoc_connect_registration_mode"]);
}
$usercode_attributes = '';
$user_code = get_option(CODOC_USERCODE_OPTION_NAME);
if ($user_code) {
$usercode_attributes = sprintf(' data-usercode="%s"',$user_code);
}
$setting_attributes = '';
if (isset($CODOC_SETTINGS['codoc_script_tag_attributes']) and $CODOC_SETTINGS['codoc_script_tag_attributes']) {
$setting_attributes = $CODOC_SETTINGS['codoc_script_tag_attributes'];
}
//return str_replace(' src=', $data_css . ' defer src=', $tag);
return preg_replace('/(src=[^>]+)/',' ${1} ' . $data_css . $connect_attributes . $usercode_attributes . $setting_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 '
';
echo '
';
}
);
});
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) {
$this->update_codoc_authinfo($user);
}
#$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_script_tag_attributes'])) {
$CODOC_SETTINGS['codoc_script_tag_attributes'] = '';
}
if (!isset($CODOC_SETTINGS['codoc_connect_code'])) {
$CODOC_SETTINGS['codoc_connect_code'] = '';
}
if (!isset($CODOC_SETTINGS['codoc_connect_registration_mode'])) {
$CODOC_SETTINGS['codoc_connect_registration_mode'] = '';
}
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) {
// クリエイター情報だけ更新 (POST時に同期をとる)
if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['settings-updated'])) {
$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) {
$this->update_codoc_authinfo($user);
}
}
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 'テーマを指定してペイウォールのデザインを変えることができます。
パスを指定を選択することでCSSを直接指定するこもと可能です。
';
echo sprintf('',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['css_path']);
echo '' .
' ' ;
echo sprintf('
');
echo 'ダークモード向けテーマは文字色が白となり、背景色によっては文字が見えない状態となるためご注意ください。
';
},
'codoc', //page
'setting_section_id' //Section
);
add_settings_field(
'paywall_text', // id
'各種文言', // title
function() {
global $CODOC_SETTINGS;
echo 'ペイウォール内の一部文言を変更できます。
';
echo '';
echo '| いいねの表示 | ';
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_like'] == '1' ? "checked" : ""));
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_like'] == '0' ? "checked" : ""));
echo ' |
';
echo '| codocについての表示 | ';
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_about_codoc'] == '1' ? "checked" : ""));
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_about_codoc'] == '0' ? "checked" : ""));
echo ' |
';
echo '| PoweredByの表示 | ';
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_powered_by'] == '1' ? "checked" : ""));
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_powered_by'] == '0' ? "checked" : ""));
echo ' |
';
echo '| 記事購入ボタンのテキスト | ';
echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['entry_button_text']));
echo ' |
';
echo '| サブスクリプション購入ボタンのテキスト | ';
echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_button_text']));
echo ' |
';
echo '| サポートボタンのテキスト | ';
echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_button_text']));
echo ' |
';
echo '| 「サブスクリプションに含まれる記事」のテキスト | ';
echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_message']));
echo ' |
';
echo '| サポート説明のテキスト | ';
echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_message']));
echo ' |
';
echo '
';
},
'codoc', //page
'setting_section_id' //Section
);
add_settings_field(
'codoc_tag_attributes', // id
'codocタグの属性', // title
function() {
global $CODOC_SETTINGS;
echo 'codocタグに特定の属性を追加することができます。
';
echo sprintf('',CODOC_SETTINGS_OPTION_NAME,htmlspecialchars($CODOC_SETTINGS['codoc_tag_attributes']));
},
'codoc', //page
'setting_section_id' //Section
);
add_settings_field(
'codoc_script_tag_attributes', // id
'codoc scriptタグの属性', // title
function() {
global $CODOC_SETTINGS;
echo 'codoc scriptタグに特定の属性を追加することができます。
';
echo sprintf('',CODOC_SETTINGS_OPTION_NAME,htmlspecialchars($CODOC_SETTINGS['codoc_script_tag_attributes']));
},
'codoc', //page
'setting_section_id' //Section
);
add_settings_field(
'str_replace_binded_url', // id
'パーマリンク', // title
function() {
global $CODOC_SETTINGS;
echo 'codoc側に登録するパーマリンクを置換することができます。
';
echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['str_replace_binded_url_from']));
echo ('を');
echo sprintf('',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 'codocタグの前後にHTMLを挿入することができます。
';
echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['str_before_codoc_tag']));
echo ('を前に挿入
');
echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['str_after_codoc_tag']));
echo ('を後に挿入
');
},
'codoc', //page
'setting_section_id' //Section
);
add_settings_field(
'always_show_support_tag', // id
'サポートの自動挿入', // title
function() {
global $CODOC_SETTINGS;
echo 'codocブロックを挿入することなく投稿にサポート機能を追加します
';
echo '';
echo '| 自動挿入 | ';
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['always_show_support'] == '1' ? "checked" : ""));
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['always_show_support'] == '0' ? "checked" : ""));
echo ' |
';
echo '| 表示位置 | ';
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_support_location'] == 'top' ? "checked" : ""));
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_support_location'] == 'bottom' ? "checked" : ""));
echo ' |
';
echo '| 説明文 | ';
echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['show_support_message']));
echo ' |
';
echo '| 対象カテゴリ名 | ';
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['show_support_categories']));
echo ' |
';
echo '
';
},
'codoc', //page
'setting_section_id' //Section
);
add_settings_field(
'do_not_filter_the_content', // id
'支障が出る処理を無効化', // title
function() {
global $CODOC_SETTINGS;
echo 'codocの動作に支障が出る他のプラグインによるフィルター処理を無効化できます。codocが上手く動かない場合のみ利用してください。
';
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['do_not_filter_the_content'] == '1' ? "checked" : ""));
echo sprintf(' ',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 'デバック用のパラメーターを指定できます。codocサポートから依頼がある場合のみ利用してください。
';
echo sprintf('
',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['debug_params']));
},
'codoc', //page
'setting_section_id' //Section
);
add_settings_field(
'cretor_info', // id
'クリエイター情報', // title
function() {
global $CODOC_SETTINGS;
global $CODOC_AUTHINFO;
echo sprintf('',"");
// 変更を保存時に常に同期するのでこの表示は必要ないがUI上保持しておく
$script = "document.getElementById('codoc-update-creator-info-message').innerText='情報を更新するには変更を保存してください';document.getElementById('codoc-update-creator-info-message').color='red';";
if (isset($CODOC_AUTHINFO['profile_image_url'])) {
echo sprintf('
',$CODOC_AUTHINFO['profile_image_url']);
}
echo sprintf('%s
',$CODOC_AUTHINFO['name']);
if ($connect_code = $CODOC_SETTINGS['codoc_connect_code']) {
echo sprintf('%s外部サービス連携済(連携コード:%s)
',
($CODOC_SETTINGS['codoc_connect_registration_mode'] == 'dedicated' ? '専用ユーザーモードで' : ''),
$connect_code);
}
echo sprintf('情報を更新する
');
echo ('codoc側でロゴやカバー画像を変更した場合は都度更新を行ってください
');
},
'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() {
$theme = wp_get_theme();
$from = 'wp';
if ($theme->get('Name') === 'codoc') {
$from = 'wp_codoc';
}
//$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=' . $from . '&return_url=' . urlencode($current_url));
$register_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/register?from=' . $from . '&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('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) {
$this->update_codoc_authinfo($user);
} 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' => $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;
} );
// 非SSL環境の場合、なぜかhttps -> httpsになってしまうので対策
// コメントタグが除去されることがあるらしいのでvalid_elementsに必要なタグを追加 (EXPERIMENTAL)
add_filter( 'tiny_mce_before_init', function($settings) {
$settings['external_plugins'] = preg_replace('/"codoc":"http:/','"codoc":"https:',$settings['external_plugins']);
foreach (['valid_elements','extended_valid_elements'] as $valid_elements) {
if (isset($settings[$valid_elements])) {
$settings[$valid_elements] = $settings[$valid_elements] . ',div[*],p[*],img[*],--[*]';
}
}
$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["mce_valid_elements"])) {
$settings['valid_elements'] = $params_decoded["mce_valid_elements"];
$settings['extended_valid_elements'] = $params_decoded["mce_valid_elements"];
}
}
return $settings;
},1000000);
}
}
} );
}
function update_codoc_authinfo($user) {
global $CODOC_SETTINGS;
global $CODOC_AUTHINFO;
if (property_exists($user,'connect_code') and $user->connect_code) {
$CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
$CODOC_SETTINGS['codoc_connect_code'] = $user->connect_code;
$CODOC_SETTINGS['codoc_connect_registration_mode'] = $user->connect_has_permission_dedicated_account ? 'dedicated' : '';
update_option(CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS);
}
return update_option(CODOC_AUTHINFO_OPTION_NAME,[
'email' => $user->email,
'name' => $user->name,
'profile_image_url' => $user->profile_image_url,
'cover_image_url' => $user->cover_image_url,
'connect_code' => property_exists($user,'connect_code') ? $user->connect_code : '',
'connect_image_url' => property_exists($user,'connect_image_url') ? $user->connect_image_url : '',
]);
$CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
}
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'];
$wp_query->is_single = true;
$wp_query->is_singular = true;
# in_the_loop は記事ページでは通常有効っぽいので true指定 ex: wp_ulike
$wp_query->in_the_loop = true;
# これも追加しておく
$wp_query->is_main_query = 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,
// password が設定されてる場合は限定公開にする
"post_status" => $post->post_status == 'publish' ? ($post->post_password ? 2 : 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 ) {
// スルーされてる場合は他のメタ情報更新のタイミングにサムネイルをアップロード
$has_to_resend = get_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',true);
$has_to_resendi = get_post_meta($post_ID,'icodoc_post_thumbnail_invoking_entry_code',true);
if ($has_to_resend != 1 and $meta_key != '_thumbnail_id') {
return;
}
if ( has_post_thumbnail($post_ID) ) {
// 新規投稿の場合、タイミングによってはcodocEntryCodeが取得できないので一旦スルーする
if (!get_post_meta($post_ID,'codoc_entry_code',true)) {
update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',1);
return;
} else {
update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',0);
}
$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;
}
}