prefix . $table; // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter -- テーブル名は $wpdb->prefix と上の固定リストだけで組み立てており、ユーザー入力を含まない。 $wpdb->query( "DROP TABLE IF EXISTS `{$table_name}`" ); } /* * formii_* オプションと formii_ の transient を削除する。 * 別アドオン(Pro のライセンス・Broadcast・Headless)のデータはテーブルと同じく対象外にする。 */ $addon_patterns = array(); foreach ( array( 'formii_license_', 'formii_bcast_', 'formii_broadcast_', 'formii_headless_' ) as $addon_prefix ) { foreach ( array( '', '_transient_', '_transient_timeout_' ) as $prefix ) { $addon_patterns[] = $wpdb->esc_like( $prefix . $addon_prefix ) . '%'; } } $not_like = implode( ' AND ', array_fill( 0, count( $addon_patterns ), 'option_name NOT LIKE %s' ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter -- 直下の $wpdb->prepare() で全値をプレースホルダ処理済み。$not_like は固定文字列のプレースホルダ列でユーザー入力を含まない。 $wpdb->query( // 除外条件の件数に合わせて NOT LIKE のプレースホルダーを組み立てているため、置換数の静的判定を抑止する。 // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber $wpdb->prepare( // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared "DELETE FROM {$wpdb->options} WHERE ( option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s ) AND {$not_like}", array_merge( array( $wpdb->esc_like( 'formii_' ) . '%', $wpdb->esc_like( '_transient_formii_' ) . '%', $wpdb->esc_like( '_transient_timeout_formii_' ) . '%', ), $addon_patterns ) ) ); // チュートリアル既読の user_meta を削除する // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE %s", $wpdb->esc_like( 'formii_tutorial_dismissed_' ) . '%' ) ); // 予約済みの日次クリーンアップを解除する wp_clear_scheduled_hook( 'formii_daily_cleanup' ); // 直接 SQL で削除したため、オブジェクトキャッシュ上の古い値を捨てる wp_cache_delete( 'alloptions', 'options' ); wp_cache_delete( 'notoptions', 'options' ); }; if ( is_multisite() ) { $formii_site_ids = get_sites( array( 'fields' => 'ids', 'number' => 0, ) ); foreach ( $formii_site_ids as $formii_site_id ) { switch_to_blog( (int) $formii_site_id ); $formii_uninstall_site(); restore_current_blog(); } } else { $formii_uninstall_site(); }