PluginProbe
Blog Floating Button / trunk
Blog Floating Button vtrunk
trunk 1.4.10 1.4.11 1.4.12 1.4.13 1.4.14 1.4.15 1.4.16 1.4.17 1.4.18 1.4.19 1.4.20 1.4.21 1.4.7 1.4.8 1.4.9
blog-floating-button / function.php

function.php in Blog Floating Button trunk, at function.php

607 lines 20.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 if ( ! defined( 'ABSPATH' ) ) {
4 exit;
5 }
6
7 // 管理画面でスクリプト読み込み
8 function bfb_admin_scripts( $loader_src ) {
9
10 wp_enqueue_script( 'jquery' );
11 wp_enqueue_script( 'jquery-ui-core' );
12 wp_enqueue_script( 'jquery-ui-widget' );
13 wp_enqueue_script( 'jquery-ui-tabs' );
14
15 // 日付ピッカー
16 wp_enqueue_script( 'jquery-ui-datepicker' );
17 wp_enqueue_style( 'jquery-ui-css', plugins_url( 'css/jquery-ui.css', __FILE__ ), array(), BFB_PLUGIN_VERSION );
18
19 // カラーピッカー
20 wp_enqueue_style( 'wp-color-picker' );
21
22 // フォント
23 wp_enqueue_style( 'bfb_font_montserrat', plugins_url( 'css/bfb-font.css', __FILE__ ), array(), BFB_PLUGIN_VERSION );
24
25 // グラフ描画
26 global $hook_suffix;
27 if ( strpos( $hook_suffix, 'blog-floating-button' ) > -1 ) {
28 wp_enqueue_script( 'chart-min-js', plugins_url( 'js/Chart.min.js', __FILE__ ), array(), BFB_PLUGIN_VERSION, true );
29 wp_enqueue_script( 'chartjs-plugin-colorschemes-min-js', plugins_url( 'js/chartjs-plugin-colorschemes.min.js', __FILE__ ), array( 'chart-min-js' ), BFB_PLUGIN_VERSION, true );
30 }
31
32 // table
33 wp_enqueue_script( 'jquery-dataTables-min-js', plugins_url( 'js/jquery.dataTables.min.js', __FILE__ ), array( 'jquery' ), BFB_PLUGIN_VERSION, true );
34 wp_enqueue_style( 'jquery-dataTables-min-css', plugins_url( 'css/jquery.dataTables.min.css', __FILE__ ), array(), BFB_PLUGIN_VERSION );
35
36 // 管理画面CSS
37 wp_enqueue_style( 'admin-bfb-style-css', plugins_url( 'css/admin_bfb_style.css', __FILE__ ), array(), BFB_PLUGIN_VERSION );
38 }
39 add_action( 'admin_enqueue_scripts', 'bfb_admin_scripts' );
40
41 // スクリプト読み込み
42 function bfb_enqueue_scripts() {
43
44 wp_enqueue_script( 'jquery' );
45 wp_register_script( 'bfb_js_cookie', plugins_url( 'js/jquery.cookie.js', __FILE__ ), array( 'jquery' ), BFB_PLUGIN_VERSION, true );
46 wp_enqueue_script( 'bfb_js_cookie' );
47 wp_enqueue_style( 'bfb_font_montserrat', plugins_url( 'css/bfb-font.css', __FILE__ ), array(), BFB_PLUGIN_VERSION );
48 }
49 add_action( 'wp_enqueue_scripts', 'bfb_enqueue_scripts' );
50
51 // 投稿、固定ページ、カスタム投稿タイプ編集画面にBFB設定を追加
52 function bfb_add_fields() {
53
54 $bfb = new BlogFloatingButton();
55
56 if ( $bfb->is_activation ) {
57
58 // カスタム投稿タイプ
59 $custom_post_types = get_post_types(
60 array(
61 'public' => true,
62 '_builtin' => false,
63 ),
64 'names'
65 );
66 foreach ( $custom_post_types as $post_type ) {
67 add_meta_box(
68 'blog_floating_button',
69 'Blog Float Button設定(PRO版)',
70 'bfb_fields',
71 $post_type,
72 'normal'
73 );
74 }
75
76 // 投稿、固定ページ
77 add_meta_box( 'blog_floating_button', 'Blog Float Button設定(PRO版)', 'bfb_fields', array( 'post', 'page' ), 'normal' );
78 }
79 }
80 add_action( 'admin_menu', 'bfb_add_fields' );
81
82 function bfb_fields() {
83
84 global $post;
85
86 $bfb = new BlogFloatingButton();
87 $bfb->option_page( $post->ID );
88 }
89
90 // 個別記事の設定保存
91 function bfb_save_fields( $post_id ) {
92
93 // nonceを確認し値が正しくなければ何もしない
94 $nonce = isset( $_POST['_wpnonce_bfb'] ) ? sanitize_text_field( wp_unslash( $_POST['_wpnonce_bfb'] ) ) : '';
95 if ( ! wp_verify_nonce( $nonce, 'bfb_setting' ) ) {
96 return $post_id;
97 }
98
99 $bfb = new BlogFloatingButton();
100
101 // �
102 �通
103 $bfb_use_post = filter_input( INPUT_POST, 'bfb_use_post', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
104 if ( ! empty( $bfb_use_post ) ) {
105 $is_validate = $bfb->check_validation( $bfb_use_post, array( 'w' ) );
106 if ( $is_validate ) {
107 update_post_meta( $post_id, 'bfb_use_post', $bfb_use_post );
108 }
109 }
110
111 foreach ( $bfb->devices as $device ) {
112
113 ${'bfb_designType_' . $device} = filter_input( INPUT_POST, 'bfb_designType_' . $device, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
114 ${'bfb_optId_' . $device} = filter_input( INPUT_POST, 'bfb_optId_' . $device, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
115
116 if ( ! empty( ${'bfb_designType_' . $device} ) ) {
117 $is_validate = $bfb->check_validation( ${'bfb_designType_' . $device}, array( 'w' ) );
118 if ( $is_validate ) {
119 update_post_meta( $post_id, 'bfb_designType_' . $device, ${'bfb_designType_' . $device} );
120 } else {
121 $bfb->validation_msg( 'bfb_designType' );
122 }
123 }
124 if ( isset( ${'bfb_optId_' . $device} ) ) {
125 $is_validate = $bfb->check_validation( ${'bfb_optId_' . $device}, array( 'w' ) );
126 if ( $is_validate ) {
127 update_post_meta( $post_id, 'bfb_optId_' . $device, ${'bfb_optId_' . $device} );
128 } else {
129 $bfb->validation_msg( 'bfb_optId' );
130 }
131 }
132
133 foreach ( $bfb->designTypes as $designType ) {
134 foreach ( $bfb->btnItems as $item => $validates ) {
135
136 $key = 'bfb_' . $designType . '_' . $item . '_' . $device;
137 $postData = filter_input( INPUT_POST, $key );
138
139 if ( isset( $postData ) ) {
140 $is_validate = $bfb->check_validation( $postData, $validates );
141 if ( $is_validate ) {
142 update_post_meta( $post_id, 'bfb_' . $designType . '_' . $item . '_' . $device, $postData );
143 } else {
144 $bfb->validation_msg( $item );
145 }
146 }
147 }
148 }
149 }
150 }
151 add_action( 'save_post', 'bfb_save_fields' );
152
153 // カテゴリーに追加
154 add_action( 'category_edit_form', 'bfb_add_category_fields' );
155 function bfb_add_category_fields( $tag ) {
156
157 $bfb = new BlogFloatingButton();
158
159 if ( $bfb->is_activation ) {
160
161 global $post;
162
163 $category_id = $tag->term_id;
164
165 $bfb->option_page( $category_id );
166
167 }
168 }
169 add_action( 'edited_term', 'bfb_save_category_fileds' );
170 function bfb_save_category_fileds( $category_id ) {
171
172 $bfb = new BlogFloatingButton();
173
174 // phpcs:ignore WordPress.Security.NonceVerification.Missing -- 直後の wp_verify_nonce() で検証している。nonce値自体を $_POST から取るため存在チェックが�
175 �行するのは避けられない
176 if ( ! $_POST ) {
177 return false; }
178
179 // nonceを確認し値が正しくなければ何もしない
180 $nonce = isset( $_POST['_wpnonce_bfb'] ) ? sanitize_text_field( wp_unslash( $_POST['_wpnonce_bfb'] ) ) : '';
181 if ( ! wp_verify_nonce( $nonce, 'bfb_setting' ) ) {
182 return $post_id;
183 }
184
185 // 個別設定の使用
186 $bfb_use_category = filter_input( INPUT_POST, 'bfb_use_category', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
187 if ( ! empty( $bfb_use_category ) ) {
188 $is_validate = $bfb->check_validation( $bfb_use_category, array( 'w' ) );
189 if ( $is_validate ) {
190 $cat_meta['bfb_use_category'] = $bfb_use_category;
191 update_option( "cat_$category_id", $cat_meta );
192 }
193 }
194 // 個別設定の優�
195 �度
196 $bfb_categoryPriority = filter_input( INPUT_POST, 'bfb_use_category', FILTER_VALIDATE_INT );
197 if ( ! empty( $bfb_categoryPriority ) ) {
198 $is_validate = $bfb->check_validation( $bfb_categoryPriority, array( 'int' ) );
199 if ( $is_validate ) {
200 $cat_meta['bfb_categoryPriority'] = $bfb_categoryPriority;
201 update_option( "cat_$category_id", $cat_meta );
202 }
203 }
204
205 foreach ( $bfb->devices as $device ) {
206
207 ${'bfb_designType_' . $device} = filter_input( INPUT_POST, 'bfb_designType_' . $device, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
208 ${'bfb_optId_' . $device} = filter_input( INPUT_POST, 'bfb_optId_' . $device, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
209
210 if ( ! empty( ${'bfb_designType_' . $device} ) ) {
211 $cat_meta[ 'bfb_designType_' . $device ] = ${'bfb_designType_' . $device};
212 update_option( "cat_$category_id", $cat_meta );
213 }
214 if ( isset( ${'bfb_optId_' . $device} ) ) {
215 $cat_meta[ 'bfb_optId_' . $device ] = ${'bfb_optId_' . $device};
216 update_option( "cat_$category_id", $cat_meta );
217 }
218
219 foreach ( $bfb->designTypes as $designType ) {
220 foreach ( $bfb->btnItems as $item => $validates ) {
221
222 $key = 'bfb_' . $designType . '_' . $item . '_' . $device;
223 $postData = filter_input( INPUT_POST, $key );
224
225 if ( isset( $postData ) ) {
226
227 $is_validate = $bfb->check_validation( $postData, $validates );
228
229 if ( ! $is_validate ) {
230 $bfb->validation_msg( $item );
231 } else {
232 $cat_meta[ $key ] = $postData;
233 update_option( "cat_$category_id", $cat_meta );
234 }
235 }
236 }
237 }
238 }
239 }
240
241 // 有効化時にデータベース作成
242 function bfb_activate() {
243 global $wpdb;
244 $sql = '';
245 $charset_collate = '';
246
247 // charset
248 if ( ! empty( $wpdb->charset ) ) {
249 $charset_collate = "DEFAULT CHARACTER SET {$wpdb->charset} ";
250 }
251 // �
252 �合順序
253 if ( ! empty( $wpdb->collate ) ) {
254 $charset_collate .= "COLLATE {$wpdb->collate}";
255 }
256
257 // アクセスログテーブル作成
258 $bfb_access_db_version = '1.0.2';
259 $access_installed_ver = get_option( 'bfb_access_db_version' );
260
261 if ( $access_installed_ver != $bfb_access_db_version ) {
262 $sql = 'CREATE TABLE ' . $wpdb->prefix . "bfb_access_log (
263 id bigint(20) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
264 post_id int(10) unsigned NOT NULL,
265 post_url text NOT NULL,
266 ip varchar(50) NOT NULL,
267 ua text NOT NULL,
268 device varchar(10) NOT NULL,
269 referer text,
270 optimize_id varchar(32) NOT NULL,
271 optimize_type varchar(30) NOT NULL,
272 date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
273 ) {$charset_collate};";
274 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
275 dbDelta( $sql );
276 update_option( 'bfb_access_db_version', $bfb_access_db_version );
277 }
278
279 // クリックログテーブル作成
280 $bfb_click_db_version = '1.0.2';
281 $click_installed_ver = get_option( 'bfb_click_db_version' );
282
283 if ( $click_installed_ver != $bfb_click_db_version ) {
284 $sql = 'CREATE TABLE ' . $wpdb->prefix . "bfb_click_log (
285 id bigint(20) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
286 post_id int(10) unsigned NOT NULL,
287 post_url text NOT NULL,
288 linked_url text NOT NULL,
289 ip varchar(50) NOT NULL,
290 ua text NOT NULL,
291 device varchar(10) NOT NULL,
292 memo text,
293 optimize_id varchar(32) NOT NULL,
294 optimize_type varchar(30) NOT NULL,
295 date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
296 ) {$charset_collate};";
297 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
298 dbDelta( $sql );
299 update_option( 'bfb_click_db_version', $bfb_click_db_version );
300 }
301
302 // A/Bテストメタテーブル作成
303 $bfb_optimize_db_version = '1.0.0';
304 $optimize_installed_ver = get_option( 'bfb_optimize_db_version' );
305
306 if ( $optimize_installed_ver != $bfb_optimize_db_version ) {
307 $sql = 'CREATE TABLE ' . $wpdb->prefix . "bfb_optimizemeta (
308 id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
309 optimize_id varchar(255) NOT NULL,
310 meta_key varchar(255) NOT NULL,
311 meta_value longtext NOT NULL
312 ) {$charset_collate};";
313 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
314 dbDelta( $sql );
315 update_option( 'bfb_optimize_db_version', $bfb_optimize_db_version );
316 }
317
318 // プラグインが有効化されたときにクーロンジョブを登録する
319 if ( ! wp_next_scheduled( 'bfb_cleanup_logs_event' ) ) { // クーロンジョブの重複登録を防ぐチェック
320 wp_schedule_event( time(), 'daily', 'bfb_cleanup_logs_event' );
321 }
322 }
323 register_activation_hook( __FILE__, 'bfb_activate' );
324 add_action( 'plugins_loaded', 'bfb_activate' );
325
326 // DBにアクセスログ、クリックログを残す
327 function bfb_write_log() {
328
329 // phpcs:ignore WordPress.Security.NonceVerification.Missing -- 未ログインの一般訪問�
330 からアクセスログを受け取る�
331 �開エンドポイントのため nonce は適用できない
332 if ( empty( $_POST['data'] ) ) {
333 return false; }
334
335 $tr = new Tracking();
336 $bfb_db_action = filter_input( INPUT_POST, 'bfb_db_action' );
337
338 if ( $bfb_db_action == 'bfb_tracking_access' ) {
339
340 $arg = array(
341 'data' => array(
342 'post_id' => FILTER_VALIDATE_INT,
343 'post_url' => FILTER_VALIDATE_URL,
344 'referer' => FILTER_VALIDATE_URL,
345 'optimize_id' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
346 'optimize_type' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
347 'flags' => FILTER_REQUIRE_ARRAY,
348 ),
349 );
350 $postData = filter_input_array( INPUT_POST, $arg );
351
352 $data = $tr->get_user_data( $postData['data'] );
353 if ( isset( $data ) ) {
354 $tr->write_accessLog( $data );
355 }
356 } elseif ( $bfb_db_action == 'bfb_tracking_click' ) {
357
358 $arg = array(
359 'data' => array(
360 'post_id' => FILTER_VALIDATE_INT,
361 'post_url' => FILTER_VALIDATE_URL,
362 'linked_url' => FILTER_VALIDATE_URL,
363 'ua' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
364 'memo' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
365 'optimize_id' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
366 'optimize_type' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
367 'flags' => FILTER_REQUIRE_ARRAY,
368 ),
369 );
370 $postData = filter_input_array( INPUT_POST, $arg );
371
372 $tr->write_clickLog( $postData['data'] );
373
374 }
375 }
376 function add_bfb_endpoint() {
377 register_rest_route(
378 'bfb/api',
379 '/bfb_write_log',
380 array(
381 'methods' => 'POST',
382 'callback' => 'bfb_write_log',
383 'permission_callback' => '__return_true',
384 )
385 );
386 }
387 add_action( 'rest_api_init', 'add_bfb_endpoint' );
388
389 // ライブプレビュー
390 function bfb_api_livePreview() {
391
392 $bfb = new BlogFloatingButton();
393
394 $postData = filter_input( INPUT_POST, 'btnData', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY );
395
396 if ( ! $postData ) {
397 return false; }
398
399 foreach ( $postData as $key => $postData ) {
400
401 if ( $key == 'designType' ) {
402
403 if ( strpos( $postData, 'textBtnTextBtn' ) > -1 ) {
404 $previewDatas['designType'] = 'textBtnTextBtn';
405 } elseif ( strpos( $postData, 'textTextBtn' ) > -1 ) {
406 $previewDatas['designType'] = 'textTextBtn';
407 } elseif ( strpos( $postData, 'textBtn' ) > -1 ) {
408 $previewDatas['designType'] = 'textBtn';
409 } elseif ( strpos( $postData, 'imgBanner' ) > -1 ) {
410 $previewDatas['designType'] = 'imgBanner';
411 }
412 }
413
414 foreach ( $bfb->btnItems as $item => $validates ) {
415 if ( strpos( $key, '_' . $item . '_' ) > -1 && $key != 'designType' ) {
416 $previewDatas[ $item ] = $postData;
417 break;
418 }
419 }
420 }
421
422 // 詳細設定の読み込み
423 foreach ( $bfb->devices as $device ) {
424 foreach ( $bfb->bfbDesignItems as $bfbDesignItem => $validates ) {
425 if ( isset( $postData[ $bfbDesignItem . '_' . $device ] ) ) {
426 $previewDatas[ $bfbDesignItem . '_' . $device ] = $postData[ $bfbDesignItem . '_' . $device ];
427 } else {
428 $previewDatas[ $bfbDesignItem . '_' . $device ] = '';
429 }
430 }
431 }
432
433 // ABテストのプレビュー時のテストID
434 if ( isset( $postData['optimize_id'] ) ) {
435 $previewDatas['optimize_id'] = $postData['optimize_id'];
436 }
437
438 $previewDatas['live_preview'] = true;
439 if ( $previewDatas ) {
440 // phpcs:ignore WordPress.Security.NonceVerification.Missing -- 管理画面のプレビュー生成のみを行い、値の保存や状�
441 �変更をしない読み取り専用エンドポイント。受け取った device は直後にホワイトリスト�
442 �合している
443 $device = isset( $_POST['device'] ) ? sanitize_text_field( wp_unslash( $_POST['device'] ) ) : '';
444 if ( ! in_array( $device, $bfb->devices, true ) ) {
445 return false;
446 }
447 return $bfb->generate_btn_html( $device, $previewDatas );
448 }
449 }
450 function bfb_livePreview_endpoint() {
451 register_rest_route(
452 'bfb/api',
453 '/live_preview',
454 array(
455 'methods' => 'POST',
456 'callback' => 'bfb_api_livePreview',
457 'permission_callback' => '__return_true',
458 )
459 );
460 }
461 add_action( 'rest_api_init', 'bfb_livePreview_endpoint' );
462
463 // 最適化テスト時のフロートボタン出力
464 // 通常出力だとキャッシュにより切り替えられない
465 function bfb_api_echo_bfb_optimize() {
466
467 $bfb = new BlogFloatingButton();
468
469 $arg = array(
470 'device' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
471 'post_id' => FILTER_VALIDATE_INT,
472 'page_type' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
473 'optimizeBtn' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
474 );
475 $postData = filter_input_array( INPUT_POST, $arg );
476
477 if ( isset( $postData['device'] ) && $postData['device'] == 'pc' ) {
478 $device = 'pc';
479 } elseif ( isset( $postData['device'] ) && $postData['device'] == 'sp' ) {
480 $device = 'sp';
481 }
482
483 if ( isset( $postData['post_id'] ) && preg_match( '/^[0-9]+$/', $postData['post_id'] ) ) {
484 $post_id = $postData['post_id'];
485 } else {
486 $post_id = '';
487 }
488 if ( isset( $postData['page_type'] ) && preg_match( '/^\w+$/', $postData['page_type'] ) ) {
489 $page_type = $postData['page_type'];
490 } else {
491 $page_type = '';
492 }
493 if ( isset( $postData['optimizeBtn'] ) && preg_match( '/^\w+$/', $postData['optimizeBtn'] ) ) {
494 $optimizeBtn = $postData['optimizeBtn'];
495 } else {
496 $optimizeBtn = '';
497 }
498
499 // アクセスログとフロートボタンを合わせる
500 // アクセスログは早く呼ばれるためPOSTでデータ保持
501 if ( $optimizeBtn == 'mainBtnDesign' ) {
502 $meta = array(
503 'optimizeBtn' => 'mainBtnDesign',
504 'suf_optimizeBtn' => '_opt_mainBtn',
505 );
506 } else {
507 $meta = array(
508 'optimizeBtn' => 'subBtnDesign',
509 'suf_optimizeBtn' => '_opt_subBtn',
510 );
511 }
512
513 $bfb->read_metadata_condi( $post_id, $page_type );
514 $bfb->init_bfb( $device );
515 return $bfb->generate_btn_html( $device, null, $meta );
516 }
517 function bfb_echo_bfb_optimize_endpoint() {
518 register_rest_route(
519 'bfb/api',
520 '/echo_bfb_optimize',
521 array(
522 'methods' => 'POST',
523 'callback' => 'bfb_api_echo_bfb_optimize',
524 'permission_callback' => '__return_true',
525 )
526 );
527 }
528 add_action( 'rest_api_init', 'bfb_echo_bfb_optimize_endpoint' );
529
530 function bfb_show_position() {
531 return '<div id="bfb_show_position"></div>';
532 }
533 // ショートコード、bfb_showとbfb_hideはpro版のみ動作するように変更 v1.4.16
534 // add_shortcode('bfb_show', 'bfb_show_position');
535
536 function bfb_hide_position() {
537 return '<div id="bfb_hide_position"></div>';
538 }
539 // ショートコード、bfb_showとbfb_hideはpro版のみ動作するように変更 v1.4.16
540 // add_shortcode('bfb_hide', 'bfb_hide_position');
541
542 // 設定された保存期間を�
543 えた、解析レポートのログを削除する
544 function bfb_cleanup_analysis_logs() {
545
546 // 削除する日数を取得
547 $threshold_date = get_option( 'bfb_retention_period', 'period_0' );
548 switch ( $threshold_date ) {
549 case 'period_0':
550 $threshold_date = '0';
551 break;
552 case 'period_30':
553 $threshold_date = '30';
554 break;
555 case 'period_90':
556 $threshold_date = '90';
557 break;
558 case 'period_180':
559 $threshold_date = '180';
560 break;
561 case 'period_360':
562 $threshold_date = '360';
563 break;
564 default:
565 $threshold_date = '0';
566 }
567
568 // デバッグ用。基本コメントアウト(バックグラウンド処理はvar_dumpなどで出力して確認ができないため、任意の値をDBに登録することで確認している)
569 // $bfb_debug = $threshold_date;
570 // update_option( 'bfb_cleanup_analysis_logs_debug', $bfb_debug );
571
572 // 0の場合は何もしない
573 if ( $threshold_date == '0' ) {
574 return;
575 } else {
576 // 取得した数値をUnixタイムスタンプに変換
577 $threshold_date = gmdate( 'Y-m-d', strtotime( '-' . $threshold_date . ' days' ) );
578 // ログを削除する処理を実�
579
580 global $wpdb;
581
582 $where = array( 'date < %s' );
583 $params = array( $threshold_date );
584
585 // アクセスログを削除
586 $table_name = $wpdb->prefix . 'bfb_access_log';
587 // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- テーブル名は $wpdb->prefix 由来で固定
588 $sql = "DELETE FROM $table_name WHERE " . implode( ' AND ', $where );
589 // phpcs:ignore PluginCheck.Security.DirectDB.UnescapedDBParameter,WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- $sql は固定の断片と %s プレースホルダのみで構成し値は prepare() でバインドしている。プラグイン独自テーブルの定期削除のため WP API では代替できず、削除処理にキャッシュは不要
590 $wpdb->query( $wpdb->prepare( $sql, $params ) );
591
592 // クリックログを削除
593 $table_name = $wpdb->prefix . 'bfb_click_log';
594 // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- テーブル名は $wpdb->prefix 由来で固定
595 $sql = "DELETE FROM $table_name WHERE " . implode( ' AND ', $where );
596 // phpcs:ignore PluginCheck.Security.DirectDB.UnescapedDBParameter,WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- $sql は固定の断片と %s プレースホルダのみで構成し値は prepare() でバインドしている。プラグイン独自テーブルの定期削除のため WP API では代替できず、削除処理にキャッシュは不要
597 $wpdb->query( $wpdb->prepare( $sql, $params ) );
598 }
599 }
600 add_action( 'bfb_cleanup_logs_event', 'bfb_cleanup_analysis_logs' );
601
602 // プラグインが無効化されたときにクーロンジョブを削除する
603 function bfb_deactivation_cleanup_analysis_logs_cron() {
604 wp_clear_scheduled_hook( 'bfb_cleanup_logs_event' );
605 }
606 register_deactivation_hook( __FILE__, 'bfb_deactivation_cleanup_analysis_logs_cron' );
607