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"]; } } // ショーココードの退避 if (isset($CODOC_SETTINGS['shortcode_evacuation']) and $CODOC_SETTINGS['shortcode_evacuation']) { add_filter('the_content',[$this,'the_content_shortcode_evacuations'],0); } 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 sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_like'] == '1' ? "checked" : ""));
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_like'] == '0' ? "checked" : "")); echo ' |
|---|---|
| PoweredByの表示 | ';
echo sprintf('',CODOC_SETTINGS_OPTION_NAME);
echo sprintf('',CODOC_SETTINGS_OPTION_NAME);
echo sprintf('',CODOC_SETTINGS_OPTION_NAME);
if (isset($CODOC_AUTHINFO['account_is_pro']) and $CODOC_AUTHINFO['account_is_pro']) {
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_copyright'] == '1' ? "checked" : ""));
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,($CODOC_SETTINGS['show_copyright'] == '0' ? "checked" : "")); } else { echo 'PROアカウントのみ非表示化できます。'; } echo ' |
| 記事購入ボタンのテキスト | '; echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['entry_button_text'])); echo ' |
| サブスクリプション購入ボタンのテキスト | '; echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_button_text'])); echo ' |
| サポートボタンのテキスト | '; echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_button_text'])); echo ' |
| 「サブスクリプションに含まれる記事」のテキスト | '; echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_message'])); echo ' |
| サポート説明のテキスト | '; echo sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_message'])); 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 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 sprintf('',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['show_support_message'])); echo ' |
| 対象カテゴリ名 | ';
echo sprintf(' ',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['show_support_categories'])); echo ' |
%s%s
',$CODOC_AUTHINFO['name'],((isset($CODOC_AUTHINFO['account_is_pro']) and $CODOC_AUTHINFO['account_is_pro']) ? ' [PRO] ' : '')); if ($connect_code = $CODOC_SETTINGS['codoc_connect_code']) { echo sprintf('外部サービス連携済(連携コード:%s) %s
', $connect_code, ($CODOC_SETTINGS['codoc_connect_registration_mode'] == 'dedicated' ? '情報を更新する
'); 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でご利用いただくには認証が必要です。codocサーバーと通信ができません。サーバーやWordPress側でのファイヤーウォール設定にて https://codoc.jp への通信を許可してください。
'); } }, '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 and $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 : '', 'account_is_pro' => property_exists($user,'account_is_pro') ? $user->account_is_pro : '', 'created_at' => property_exists($user,'created_at') ? $user->created_at : 0, ]); $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME); return $CODOC_AUTHINFO; } // 保存用コンテンツにフィルターを実施する 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 ); // post_metaに内容を保存し、無料パートにショートコードの退避をおこなう $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME); if (isset($codoc_settings['shortcode_evacuation']) and $codoc_settings['shortcode_evacuation']) { $splited = preg_split('/\/wptmp:codoc\/codoc-block/s',$content); if (isset($splited[0]) and isset($splited[1])) { // すべてのショートコードを $match_all にいれる preg_match_all('/\[[^\[\]]+?\](.+\[\/[^\[\]]+?\])?/',$splited[1],$match_all); // ショートコードをURLエンコードしてdivタグの中にいれておく(後でmetaの中のショートコードと付け合せ) $replaced = preg_replace_callback('/\[[^\[\]]+?\](.+\[\/[^\[\]]+?\])?/',function($matches) { return sprintf ('', urlencode($matches[0])); },$splited[1]); // 0番目に配列で入っているのでそこを退避対象の配列とする $evacuations = $match_all[0]; // ショートコードの中身をタグに退避 $content = $splited[0] . '/wptmp:codoc/codoc-block' . $replaced; // 無料パートでショートコードを実行できるようにする update_post_meta($post_emulated->ID,'codoc_shortcode_evacuations',join('**codoc**',$evacuations)); } else { update_post_meta($post_emulated->id,'codoc_shortcode_evacuations',""); } } #$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), ] ); } // 退避されてるかどうかをmetaを使って確認し、無料エリアの一番最後にショートコードを追加 function the_content_shortcode_evacuations( $post_content ) { if ($this->do_not_filter_the_content) { return $post_content; } $post = get_post(); if (!$post) { return $post_content; } $evacuations_meta = get_post_meta($post->ID,'codoc_shortcode_evacuations',true); $evacuations = preg_split('/\*\*codoc\*\*/',$evacuations_meta); foreach ($evacuations as $evacuation) { $post_content = sprintf('', urlencode($evacuation),$evacuation) . $post_content; } return $post_content; } 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(); // 20211215 null になる場合がある if (!$post) { return $post_content; } # 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; } }