PluginProbe
codoc / 0.9.19
codoc v0.9.19
0.9.8.8 0.9.8.9 0.9.9 0.9.9.1 trunk 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.8.1 0.8.2 0.8.3 0.8.4 0.8.6 0.8.7 0.8.8 0.8.9 0.9 0.9.1 0.9.10 0.9.11 All 114 releases
← All changes | class-codoc.php +908 -521 0.80.9.19 View file →
@@ -1,545 +1,932 @@
1 1 <?php
2 +require_once(plugin_dir_path( __FILE__ ) .'class-codoc-util.php');
3 +final class Codoc {
2 4
3 -final class Codoc {
5 + public function __construct() {
6 + if (is_admin()) {
7 + // setting
8 + $this->add_settings();
9 + }
4 10
5 - public function __construct() {
6 - if (is_admin()) {
7 - // setting
8 - $this->add_settings();
9 - }
10 - $auth_info = get_option(CODOC_AUTHINFO_OPTION_NAME);
11 - if (!$auth_info) {
12 - return $this;
13 - }
11 + // usercode, token はadminページのみDBから取得する
12 + $this->util = new CodocUtil([ 'usercode' => null, 'token' => null, 'codoc_url' => $this->get_codoc_url() ]);
13 +
14 + # the_content フィルタを実行しない状態
15 + $this->do_not_filter_the_content = false;
14 16
15 - // データ同期 (save_postはis_adminで実行されないケースがある)
16 - add_action( 'save_post', [$this,'save_post'], 20, 3 );
17 - add_action( 'added_post_meta', [$this,'updated_post_meta'], 10, 3 );
18 - add_action( 'updated_post_meta',[$this,'updated_post_meta'], 10, 3 );
19 - add_action( 'deleted_post_meta',[$this,'deleted_post_meta'], 10, 4 );
20 -
21 - if (is_admin()) {
22 - // gutenberg
23 - require_once 'src/init.php';
24 - // tinymce
25 - $this->add_mce();
26 - add_action('wp_loaded', function() {
27 - wp_localize_script('wordpress-cgb-block-js', 'OPTIONS', array(
28 - 'codoc_url' => CODOC_URL,
29 - 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
30 - 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
31 - ));
17 + // paywall用の本文非表示化とcodocタグへの属性追加
18 + #$priority = 999999999;
19 + $priority = 100000; # フィルターは最後に実施する default 10
20 + $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
21 + if (isset($CODOC_SETTINGS["debug_params"])) {
22 + $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
23 + if (isset($params_decoded["the_content_filter_priority"])) {
24 + $priority = $params_decoded["the_content_filter_priority"];
25 + }
26 + }
27 + add_filter('the_content',[$this,'the_content'],$priority);
28 +
29 + // 2020-07-25 excerpt対応
30 + add_filter('excerpt_allowed_blocks',[$this,'excerpt_allowed_blocks']);
31 +
32 + $auth_info = get_option(CODOC_AUTHINFO_OPTION_NAME);
32 33
33 - wp_localize_script('codoc-editor.js', 'OPTIONS', array(
34 - 'codoc_url' => CODOC_URL,
35 - 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
36 - 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
37 - ));
38 - // tinymce 用
39 - //wp_enqueue_script( 'codoc-integration-js', CODOC_URL . '/js/integration.js', true );
40 - });
41 - return $this;
42 - }
34 + if ($auth_info) {
35 + // データ同期 (save_postはis_adminで実行されないケースがある)
36 + add_action( 'save_post', [$this,'save_post'], 20, 3 );
37 + add_action( 'added_post_meta', [$this,'updated_post_meta'], 10, 3 );
38 + add_action( 'updated_post_meta',[$this,'updated_post_meta'], 10, 3 );
39 + add_action( 'deleted_post_meta',[$this,'deleted_post_meta'], 10, 4 );
40 + }
41 + if (is_admin() and $auth_info) { //管理画面
42 + // Gutenberg のサポートがない場合は何もしない
43 + if ( function_exists( 'register_block_type' ) ) {
44 + // gutenberg
45 + require_once 'src/init.php';
46 + add_action('wp_loaded', function() {
47 + wp_localize_script('wordpress-cgb-block-js', 'OPTIONS', array(
48 + 'codoc_url' => $this->get_codoc_url(),
49 + 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
50 + 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
51 + 'codoc_sdk_path' => CODOC_SDK_PATH,
52 + ));
53 + });
54 + }
55 + // tinymce
56 + $this->add_mce();
57 + } else { // ブログ画面
58 + // codocのJS登録
59 + add_action( 'wp_enqueue_scripts', function() {
60 + $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
61 + $load_script_condition = '';
62 + if (isset($CODOC_SETTINGS["debug_params"]) and
63 + $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true) and
64 + isset($params_decoded["load_script_condition"])
65 + ) {
66 + $load_script_condition = $params_decoded["load_script_condition"];
67 + }
68 + if ($load_script_condition == 'not_list_page') {
69 + // not_list_pageの場合はトップページ等でスクリプトをロードしない
70 + if (!(is_archive() or is_category() or is_home() or is_front_page())) {
71 + wp_enqueue_script( 'codoc-injector-js', $this->get_codoc_url() . '/js/cms.js' );
72 + }
73 + } else {
74 + wp_enqueue_script( 'codoc-injector-js', $this->get_codoc_url() . '/js/cms.js' );
75 + }
76 + });
77 + //登録したscriptタグに属性をつける
78 + add_filter('script_loader_tag', [$this,'modifier_script_tag'],10,2);
79 + // tinymce用のショートコード
80 + add_shortcode('codoc', [$this, 'injector_shortcode']);
81 + // テーマをbodyにも反映
82 + add_filter('body_class', function($classes) {
83 + $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
84 + $css_path = 'blue';
85 + if (isset($CODOC_SETTINGS["css_path"]) and $CODOC_SETTINGS["css_path"]) {
86 + $css_path = $CODOC_SETTINGS["css_path"];
87 + }
88 + array_push($classes,sprintf( "codoc-theme-%s",$css_path));
89 + return $classes;
90 + });
91 +
92 + }
93 + return $this;
94 + }
95 + public function get_codoc_url() {
96 + $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
97 + if (isset($CODOC_SETTINGS["debug_params"])) {
98 + $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
99 + if (isset($params_decoded["codoc_url"])) {
100 + return $params_decoded["codoc_url"];
101 + }
102 + }
103 + return CODOC_URL;
104 + }
105 + public function modifier_script_tag($tag,$handle) {
106 + if($handle !== 'codoc-injector-js') {
107 + return $tag;
108 + }
109 + $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
110 + $data_css = '';
111 + if ($css_path = $CODOC_SETTINGS['css_path']) {
112 + $data_css = sprintf(' data-css="%s" ',$css_path);
113 + }
114 + // connect用パラメータ
115 + $connect_attributes = '';
116 + if (isset($CODOC_SETTINGS["codoc_connect_code"])) {
117 + $connect_code = $CODOC_SETTINGS["codoc_connect_code"];
118 + $connect_attributes = sprintf(' data-connect-code="%s"',$connect_code);
119 + $tag = preg_replace('/cms\.js/','cms-connect.js',$tag);
120 + }
121 + if (isset($CODOC_SETTINGS["codoc_connect_registration_mode"]) and $CODOC_SETTINGS["codoc_connect_registration_mode"]) {
122 + $connect_attributes = $connect_attributes .
123 + sprintf(' data-connect-registration-mode="%s"',$CODOC_SETTINGS["codoc_connect_registration_mode"]);
124 + }
43 125
44 - // codocのJS登録
126 + $usercode_attributes = '';
127 + $user_code = get_option(CODOC_USERCODE_OPTION_NAME);
128 + if ($user_code) {
129 + $usercode_attributes = sprintf(' data-usercode="%s"',$user_code);
130 + }
45 131
46 - add_action( 'wp_enqueue_scripts', function() {
47 - wp_enqueue_script( 'codoc-injector-js', CODOC_URL . '/js/cms.js' );
48 - });
49 - // 登録したscriptタグに属性をつける
50 - add_filter('script_loader_tag', [$this,'modifier_script_tag'],10,2);
51 - // tinymce用のショートコード
52 - add_shortcode('codoc', [$this, 'injector_shortcode']);
132 + $setting_attributes = '';
133 + if ($CODOC_SETTINGS['codoc_script_tag_attributes']) {
134 + $setting_attributes = $CODOC_SETTINGS['codoc_script_tag_attributes'];
135 + }
136 + //return str_replace(' src=', $data_css . ' defer src=', $tag);
137 + return preg_replace('/(src=[^>]+)/',' ${1} ' . $data_css . $connect_attributes . $usercode_attributes . $setting_attributes . ' defer',$tag);
138 + }
139 + public function injector_shortcode($atts) {
140 + global $post;
141 + ob_start();
142 + require 'views/codoc-injector.php';
143 + return ob_get_clean();
144 + }
145 + # settings / 設定関連
146 + public function add_settings() {
147 + global $CODOC_SETTINGS;
148 + add_action( 'admin_menu' ,function(){
149 + add_options_page(
150 + 'codoc の設定', //ページタイトル
151 + 'codoc', //設定メニューに表示されるメニュータイトル
152 + 'edit_users', //権限
153 + 'codoc', //設定ページのURL。options-general.php?page=codoc
154 + function() {
155 + echo '<div class="codoc-settings">';
156 + echo '<form method="post" action="options.php">';
157 + settings_fields( 'codoc_option_group' );
158 + do_settings_sections( 'codoc' );
159 + submit_button(); // 送信ボタン
160 + echo '</form></div>';
161 + }
162 + );
163 + });
53 164
54 - // paywall用の本文非表示化とcodocタグへの属性追加
55 - add_filter('the_content',[$this,'the_content']);
56 - return $this;
57 - }
58 -
59 - public function modifier_script_tag($tag,$handle) {
60 - if($handle !== 'codoc-injector-js') {
61 - return $tag;
62 - }
63 - $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
64 - $data_css = '';
65 - if ($css_path = $CODOC_SETTINGS['css_path']) {
66 - $data_css = sprintf(' data-css="%s" ',$css_path);
67 - }
68 - return str_replace(' src=', $data_css . ' defer src=', $tag);
69 - }
70 - public function injector_shortcode($atts) {
71 - global $post;
72 - ob_start();
73 - require 'views/codoc-injector.php';
74 - return ob_get_clean();
75 - }
76 - public function callAPI($method,$path,$body = [],$headers = []) {
77 - $usercode = get_option(CODOC_USERCODE_OPTION_NAME);
78 - $token = get_option(CODOC_TOKEN_OPTION_NAME);
165 + add_action('admin_print_styles', 'codoc_admin_styles');
166 + function codoc_admin_styles($hook) {
167 + wp_enqueue_style('codoc-options-style', plugins_url( 'codoc/css/codoc-options.css', __DIR__ ));
168 + }
169 + add_action( "admin_init", function() {
170 + // codocからの認証データ処理
171 + if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['fetch_token_key'])) {
172 + $key = sanitize_text_field($_GET['fetch_token_key']);
173 + $usercode = sanitize_text_field($_GET['usercode']);
174 + update_option(CODOC_USERCODE_OPTION_NAME,$usercode);
175 + //$data = $this->callAPI('GET','/token',[ "fetch_token_key" => $key ]);
176 + $data = $this->util->get_token([ "fetch_token_key" => $key ],["usercode" => $usercode, "token" => "1"]);
177 + if ($data->status and $token = $data->token) {
178 + update_option(CODOC_TOKEN_OPTION_NAME,$token);
179 + //$data = $this->callAPI('GET','');
180 + $data = $this->util->get_user_info([],["usercode" => $usercode, "token" => $token]);
181 + if ($data->status and $user = $data->user) {
182 + $this->update_codoc_authinfo($user);
183 + }
184 + #$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
185 + #$current_url = preg_replace('/(.*)fetch_token_key.*/','${1}&codoc_auth_finished=1',$current_url);
186 + //add_settings_error( 'general', 'settings_updated', __( 'OK' ), 'success' );
187 + $current_url = admin_url('options-general.php') . '?page=codoc&codoc_auth_finished=1';
79 188
80 - $headers['X-CodocToken'] = $token;
81 - $host = CODOC_URL;
82 - $sslverify = true;
189 + wp_redirect( $current_url);
190 + exit;
191 + }
192 + }
193 + global $CODOC_USERCODE;
194 + global $CODOC_SETTINGS;
195 + global $CODOC_TOKEN;
196 + global $CODOC_AUTHINFO;
197 + $CODOC_USERCODE = get_option(CODOC_USERCODE_OPTION_NAME);
198 + $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
199 + $CODOC_TOKEN = get_option(CODOC_TOKEN_OPTION_NAME);
200 + $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
201 + if( !$CODOC_SETTINGS ) {
202 + //デフォルト値
203 + $CODOC_SETTINGS = array(
204 + 'css_path' => '',
205 + );
206 + update_option( CODOC_SETTINGS_OPTION_NAME, $CODOC_SETTINGS );
207 + }
208 + if (!isset($CODOC_SETTINGS['str_replace_binded_url_from'])) {
209 + $CODOC_SETTINGS['str_replace_binded_url_from'] = '';
210 + }
211 + if (!isset($CODOC_SETTINGS['str_replace_binded_url_to'])) {
212 + $CODOC_SETTINGS['str_replace_binded_url_to'] = '';
213 + }
214 + if (!isset($CODOC_SETTINGS['str_before_codoc_tag'])) {
215 + $CODOC_SETTINGS['str_before_codoc_tag'] = '';
216 + }
217 + if (!isset($CODOC_SETTINGS['str_after_codoc_tag'])) {
218 + $CODOC_SETTINGS['str_after_codoc_tag'] = '';
219 + }
83 220
84 - if (preg_match('/local/',CODOC_URL)) {
85 - $sslverify = false;
86 - $host = 'https://host.docker.internal';
87 - }
88 - $url = sprintf("%s/api/v1/cms/%s%s",$host,$usercode,$path);
89 - $http = new WP_Http();
90 - try {
91 - $response = $http->request(
92 - $url,
93 - [
94 - 'sslverify' => $sslverify,
95 - 'method' => $method,
96 - 'timeout' => 10,
97 - 'headers' => $headers,
98 - 'body' => $body,
99 - ]
100 - );
101 - if ( is_wp_error($response) || $response['response']['code'] != 200 ) {
102 - //何もしない
103 - //var_dump( $response );
104 - }
105 - } catch(Exception $e) {
106 - }
107 -
108 - if (!is_wp_error($response) and
109 - isset($response['body']) and
110 - is_string($response['body']) and
111 - is_array(json_decode($response['body'], true)) and
112 - (json_last_error() == JSON_ERROR_NONE)) {
113 - return json_decode($response['body']);
114 - } else {
115 - return null;
116 - }
117 - }
118 - # settings / 設定関連
119 - public function add_settings() {
120 - global $CODOC_SETTINGS;
121 - add_action( 'admin_menu' ,function(){
122 - add_options_page(
123 - 'codoc の設定', //ページタイトル
124 - 'codoc', //設定メニューに表示されるメニュータイトル
125 - 'edit_users', //権限
126 - 'codoc', //設定ページのURL。options-general.php?page=codoc
127 - function() {
128 - echo '<div clas="wrap">';
129 - echo '<form method="post" action="options.php">';
130 - settings_fields( 'codoc_option_group' );
131 - do_settings_sections( 'codoc' );
132 - submit_button(); // 送信ボタン
133 - echo '</div>';
134 - }
135 - );
136 - });
221 + if (!isset($CODOC_SETTINGS['always_show_support'])) {
222 + $CODOC_SETTINGS['always_show_support'] = '0';
223 + }
224 + if (!isset($CODOC_SETTINGS['show_support_message'])) {
225 + $CODOC_SETTINGS['show_support_message'] = '';
226 + }
227 + if (!isset($CODOC_SETTINGS['show_support_categories'])) {
228 + $CODOC_SETTINGS['show_support_categories'] = '';
229 + }
230 + if (!isset($CODOC_SETTINGS['show_support_location'])) {
231 + $CODOC_SETTINGS['show_support_location'] = 'bottom';
232 + }
233 + if (!isset($CODOC_SETTINGS['do_not_filter_the_content'])) {
234 + $CODOC_SETTINGS['do_not_filter_the_content'] = '0';
235 + }
137 236
138 - add_action( "admin_init", function() {
139 - // codocからの認証データ処理
140 - if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['fetch_token_key'])) {
141 - $key = sanitize_text_field($_GET['fetch_token_key']);
142 - $usercode = sanitize_text_field($_GET['usercode']);
143 - update_option(CODOC_USERCODE_OPTION_NAME,$usercode);
144 - $data = $this->callAPI('GET','/token',[ "fetch_token_key" => $key ]);
145 - if ($data->status and $token = $data->token) {
146 - update_option(CODOC_TOKEN_OPTION_NAME,$token);
147 - $data = $this->callAPI('GET','');
148 - if ($data->status and $user = $data->user) {
149 - update_option(CODOC_AUTHINFO_OPTION_NAME,[
150 - 'email' => $user->email,
151 - 'name' => $user->name,
152 - ]);
153 - }
154 - #$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
155 - #$current_url = preg_replace('/(.*)fetch_token_key.*/','${1}&codoc_auth_finished=1',$current_url);
156 - //add_settings_error( 'general', 'settings_updated', __( 'OK' ), 'success' );
157 - $current_url = admin_url('options-general.php') . '?page=codoc&codoc_auth_finished=1';
158 -
159 - wp_redirect( $current_url);
160 - exit;
161 - }
162 - }
237 + if (!isset($CODOC_SETTINGS['entry_button_text'])) {
238 + $CODOC_SETTINGS['entry_button_text'] = '';
239 + }
240 + if (!isset($CODOC_SETTINGS['subscription_button_text'])) {
241 + $CODOC_SETTINGS['subscription_button_text'] = '';
242 + }
243 + if (!isset($CODOC_SETTINGS['support_button_text'])) {
244 + $CODOC_SETTINGS['support_button_text'] = '';
245 + }
246 + if (!isset($CODOC_SETTINGS['subscription_message'])) {
247 + $CODOC_SETTINGS['subscription_message'] = '';
248 + }
249 + if (!isset($CODOC_SETTINGS['support_message'])) {
250 + $CODOC_SETTINGS['support_message'] = '';
251 + }
252 + if (!isset($CODOC_SETTINGS['show_like'])) {
253 + $CODOC_SETTINGS['show_like'] = '1';
254 + }
255 + if (!isset($CODOC_SETTINGS['show_about_codoc'])) {
256 + $CODOC_SETTINGS['show_about_codoc'] = '1';
257 + }
258 + if (!isset($CODOC_SETTINGS['show_powered_by'])) {
259 + $CODOC_SETTINGS['show_powered_by'] = '1';
260 + }
163 261
164 - global $CODOC_USERCODE;
165 - global $CODOC_SETTINGS;
166 - global $CODOC_TOKEN;
167 - global $CODOC_AUTHINFO;
168 - $CODOC_USERCODE = get_option(CODOC_USERCODE_OPTION_NAME);
169 - $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
170 - $CODOC_TOKEN = get_option(CODOC_TOKEN_OPTION_NAME);
171 - $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
172 - if( !$CODOC_SETTINGS ) {
173 - //デフォルト値
174 - $CODOC_SETTINGS = array(
175 - 'css_path' => '',
176 - );
177 - update_option( CODOC_SETTINGS_OPTION_NAME, $CODOC_SETTINGS );
178 - }
179 - if (!isset($CODOC_SETTINGS['str_replace_binded_url_from'])) {
180 - $CODOC_SETTINGS['str_replace_binded_url_from'] = '';
181 - }
182 - if (!isset($CODOC_SETTINGS['str_replace_binded_url_to'])) {
183 - $CODOC_SETTINGS['str_replace_binded_url_to'] = '';
184 - }
185 -
186 - add_settings_section(
187 - 'setting_section_id', // id
188 - 'codoc 設定ページ', // title
189 - function (){}, // callback
190 - 'codoc' // page
191 - );
192 - // 認証がある場合
193 - if ($CODOC_AUTHINFO) {
194 - register_setting(
195 - 'codoc_option_group', // option group
196 - CODOC_SETTINGS_OPTION_NAME // option name(DB)
197 - );
198 - add_settings_field(
199 - 'css_path', // id
200 - 'カスタマイズ用CSSパス', // title
201 - function() {
202 - global $CODOC_SETTINGS;
203 - echo sprintf('<input type="text" name="%s[css_path]" value="%s">',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['css_path']);
204 - },
205 - 'codoc', //page
206 - 'setting_section_id' //Section
207 - );
208 - add_settings_field(
209 - 'str_replace_binded_url', // id
210 - 'codoc側に登録するパーマリンクを置換', // title
211 - function() {
212 - global $CODOC_SETTINGS;
213 - echo sprintf('<input type="text" name="%s[str_replace_binded_url_from]" value="%s">',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['str_replace_binded_url_from']);
214 - echo ('を');
215 - echo sprintf('<input type="text" name="%s[str_replace_binded_url_to]" value="%s">',CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS['str_replace_binded_url_to']);
216 - echo ('に変換');
217 - },
218 - 'codoc', //page
219 - 'setting_section_id' //Section
220 - );
262 + if (!isset($CODOC_SETTINGS['codoc_tag_attributes'])) {
263 + $CODOC_SETTINGS['codoc_tag_attributes'] = '';
264 + }
265 + if (!isset($CODOC_SETTINGS['codoc_script_tag_attributes'])) {
266 + $CODOC_SETTINGS['codoc_script_tag_attributes'] = '';
267 + }
268 + if (!isset($CODOC_SETTINGS['codoc_connect_code'])) {
269 + $CODOC_SETTINGS['codoc_connect_code'] = '';
270 + }
271 + if (!isset($CODOC_SETTINGS['codoc_connect_registration_mode'])) {
272 + $CODOC_SETTINGS['codoc_connect_registration_mode'] = '';
273 + }
274 + if (!isset($CODOC_SETTINGS['debug_params'])) {
275 + $CODOC_SETTINGS['debug_params'] = '';
276 + }
277 + add_settings_section(
278 + 'setting_section_id', // id
279 + 'codoc 設定ページ', // title
280 + function (){}, // callback
281 + 'codoc' // page
282 + );
283 + // 認証がある場合
284 + if ($CODOC_AUTHINFO) {
285 + // クリエイター情報だけ更新 (POST時に同期をとる)
286 + if (isset($_GET['page']) and $_GET['page'] == 'codoc' and isset($_GET['settings-updated'])) {
287 + $data = $this->util->get_user_info([],[
288 + "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
289 + "token" => get_option(CODOC_TOKEN_OPTION_NAME),
290 + ]);
291 + if ($data->status and $user = $data->user) {
292 + $this->update_codoc_authinfo($user);
293 + }
294 + }
221 295
222 - register_setting(
223 - 'codoc_option_group', // option group
224 - CODOC_USERCODE_OPTION_NAME
225 - );
226 - register_setting(
227 - 'codoc_option_group', // option group
228 - CODOC_TOKEN_OPTION_NAME
229 - );
230 -
231 - if (isset($_GET['codoc_auth_finished']) and $_GET['codoc_auth_finished']) {
232 - add_settings_error( 'general', 'settings_updated', __( 'codocの認証が完了しました' ), 'success' );
233 - }
234 -
235 - add_settings_field(
236 - 'codoc_auth',
237 - '認証',
238 - function() {
239 - global $CODOC_USERCODE;
240 - global $CODOC_TOKEN;
241 - global $CODOC_AUTHINFO;
242 - $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';";
296 + register_setting(
297 + 'codoc_option_group', // option group
298 + CODOC_SETTINGS_OPTION_NAME // option name(DB)
299 + );
300 + add_settings_field(
301 + 'css_path', // id
302 + 'テーマ', // title
303 + function() {
304 + global $CODOC_SETTINGS;
305 + echo '<div class="excerpt">テーマを指定してペイウォールのデザインを変えることができます。<br>パスを指定を選択することでCSSを直接指定するこもと可能です。</div>';
306 + 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']);
307 + echo '' .
308 + '<script type="text/javascript"> ' .
309 + ' function gen_css_path(select) { ' .
310 + ' if (select.value == "dark") { ' .
311 + ' document.getElementById("darkmode-caution").style.display="block";' .
312 + ' } else { ' .
313 + ' if (document.getElementById("darkmode-caution")) { ' .
314 + ' document.getElementById("darkmode-caution").style.display="none";' .
315 + ' } ' .
316 + ' } ' .
317 + ' if (select.value == "path") { ' .
318 + ' document.getElementById("codoc_css_path").readOnly=false; ' .
319 + ' if (!document.getElementById("codoc_css_path").value.match(/\//g)) {' .
320 + ' document.getElementById("codoc_css_path").value=""; ' .
321 + ' } ' .
322 + ' } else { ' .
323 + ' document.getElementById("codoc_css_path").readOnly=true; ' .
324 + ' document.getElementById("codoc_css_path").value=select.value; ' .
325 + ' } ' .
326 + ' } ' .
327 + '</script> ' ;
243 328
244 - echo sprintf('<p><font color="green" id="codoc-auth-message"><strong>%s</strong> で認証済</font></p>',$CODOC_AUTHINFO['email']);
329 + echo sprintf('<select name="theme_name" onChange="gen_css_path(this)" id="codoc_theme_select">');
330 + foreach (["blue","red","green","black","dark","blue-square","red-square","green-square","black-square","dark-square"] as $theme) {
331 + if ($theme == "blue") {
332 + echo sprintf('<option value="%s" %s>青</option>', $theme, ($CODOC_SETTINGS["css_path"] == "blue" ? "selected" : ""));
333 + }
334 + if ($theme == "red") {
335 + echo sprintf('<option value="%s" %s>赤</option>', $theme, ($CODOC_SETTINGS["css_path"] == "red" ? "selected" : ""));
336 + }
337 + if ($theme == "green") {
338 + echo sprintf('<option value="%s" %s>緑</option>', $theme, ($CODOC_SETTINGS["css_path"] == "green" ? "selected" : ""));
339 + }
340 + if ($theme == "black") {
341 + echo sprintf('<option value="%s" %s>黒</option>', $theme, ($CODOC_SETTINGS["css_path"] == "black" ? "selected" : ""));
342 + }
343 + if ($theme == "dark") {
344 + echo sprintf('<option value="%s" %s>ダークモード</option>', $theme, ($CODOC_SETTINGS["css_path"] == "dark" ? "selected" : ""));
345 + }
346 + if ($theme == "blue-square") {
347 + echo sprintf('<option value="%s" %s>青(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "blue-square" ? "selected" : ""));
348 + }
349 + if ($theme == "red-square") {
350 + echo sprintf('<option value="%s" %s>赤(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "red-square" ? "selected" : ""));
351 + }
352 + if ($theme == "green-square") {
353 + echo sprintf('<option value="%s" %s>緑(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "green-square" ? "selected" : ""));
354 + }
355 + if ($theme == "black-square") {
356 + echo sprintf('<option value="%s" %s>黒(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "black-square" ? "selected" : ""));
357 + }
358 + if ($theme == "dark-square") {
359 + echo sprintf('<option value="%s" %s>ダークモード(四角)</option>', $theme, ($CODOC_SETTINGS["css_path"] == "dark-square" ? "selected" : ""));
360 + }
361 + }
362 + echo sprintf('<option value="path" %s>パス指定</option>', (preg_match("/\//",$CODOC_SETTINGS["css_path"]) ? "selected" : ""));
363 + echo '<script type="text/javascript">gen_css_path(document.getElementById(\'codoc_theme_select\'))</script>';
364 + echo sprintf('</select></div>');
365 + echo '<p id="darkmode-caution" style="display:none">ダークモード向けテーマは文字色が白となり、背景色によっては文字が見えない状態となるためご注意ください。</p>';
366 + },
367 + 'codoc', //page
368 + 'setting_section_id' //Section
369 + );
370 + add_settings_field(
371 + 'paywall_text', // id
372 + '各種文言', // title
373 + function() {
374 + global $CODOC_SETTINGS;
375 + echo '<div class="excerpt">ペイウォール内の一部文言を変更できます。</div>';
376 + echo '<table class="innerTable"><tbody>';
377 + echo '<tr><th>いいねの表示</th><td>';
378 + 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" : ""));
379 + 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" : ""));
380 + echo '</td></tr>';
245 381
246 - echo sprintf('<input id="codoc-usercode" type="hidden" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
247 - echo sprintf('<input id="codoc-token" type="hidden" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
248 - echo sprintf('<p>認証を<a href="javascript:void(0);" onClick="' . $script . '">解除する</p>');
249 - },
250 - 'codoc',
251 - 'setting_section_id'
252 - );
253 -
254 - }
382 + echo '<tr><th>codocについての表示</th><td>';
383 + 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" : ""));
384 + 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" : ""));
385 + echo '</td></tr>';
386 +
387 + echo '<tr><th>PoweredByの表示</th><td>';
388 + 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" : ""));
389 + 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" : ""));
390 + echo '</td></tr>';
391 +
392 + echo '<tr><th>記事購入ボタンのテキスト</th><td>';
393 + echo sprintf('<input type="text" name="%s[entry_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['entry_button_text']));
394 + echo '</td></tr>';
395 +
396 + echo '<tr><th>サブスクリプション購入ボタンのテキスト</th><td>';
397 + echo sprintf('<input type="text" name="%s[subscription_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_button_text']));
398 + echo '</td></tr>';
255 399
256 - // ない場合
257 - if (!$CODOC_AUTHINFO and !isset($_GET['auth_by_myself'])) {
258 - add_settings_field(
259 - 'codoc_auth',
260 - '認証',
261 - function() {
262 -
263 - //$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
264 - $current_url = admin_url('options-general.php') . '?page=codoc';
265 - $login_url = sprintf("location.href='%s'",CODOC_URL . '/me/token?from=wp&return_url=' . urlencode($current_url));
266 - $register_url = sprintf("location.href='%s'",CODOC_URL . '/register?from=wp&return_url=' . urlencode($current_url));
267 - // submitを消しておく
268 - echo ('<script type="text/javascript">window.onload=function(){document.getElementById(\'submit\').style.display = \'none\'}</script>');
269 - echo ('codocをWordPressでご利用いただくには認証が必要です。<br />');
270 - echo sprintf('ユーザーコードとAPIトークンを<a href="%s&auth_by_myself=1">直接入力</a>することでも認証できます。<br /><br />',$current_url);
271 - 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);
272 -
400 + echo '<tr><th>サポートボタンのテキスト</th><td>';
401 + echo sprintf('<input type="text" name="%s[support_button_text]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_button_text']));
402 + echo '</td></tr>';
403 +
404 + echo '<tr><th>「サブスクリプションに含まれる記事」のテキスト</th><td>';
405 + echo sprintf('<input type="text" name="%s[subscription_message]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['subscription_message']));
406 + echo '</td></tr>';
407 +
408 + echo '<tr><th>サポート説明のテキスト</th><td>';
409 + echo sprintf('<input type="text" name="%s[support_message]" value="%s">',CODOC_SETTINGS_OPTION_NAME,esc_html($CODOC_SETTINGS['support_message']));
410 + echo '</td></tr>';
411 +
412 + echo '</tbody></table>';
413 + },
414 + 'codoc', //page
415 + 'setting_section_id' //Section
416 + );
417 +
418 + add_settings_field(
419 + 'codoc_tag_attributes', // id
420 + 'codocタグの属性', // title
421 + function() {
422 + global $CODOC_SETTINGS;
423 + echo '<div class="excerpt">codocタグに特定の属性を追加することができます。</div>';
424 + echo sprintf('<input type="text" name="%s[codoc_tag_attributes]" value="%s">',CODOC_SETTINGS_OPTION_NAME,htmlspecialchars($CODOC_SETTINGS['codoc_tag_attributes']));
425 + },
426 + 'codoc', //page
427 + 'setting_section_id' //Section
428 + );
429 + add_settings_field(
430 + 'codoc_script_tag_attributes', // id
431 + 'codoc scriptタグの属性', // title
432 + function() {
433 + global $CODOC_SETTINGS;
434 + echo '<div class="excerpt">codoc scriptタグに特定の属性を追加することができます。</div>';
435 + echo sprintf('<input type="text" name="%s[codoc_script_tag_attributes]" value="%s">',CODOC_SETTINGS_OPTION_NAME,htmlspecialchars($CODOC_SETTINGS['codoc_script_tag_attributes']));
436 + },
437 + 'codoc', //page
438 + 'setting_section_id' //Section
439 + );
440 + add_settings_field(
441 + 'str_replace_binded_url', // id
442 + 'パーマリンク', // title
443 + function() {
444 + global $CODOC_SETTINGS;
445 + echo '<div class="excerpt">codoc側に登録するパーマリンクを置換することができます。</div>';
446 + 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']));
447 + echo ('<span class="suptext">を</span>');
448 + 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']));
449 + echo ('に変換');
450 + },
451 + 'codoc', //page
452 + 'setting_section_id' //Section
453 + );
273 454
274 - },
275 - 'codoc',
276 - 'setting_section_id'
277 - );
278 - }
279 - // ない場合かつ自分で認証する場合
280 - if (!$CODOC_AUTHINFO and (isset($_GET['auth_by_myself']) and $_GET['auth_by_myself'])) {
281 - register_setting(
282 - 'codoc_option_group', // option group
283 - CODOC_USERCODE_OPTION_NAME
284 - );
285 - add_settings_field(
286 - 'codoc_usercode',
287 - 'ユーザーコード',
288 - function() {
289 - global $CODOC_USERCODE;
290 - echo sprintf('<input type="text" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
291 - },
292 - 'codoc',
293 - 'setting_section_id'
294 - );
295 - register_setting(
296 - 'codoc_option_group', // option group
297 - CODOC_TOKEN_OPTION_NAME
298 - );
299 - add_settings_field(
300 - 'codoc_token',
301 - 'APIトークン',
302 - function() {
303 - global $CODOC_TOKEN;
304 - echo sprintf('<input type="text" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
305 - },
306 - 'codoc',
307 - 'setting_section_id'
308 - );
309 - }
310 -
311 - // 認証情報を保存
312 - add_action( 'update_option_' . CODOC_USERCODE_OPTION_NAME, function( $old_value, $new_value ) {
313 - global $CODOC_RE_AUTHORIZE;
314 - $CODOC_RE_AUTHORIZE = 1;
315 - },9,2); // $hook, $function_to_add, $priority, $accepted_args
316 - add_action( 'update_option_' . CODOC_TOKEN_OPTION_NAME, function( $old_value, $new_value ) {
317 - global $CODOC_RE_AUTHORIZE;
318 - $CODOC_RE_AUTHORIZE = 1;
319 - },10,2);
320 - add_action('updated_option',function(){
321 - global $CODOC_RE_AUTHORIZE;
322 - if ($CODOC_RE_AUTHORIZE) {
323 - $data = $this->callAPI('GET','');
324 - if ($data->status and $user = $data->user) {
325 - update_option(CODOC_AUTHINFO_OPTION_NAME,[
326 - 'email' => $user->email,
327 - 'name' => $user->name,
328 - ]);
329 - } else {
330 - update_option(CODOC_AUTHINFO_OPTION_NAME,'');
331 - }
332 - }
333 - });
334 -
335 - });
336 - // プラグイン一覧に設定のリンクをいれる
337 - add_filter( 'plugin_action_links_' . plugin_basename( plugin_dir_path( __FILE__ ) . 'codoc' . '.php' ),
338 - function( $links ) {
339 - $setting_link = sprintf( '<a href="%s">%s</a>', esc_url( add_query_arg( 'page', 'codoc', admin_url( 'options-general.php' ) ) ), esc_html( '設定' ) );
340 - array_unshift( $links, $setting_link );
341 -
342 - return $links;
343 - }
344 - );
345 -
346 - }
347 - public function add_mce() {
348 - // Add Shortcode options in the WordPres visual editors
349 - // wp_enqueue_script( 'codoc-editor-script', plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ ));
350 - add_action( 'init', function() {
351 - if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
352 - return;
353 - }
354 - if ( get_user_option( 'rich_editing' ) == 'true' ) {
355 - // プラグイン内で使うCSRF を生成
356 - $path = plugins_url( 'codoc/src_mce/codoc-editor-onload.js', __DIR__ );
357 - wp_enqueue_script( 'codoc-editor-onload', $path, array('jquery'), '', true );
358 - // I just want to insert this global variables but i don't know how i can do it..
359 - wp_localize_script(
360 - 'codoc-editor-onload',
361 - 'CODOCEDITOR',
362 - array(
363 - 'action' => 'codoc_shortcodes',
364 - 'nonce' => wp_create_nonce( 'codoc_shortcodes' )
365 - )
366 - );
367 - // ここでtinymceのプラグイン追加
368 - wp_enqueue_style( 'codoc-admin-style', plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
369 - add_editor_style( plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
455 + add_settings_field(
456 + 'str_around_codoc_tag', // id
457 + 'HTMLの挿入', // title
458 + function() {
459 + global $CODOC_SETTINGS;
460 + echo '<div class="excerpt">codocタグの前後にHTMLを挿入することができます。</div>';
461 + 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']));
462 + echo ('を前に挿入</div>');
463 + 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']));
464 + echo ('を後に挿入</div>');
370 465
371 - add_filter( 'mce_external_plugins', function( $plugin_array ) {
372 - $plugin_array['codoc'] = plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ );
373 - return $plugin_array;
374 - } );
375 - add_filter( 'mce_buttons', function( $buttons ) {
376 - array_push( $buttons, "|", "codoc" );
377 - return $buttons;
378 - } );
379 - add_action( 'wp_ajax_codoc_shortcodes', function(){
380 - check_ajax_referer( 'codoc_shortcodes' );
381 - if ($usercode = sanitize_text_field($_GET['usercode'])) {
382 - update_option('codoc_usercode',$usercode);
383 - }
384 - $usercode = get_option(CODOC_USERCODE_OPTION_NAME) ? get_option(CODOC_USERCODE_OPTION_NAME) : 'nocode';
385 - $uri = CODOC_URL . '/api/v1/paywall/' . $usercode . '/entries';
386 - if ($entrycode = sanitize_text_field($_GET['entrycode'])) {
387 - $uri = $uri . '/' . $entrycode;
388 - }
389 - $args = preg_match('/local/',CODOC_URL) ? ['sslverify' => false ] : [];
390 - $response = wp_remote_request( $uri, $args );
391 -
392 - if ($response instanceof WP_Error) {
393 - exit;
394 - }
395 -
396 - $response['body'] = json_decode($response['body'], true);
397 - $entries = $response['body']['entries'];
466 + },
467 + 'codoc', //page
468 + 'setting_section_id' //Section
469 + );
398 470
399 - require 'views/codoc-shortcodes-list.php';
471 + add_settings_field(
472 + 'always_show_support_tag', // id
473 + 'サポートの自動挿入', // title
474 + function() {
475 + global $CODOC_SETTINGS;
476 + echo '<div class="excerpt">codocブロックを挿入することなく投稿にサポート機能を追加します</div>';
477 + echo '<table class="innerTable"><tbody>';
478 + echo '<tr><th>自動挿入</th><td>';
479 + 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" : ""));
480 + 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" : ""));
481 + echo '</td></tr>';
482 + echo '<tr><th>表示位置</th><td>';
483 + 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" : ""));
484 + 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" : ""));
485 + echo '</td></tr>';
486 + echo '<tr><th>説明文</th><td>';
487 + 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']));
488 + echo '</td></tr>';
489 + echo '<tr><th>対象カテゴリ名</th><td>';
490 + 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']));
491 + echo '</td></tr>';
492 + echo '</tbody></table>';
400 493
401 - wp_die();
402 - } );
403 - }
404 - } );
405 - }
406 - public function save_post($post_ID,$post,$update) {
407 - if (preg_match('/^(auto-draft|inherit)$/',$post->post_status)) {
408 - return;
409 - }
410 -
411 - $post_content = $post->post_content;
412 - preg_match('/wp:codoc\/codoc-block +?({.*})/',$post_content,$matches);
413 - // GUTENBERG で指定されたjson(記事情報)がない場合
414 - if (!$matches) {
415 - return;
416 - }
417 - // GUTENBERG で保存している内容を取得
418 - $codoc_info = json_decode($matches[1],true);
419 - // codoc タグがない場合はなにもしない
420 - //preg_match('/(<span +data-id="codoc-tag"[^>]+>(?:.+|)<\/span>)/',$post_content,$matches);
421 - preg_match('/(<(?:span|div)[^>]+data-id="codoc-tag"(?:[^>]+|)>(?:.+|)<\/(?:span|div)>)/',$post_content,$matches);
422 - if (!$matches) {
423 - return;
424 - }
425 - // TODO: split or html parse? HTMLがつながってる場合はおかしくなる
426 - // classic(tinymce)版の場合p、もしくはdivにかこまれている
427 - $splited = preg_split('/(?:<(?:div|p)(?:[^>]+|)>|)<\!-- +wp:codoc\/codoc-block .*<\!-- +\/wp:codoc\/codoc-block +-->(?:<\/(?:div|p)>|)/s',$post_content);
428 - $status = $post->post_status == 'publish' ? 1 : 0;
429 - # $body_free = '';
430 - # $body_paywalled = '';
431 - # if (count($splited) >= 2) {
432 - #
433 - # }
434 - $binded_url = get_permalink($post_ID);
435 - $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
436 - if (isset($CODOC_SETTINGS['str_replace_binded_url_from']) and
437 - isset($CODOC_SETTINGS['str_replace_binded_url_to']) and
438 - $CODOC_SETTINGS['str_replace_binded_url_from']) {
439 - $binded_url = str_replace(sanitize_text_field($CODOC_SETTINGS['str_replace_binded_url_from']),
440 - sanitize_text_field($CODOC_SETTINGS['str_replace_binded_url_to']),
441 - $binded_url);
442 - }
443 -
444 - $params = [
445 - 'title' => $post->post_title,
446 - 'body_free' => $splited[0],
447 - 'body_paywalled' => $splited[1],
448 - 'status' => $status,
449 - 'binded_url' => $binded_url,
450 - 'show_price' => isset($codoc_info['showPrice']) ? ($codoc_info['showPrice'] ? 1 : 0) : 0,
451 - 'price' => isset($codoc_info['price']) ? $codoc_info['price'] : 100,
452 - 'limited' => isset($codoc_info['limited']) ? ($codoc_info['limited'] ? 1 : 0) : 0,
453 - 'limited_count' => isset($codoc_info['limitedCount']) ? $codoc_info['limitedCount'] : 1,
454 - 'affiliate_mode' => isset($codoc_info['affiliateMode']) ? ($codoc_info['affiliateMode'] ? 1 : 0) : 0,
455 - 'affiliate_rate' => isset($codoc_info['affiliateRate']) ? $codoc_info['affiliateRate'] : '0.0500',
456 - 'show_support' => isset($codoc_info['showSupport']) ? ($codoc_info['showSupport'] ? 1 : 0) : 0,
457 - 'subscriptions' => isset($codoc_info['subscriptions']) ? array_keys($codoc_info['subscriptions']) : [],
458 - ];
459 - $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
460 - if ($entryCode) {
461 - $res = $this->callAPI('PUT','/entries/' . $entryCode ,$params);
462 - } else {
463 - $res = $this->callAPI('POST', '/entries', $params);
464 - if (is_object($res) and $res->status) {
465 - update_post_meta($post_ID,'codoc_entry_code',$res->entry->code);
466 - }
467 - }
468 - return true;
469 - }
470 - function updated_post_meta( $meta_ID, $post_ID, $meta_key ) {
471 - if ($meta_key != '_thumbnail_id') {
472 - return;
473 - }
474 - if ( has_post_thumbnail($post_ID) ) {
475 - $attachment = wp_get_attachment_metadata( get_post_thumbnail_id($post_ID));
476 - $upload_dir = wp_upload_dir();
477 - $file_path = sprintf ('%s/%s',$upload_dir['basedir'],$attachment['file']);
478 -
479 - if (is_readable($file_path)) {
480 - $name = 'file';
494 + },
495 + 'codoc', //page
496 + 'setting_section_id' //Section
497 + );
498 + add_settings_field(
499 + 'do_not_filter_the_content', // id
500 + '支障が出る処理を無効化', // title
501 + function() {
502 + global $CODOC_SETTINGS;
503 + echo '<div class="excerpt">codocの動作に支障が出る他のプラグインによる<strong>フィルター処理</strong>を無効化できます。codocが上手く動かない場合のみ利用してください。</div>';
504 + 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" : ""));
505 + 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" : ""));
506 + },
507 + 'codoc', //page
508 + 'setting_section_id' //Section
509 + );
510 + add_settings_field(
511 + 'debug_params', // id
512 + 'デバック用', // title
513 + function() {
514 + global $CODOC_SETTINGS;
515 + echo '<div class="excerpt">デバック用のパラメーターを指定できます。codocサポートから依頼がある場合のみ利用してください。</div>';
516 + 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']));
517 + },
518 + 'codoc', //page
519 + 'setting_section_id' //Section
520 + );
481 521
482 - $boundary = wp_generate_password(24);
522 + add_settings_field(
523 + 'cretor_info', // id
524 + 'クリエイター情報', // title
525 + function() {
526 + global $CODOC_SETTINGS;
527 + global $CODOC_AUTHINFO;
528 + echo sprintf('<p><font id="codoc-update-creator-info-message"></font></p>',"");
529 + // 変更を保存時に常に同期するのでこの表示は必要ないがUI上保持しておく
530 + $script = "document.getElementById('codoc-update-creator-info-message').innerText='情報を更新するには変更を保存してください';document.getElementById('codoc-update-creator-info-message').color='red';";
531 + if (isset($CODOC_AUTHINFO['profile_image_url'])) {
532 + echo sprintf('<img src="%s" width="40" height="40" />',$CODOC_AUTHINFO['profile_image_url']);
533 + }
534 + echo sprintf('<p>%s</p>',$CODOC_AUTHINFO['name']);
535 + if ($connect_code = $CODOC_SETTINGS['codoc_connect_code']) {
536 + echo sprintf('<p>%s外部サービス連携済(連携コード:%s)</p>',
537 + ($CODOC_SETTINGS['codoc_connect_registration_mode'] == 'dedicated' ? '専用ユーザーモードで' : ''),
538 + $connect_code);
539 + }
540 + echo sprintf('<p>情報を<a href="javascript:void(0);" onClick="' . $script . '">更新する</a></p>');
541 + echo ('<p>codoc側でロゴやカバー画像を変更した場合は都度更新を行ってください</p>');
542 + },
543 + 'codoc', //page
544 + 'setting_section_id' //Section
545 + );
483 546
484 - $payload = '';
485 - $payload .= '--' . $boundary;
486 - $payload .= "\r\n";
487 - $payload .= 'Content-Disposition: form-data; name="' . $name . '"; filename="' . basename( $file_path ) . '"' . "\r\n";
488 - $payload .= "Content-Type: application/octet-stream\r\n";
489 - $payload .= "Content-Transfer-Encoding: binary\r\n";
490 - $payload .= "\r\n";
491 - $payload .= file_get_contents( $file_path );
492 - $payload .= "\r\n";
493 -
494 - $payload .= '--' . $boundary . '--';
495 -
496 -
497 - $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
498 - $res = $this->callAPI(
499 - 'POST',
500 - '/entries/' . $entryCode . '/thumbnail',
501 - $payload,
502 - ['content-type' => 'multipart/form-data; boundary=' . $boundary]
503 - );
504 - }
505 - }
506 - }
507 - function deleted_post_meta( $meta_ids, $post_ID, $meta_key,$meta_value ) {
508 - if ($meta_key != '_thumbnail_id') {
509 - return;
510 - }
511 - $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
512 - $res = $this->callAPI(
513 - 'POST',
514 - '/entries/' . $entryCode . '/thumbnail',
515 - [ "reset" => 1 ]
516 - );
517 - }
518 - function the_content( $post_content ) {
519 - if ( is_single() && in_the_loop() && is_main_query() ) {
520 - }
521 - // codoc タグがあるかどうか (202001:span -> div に変更)
522 - preg_match('/(<(span|div)[^>]+data-id="codoc-tag"(?:[^>]+|)>(?:.+|)<\/(?:div|span)>)/',$post_content,$matches);
523 - // data-wp-plugin-ver が無いタグは分割しない
524 - if (!$matches) {
525 - return $post_content;
526 - }
527 - // codocタグで分割 (202001: gutenbergで直前のdivタグを削除)
528 - $tag_regex = '/(?:<div(?:[^>]+|)>|)<(?:span|div)[^>]+data-id="codoc-tag"(?:[^>]+|)>(?:.+|)<\/(?:span|div)>(?:<\/div>|)/';
529 - if ( is_preview() ) {
530 - $post_content = preg_replace($tag_regex,'<div class="codoc-continue">ここから上は無料で表示されます</div>',$post_content);
531 - return $post_content;
532 - }
533 - // codoc タグの前後で分ける
534 - $splited = preg_split($tag_regex,$post_content);
535 - // codoc タグにID属性のentrycodeとdata-without-body(無料分を非表示)をつける
536 - $post = get_post();
537 - $entryCode = sprintf('"codoc-entry-%s" ',get_post_meta($post->ID,'codoc_entry_code',true));
538 - $codoc_tag = preg_replace('/<((?:span|div)[^>]+)data-id="[^"]+"((?:[^>]+|))>/','<${1} ${2} data-without-body="1" id=' . $entryCode . ">", $matches[1]);
539 - // 無料部分のみ表示
540 - return $splited[0] . sprintf('<div class="wp-block-codoc-codoc-block">%s</div>',$codoc_tag);
541 - }
547 + register_setting(
548 + 'codoc_option_group', // option group
549 + CODOC_USERCODE_OPTION_NAME
550 + );
551 + register_setting(
552 + 'codoc_option_group', // option group
553 + CODOC_TOKEN_OPTION_NAME
554 + );
542 555
543 -
556 + if (isset($_GET['codoc_auth_finished']) and $_GET['codoc_auth_finished']) {
557 + add_settings_error( 'general', 'settings_updated', __( 'codocの認証が完了しました' ), 'success' );
558 + }
559 +
560 + add_settings_field(
561 + 'codoc_auth',
562 + '認証',
563 + function() {
564 + global $CODOC_USERCODE;
565 + global $CODOC_TOKEN;
566 + global $CODOC_AUTHINFO;
567 + $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';";
568 +
569 + echo sprintf('<p><font color="green" id="codoc-auth-message"><strong>%s</strong> で認証済</font></p>',$CODOC_AUTHINFO['email']);
570 +
571 + echo sprintf('<input id="codoc-usercode" type="hidden" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
572 + echo sprintf('<input id="codoc-token" type="hidden" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
573 + echo sprintf('<p>認証を<a href="javascript:void(0);" onClick="' . $script . '">解除する</p>');
574 + },
575 + 'codoc',
576 + 'setting_section_id'
577 + );
578 +
579 + }
580 +
581 + // ない場合
582 + if (!$CODOC_AUTHINFO and !isset($_GET['auth_by_myself'])) {
583 + add_settings_field(
584 + 'codoc_auth',
585 + '認証',
586 + function() {
587 + $theme = wp_get_theme();
588 + $from = 'wp';
589 + if ($theme->get('Name') === 'codoc') {
590 + $from = 'wp_codoc';
591 + }
592 + //$current_url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
593 + $current_url = admin_url('options-general.php') . '?page=codoc';
594 + $login_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/me/token?from=' . $from . '&return_url=' . urlencode($current_url));
595 + $register_url = sprintf("location.href='%s'",$this->get_codoc_url() . '/register?from=' . $from . '&return_url=' . urlencode($current_url));
596 + // submitを消しておく
597 + echo ('<script type="text/javascript">window.onload=function(){document.getElementById(\'submit\').style.display = \'none\'}</script>');
598 + echo ('codocをWordPressでご利用いただくには認証が必要です。<br />');
599 + echo sprintf('ユーザーコードとAPIトークンを<a href="%s&auth_by_myself=1">直接入力</a>することでも認証できます。<br /><br />',$current_url);
600 + 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);
601 +
602 +
603 + },
604 + 'codoc',
605 + 'setting_section_id'
606 + );
607 + }
608 + // ない場合かつ自分で認証する場合
609 + if (!$CODOC_AUTHINFO and (
610 + (isset($_GET['auth_by_myself']) and $_GET['auth_by_myself']) or
611 + (isset($_POST['auth_by_myself']) and $_POST['auth_by_myself'])
612 + )) {
613 + register_setting(
614 + 'codoc_option_group', // option group
615 + CODOC_USERCODE_OPTION_NAME
616 + );
617 + register_setting(
618 + 'codoc_option_group', // option group
619 + CODOC_TOKEN_OPTION_NAME
620 + );
621 + add_settings_field(
622 + 'codoc_usercode',
623 + 'ユーザーコード',
624 + function() {
625 + global $CODOC_USERCODE;
626 + echo '<input type="hidden" name="auth_by_myself" value="1">';
627 + echo sprintf('<input type="text" name="%s" value="%s">',CODOC_USERCODE_OPTION_NAME,$CODOC_USERCODE);
628 + },
629 + 'codoc',
630 + 'setting_section_id'
631 + );
632 + add_settings_field(
633 + 'codoc_token',
634 + 'APIトークン',
635 + function() {
636 + global $CODOC_TOKEN;
637 + echo sprintf('<input type="text" name="%s" value="%s">',CODOC_TOKEN_OPTION_NAME,$CODOC_TOKEN);
638 + },
639 + 'codoc',
640 + 'setting_section_id'
641 + );
642 + }
643 +
644 + // 認証情報を保存
645 + add_action( 'update_option_' . CODOC_USERCODE_OPTION_NAME, function( $old_value, $new_value ) {
646 + global $CODOC_RE_AUTHORIZE;
647 + $CODOC_RE_AUTHORIZE = 1;
648 + },9,2); // $hook, $function_to_add, $priority, $accepted_args
649 + add_action( 'update_option_' . CODOC_TOKEN_OPTION_NAME, function( $old_value, $new_value ) {
650 + global $CODOC_RE_AUTHORIZE;
651 + $CODOC_RE_AUTHORIZE = 1;
652 + },10,2);
653 +
654 + add_action('update_option_' . CODOC_SETTINGS_OPTION_NAME,function(){
655 + $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
656 + if (isset($CODOC_SETTINGS['always_show_support']) and $CODOC_SETTINGS['always_show_support']) {
657 + $data = $this->util->get_support_entry([],[
658 + "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
659 + "token" => get_option(CODOC_TOKEN_OPTION_NAME),
660 + ]);
661 + if ($data->status and $entry = $data->entry) {
662 + update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,$entry->code);
663 + } else {
664 + update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
665 + }
666 + } elseif(isset($CODOC_SETTINGS['always_show_support']) and !$CODOC_SETTINGS['always_show_support']) {
667 + update_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME,'');
668 + }
669 + });
670 +
671 + add_action('updated_option',function(){
672 + global $CODOC_RE_AUTHORIZE;
673 + if ($CODOC_RE_AUTHORIZE) {
674 + //$data = $this->callAPI('GET','');
675 + $data = $this->util->get_user_info([],[
676 + "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
677 + "token" => get_option(CODOC_TOKEN_OPTION_NAME),
678 + ]);
679 + if ($data->status and $user = $data->user) {
680 + $this->update_codoc_authinfo($user);
681 + } else {
682 + update_option(CODOC_AUTHINFO_OPTION_NAME,'');
683 + }
684 + }
685 + });
686 +
687 + });
688 + // プラグイン一覧に設定のリンクをいれる
689 + add_filter( 'plugin_action_links_' . plugin_basename( plugin_dir_path( __FILE__ ) . 'codoc' . '.php' ),
690 + function( $links ) {
691 + $setting_link = sprintf( '<a href="%s">%s</a>', esc_url( add_query_arg( 'page', 'codoc', admin_url( 'options-general.php' ) ) ), esc_html( '設定' ) );
692 + array_unshift( $links, $setting_link );
693 +
694 + return $links;
695 + }
696 + );
697 +
698 + }
699 + public function add_mce() {
700 + add_action( 'admin_enqueue_scripts', function() {
701 + if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
702 + return;
703 + }
704 + $current_screen = get_current_screen();
705 + if ( ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) || ( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) ) {
706 + // Gutenberg Editor
707 + // なにもしない
708 + } else {
709 + // tinymce
710 + if ( get_user_option( 'rich_editing' ) == 'true' ) {
711 + // プラグイン内で使うCSRF を生成
712 + $path = plugins_url( 'codoc/src_mce/codoc-editor-onload.js', __DIR__ );
713 + wp_enqueue_script( 'codoc-editor-onload', $path, array('jquery'), '', true );
714 + // I just want to insert this global variables but i don't know how i can do it..
715 + wp_localize_script(
716 + 'codoc-editor-onload',
717 + 'CODOCEDITOR',
718 + array(
719 + 'action' => 'codoc_shortcodes',
720 + 'nonce' => wp_create_nonce( 'codoc_shortcodes' ),
721 +
722 + 'codoc_url' => $this->get_codoc_url(),
723 + 'codoc_usercode' => get_option(CODOC_USERCODE_OPTION_NAME),
724 + 'codoc_plugin_version' => CODOC_PLUGIN_VERSION,
725 + 'codoc_sdk_path' => CODOC_SDK_PATH,
726 + )
727 + );
728 +
729 + // ここでtinymceのプラグイン追加
730 + //wp_enqueue_style( 'codoc-admin-style', plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
731 + //add_editor_style( plugins_url( 'codoc/src_mce/codoc-admin.css', __DIR__ ) );
732 + wp_enqueue_style( 'codoc-admin-style', $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.css?c=' . date('Ymd') );
733 + add_editor_style( $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.css' );
734 +
735 + add_filter( 'mce_external_plugins', function( $plugin_array ) {
736 + //$plugin_array['codoc'] = plugins_url( 'codoc/src_mce/codoc-editor.js', __DIR__ );
737 + $plugin_array['codoc'] = $this->get_codoc_url() . CODOC_SDK_PATH . '.tinymce.js?c=' . date('Ymd');
738 + return $plugin_array;
739 + } );
740 + add_filter( 'mce_buttons', function( $buttons ) {
741 + array_push( $buttons, "|", "codoc" );
742 + return $buttons;
743 + } );
744 + // 非SSL環境の場合、なぜかhttps -> httpsになってしまうので対策
745 + // コメントタグが除去されることがあるらしいのでvalid_elementsに必要なタグを追加 (EXPERIMENTAL)
746 + add_filter( 'tiny_mce_before_init', function($settings) {
747 + $settings['external_plugins'] = preg_replace('/"codoc":"http:/','"codoc":"https:',$settings['external_plugins']);
748 + foreach (['valid_elements','extended_valid_elements'] as $valid_elements) {
749 + if (isset($settings[$valid_elements])) {
750 + $settings[$valid_elements] = $settings[$valid_elements] . ',div[*],p[*],img[*],--[*]';
751 + }
752 + }
753 + $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
754 + if (isset($CODOC_SETTINGS["debug_params"])) {
755 + $params_decoded = json_decode($CODOC_SETTINGS["debug_params"],true);
756 + if (isset($params_decoded["mce_valid_elements"])) {
757 + $settings['valid_elements'] = $params_decoded["mce_valid_elements"];
758 + $settings['extended_valid_elements'] = $params_decoded["mce_valid_elements"];
759 + }
760 + }
761 +
762 + return $settings;
763 + },1000000);
764 + }
765 + }
766 + } );
767 + }
768 + function update_codoc_authinfo($user) {
769 + global $CODOC_SETTINGS;
770 + global $CODOC_AUTHINFO;
771 + if (property_exists($user,'connect_code') and $user->connect_code) {
772 + $CODOC_SETTINGS = get_option(CODOC_SETTINGS_OPTION_NAME);
773 + $CODOC_SETTINGS['codoc_connect_code'] = $user->connect_code;
774 + $CODOC_SETTINGS['codoc_connect_registration_mode'] = $user->connect_has_permission_dedicated_account ? 'dedicated' : '';
775 + update_option(CODOC_SETTINGS_OPTION_NAME,$CODOC_SETTINGS);
776 + }
777 + return update_option(CODOC_AUTHINFO_OPTION_NAME,[
778 + 'email' => $user->email,
779 + 'name' => $user->name,
780 + 'profile_image_url' => $user->profile_image_url,
781 + 'cover_image_url' => $user->cover_image_url,
782 + 'connect_code' => property_exists($user,'connect_code') ? $user->connect_code : '',
783 + 'connect_image_url' => property_exists($user,'connect_image_url') ? $user->connect_image_url : '',
784 + ]);
785 + $CODOC_AUTHINFO = get_option(CODOC_AUTHINFO_OPTION_NAME);
786 + }
787 + public function get_filtered_content($post_emulated) {
788 + // 記事ページであることをエミュレートしてフィルター実行
789 + $post_backuped = null;
790 + if (isset($GLOBALS['post'])) {
791 + $post_backuped = $GLOBALS['post'];
792 + }
793 + $GLOBALS['post'] = $post_emulated;
794 +
795 + $wp_query_backuped = null;
796 + if (isset($GLOBALS['wp_query'])) {
797 + $wp_query_backuped = $GLOBALS['wp_query'];
798 + $wp_query = $GLOBALS['wp_query'];
799 + $wp_query->is_single = true;
800 + $wp_query->is_singular = true;
801 + # in_the_loop は記事ページでは通常有効っぽいので true指定 ex: wp_ulike
802 + $wp_query->in_the_loop = true;
803 + # これも追加しておく
804 + $wp_query->is_main_query = true;
805 +
806 + $wp_query->post = $post_emulated;
807 + $wp_query->queried_object = $post_emulated;
808 + $wp_query->queried_object_id = $post_emulated->id;
809 +
810 + $GLOBALS['wp_query'] = $wp_query;
811 + }
812 + // $this->the_content でオリジナルを返してもらうため
813 + $this->do_not_filter_the_content = true;
814 + $content = preg_replace(
815 + '/ (\/)?wp:codoc\/codoc-block /',' \\1wptmp:codoc/codoc-block ',
816 + $post_emulated->post_content
817 + );
818 + #$content = do_shortcode( $content );
819 + $content_filtered = apply_filters( 'the_content', $content);
820 + $this->do_not_filter_the_content = false;
821 +
822 + $GLOBALS['post'] = $post_backuped;
823 +
824 + if ($wp_query_backuped) {
825 + $GLOBALS['wp_query'] = $wp_query_backuped;
826 + }
827 +
828 + $content_filtered = preg_replace(
829 + '/ (\/)?wptmp:codoc\/codoc-block /',' \\1wp:codoc/codoc-block ',
830 + $content_filtered
831 + );
832 + return $content_filtered;
833 + }
834 +
835 + public function save_post($post_ID,$post,$update) {
836 + if (preg_match('/^(auto-draft|inherit)$/',$post->post_status)) {
837 + return;
838 + }
839 + $entryCode = get_post_meta($post_ID,'codoc_entry_code',true);
840 + $codoc_settings = get_option(CODOC_SETTINGS_OPTION_NAME);
841 + $post_content = (isset($codoc_settings['do_not_filter_the_content']) and $codoc_settings['do_not_filter_the_content']) ?
842 + $post->post_content : $this->get_filtered_content($post);
843 + $res = $this->util->sync_entry([
844 + "post_title" => $post->post_title,
845 + "post_content" => $post_content,
846 + // password が設定されてる場合は限定公開にする
847 + "post_status" => $post->post_status == 'publish' ? ($post->post_password ? 2 : 1) : 0,
848 + "post_permalink" => get_permalink($post_ID),
849 + "codoc_entry_code" => $entryCode,
850 + "codoc_settings" => $codoc_settings,
851 + ],[
852 + "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
853 + "token" => get_option(CODOC_TOKEN_OPTION_NAME),
854 + ]);
855 +
856 + if (is_object($res) and $res->status and !$entryCode) {
857 + update_post_meta($post_ID,'codoc_entry_code',$res->entry->code);
858 + }
859 + return true;
860 + }
861 + function updated_post_meta( $meta_ID, $post_ID, $meta_key ) {
862 + // スルーされてる場合は他のメタ情報更新のタイミングにサムネイルをアップロード
863 + $has_to_resend = get_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',true);
864 + $has_to_resendi = get_post_meta($post_ID,'icodoc_post_thumbnail_invoking_entry_code',true);
865 + if ($has_to_resend != 1 and $meta_key != '_thumbnail_id') {
866 + return;
867 + }
868 + if ( has_post_thumbnail($post_ID) ) {
869 + // 新規投稿の場合、タイミングによってはcodocEntryCodeが取得できないので一旦スルーする
870 + if (!get_post_meta($post_ID,'codoc_entry_code',true)) {
871 + update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',1);
872 + return;
873 + } else {
874 + update_post_meta($post_ID,'codoc_post_thumbnail_invoking_entry_code',0);
875 + }
876 + $attachment = wp_get_attachment_metadata( get_post_thumbnail_id($post_ID));
877 + $upload_dir = wp_upload_dir();
878 + $file_path = sprintf ('%s/%s',$upload_dir['basedir'],$attachment['file']);
879 +
880 + return $this->util->post_thumbnail([
881 + "file_path" => $file_path,
882 + "boundary" => wp_generate_password(24),
883 + "codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true),
884 + ],[
885 + "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
886 + "token" => get_option(CODOC_TOKEN_OPTION_NAME),
887 + ]);
888 + }
889 + }
890 + function deleted_post_meta( $meta_ids, $post_ID, $meta_key,$meta_value ) {
891 + if ($meta_key != '_thumbnail_id') {
892 + return;
893 + }
894 + return $this->util->reset_thumbnail(
895 + ["codoc_entry_code" => get_post_meta($post_ID,'codoc_entry_code',true)],
896 + [
897 + "usercode" => get_option(CODOC_USERCODE_OPTION_NAME),
898 + "token" => get_option(CODOC_TOKEN_OPTION_NAME),
899 + ]
900 + );
901 + }
902 +
903 + function the_content( $post_content ) {
904 + if ( is_single() && in_the_loop() && is_main_query() ) {
905 + }
906 + // get_filtered_content から do_not_filter_the_contentを有効にされるパターン
907 + // オプションの設定値の意味合い(他のフィルタを無視)とは違うため注意
908 + if ($this->do_not_filter_the_content) {
909 + return $post_content;
910 + }
911 + $post = get_post();
912 + # is_amp で実装しているテンプレート用
913 + $is_amp_endpoint = (function_exists('is_amp_endpoint') && is_amp_endpoint()) ? true :
914 + ((function_exists('is_amp') && is_amp()) ? true : false);
915 + return $this->util->filter_content([
916 + "post_content" => $post_content,
917 + "preview" => is_preview(),
918 + "codoc_entry_code" => get_post_meta($post->ID,'codoc_entry_code',true),
919 + "codoc_settings" => get_option(CODOC_SETTINGS_OPTION_NAME),
920 + "is_amp_endpoint" => $is_amp_endpoint,
921 + "post_permalink" => get_permalink($post->ID),
922 + "codoc_support_entry_code" => get_option(CODOC_SUPPORT_ENTRYCODE_OPTION_NAME),
923 + ]);
924 + }
925 +
926 + function excerpt_allowed_blocks ($allowed_blocks) {
927 + if (is_array($allowed_blocks)) {
928 + array_push($allowed_blocks,'codoc/codoc-block');
929 + }
930 + return $allowed_blocks;
931 + }
544 932 }
545 -