PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 4.9.2
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v4.9.2
4.9.2 4.9.1 4.9.0 4.8.2 4.8.1 4.8.0 4.7.0 4.6.2 4.6.1 4.6.0 4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 4.5.1 4.5.0 4.4.1 4.4.0 3.3.4 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 All 200 releases
betterdocs / includes / Core / Install.php

Install.php in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 4.9.2, at includes/Core/Install.php

265 lines 8.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace WPDeveloper\BetterDocs\Core;
3
4 if ( ! defined( 'ABSPATH' ) ) {
5 exit;
6 }
7
8
9 use WPDeveloper\BetterDocs\Utils\Base;
10 use WPDeveloper\BetterDocs\Utils\Database;
11 use WPDeveloper\BetterDocs\Dependencies\DI\Container;
12
13 class Install extends Base {
14 /**
15 * Container
16 * @var Container
17 */
18 public $container;
19 /**
20 * Database
21 * @var Database
22 */
23 public $database;
24
25 public function __construct( Container $container ) {
26 $this->container = $container;
27 $this->database = $this->container->get( Database::class );
28
29 register_activation_hook( BETTERDOCS_PLUGIN_FILE, [ $this, 'activate' ] );
30 register_deactivation_hook( BETTERDOCS_PLUGIN_FILE, [ $this, 'deactivate' ] );
31
32 //Update message for showing notice for new release
33 add_action( 'in_plugin_update_message-betterdocs/betterdocs.php', [ $this, 'plugin_update_message' ], 10, 2 );
34 add_action( 'init', [ $this, 'check_db_updates' ], 1 );
35 add_action( 'init', [ $this, 'check_version' ], 5 );
36 }
37
38 /**
39 * This is for upgrade message.
40 *
41 * @param mixed $plugin_data
42 * @param mixed $response
43 * @return void
44 */
45 public function plugin_update_message( $plugin_data, $response ) {
46 if ( isset( $response->upgrade_notice ) ) {
47 $new_version = $plugin_data['new_version'];
48 $current_version = betterdocs()->version;
49 $current_version_minor_part = explode( '.', $current_version )[1];
50 $new_version_minor_part = explode( '.', $new_version )[1];
51
52 betterdocs()->views->get(
53 'admin/notices/upgrade',
54 [
55 'response' => $response,
56 'plugin_data' => $plugin_data,
57 'major' => ! ( $current_version_minor_part === $new_version_minor_part )
58 ]
59 );
60 }
61 }
62
63 /**
64 * This method will run when version is updated.
65 * @return void
66 */
67 public function check_version() {
68 $betterdocs_version = get_option( 'betterdocs_version', '2.3.6' );
69 $betterdocs_code_version = betterdocs()->version;
70 $requires_update = version_compare( $betterdocs_version, $betterdocs_code_version, '<' );
71
72 if ( $requires_update ) {
73 /**
74 * This block of codes will execute
75 * if this plugin is activated via PRO PLUGIN.
76 */
77 if ( $this->database->get_transient( 'maybe_betterdocs_installed_by_pro' ) ) {
78 $this->activate();
79
80 $this->database->delete_transient( 'maybe_betterdocs_installed_by_pro' );
81 }
82
83 // Re-check if any setup needed.
84 $this->check_db_updates();
85
86 if ( get_option( 'betterdocs_version' ) && str_replace( '.', '', $betterdocs_code_version ) >= 370 ) {
87 $this->migrate_customizer();
88 }
89
90 // Re-check if any migration is needed.
91 $this->container->get( Migration::class )->init( str_replace( '.', '', $betterdocs_code_version ) );
92
93 // Updated current version number of plugin.
94 $this->update_version();
95 }
96 }
97
98 /**
99 * Update BetterDocs version to current.
100 */
101 private function update_version() {
102 update_option( 'betterdocs_version', betterdocs()->version );
103 }
104
105 /**
106 * This method will run when activation hit
107 * @return void
108 */
109 public function activate() {
110 // Create DB Tables if not created.
111 $this->check_db_updates();
112
113 // Set admin roles
114 $this->container->get( Roles::class )->setup();
115
116 // Save default settings.
117 // $this->container->get( Settings::class )->save_default_settings();
118
119 // Set redirect transient
120 if ( current_user_can( 'delete_users' ) ) {
121 $this->database->set_transient( 'betterdocs_maybe_redirect', true );
122 }
123
124 $this->database->set_transient( 'betterdocs_flush_rewrite_rules', true );
125 }
126
127 /**
128 * This method will run when deactivation hit.
129 * @return void
130 */
131 public function deactivate() {
132 // Flush all the existing rewrite rules
133 flush_rewrite_rules();
134
135 // Reset admin roles
136 $this->container->get( Roles::class )->setup( true );
137 }
138
139 /**
140 * This method responsible for setup db tables for the plugin
141 * @return void
142 */
143 public function check_db_updates() {
144 $_db_version = get_option( 'betterdocs_db_version', '1.0' );
145 $_db_code_version = betterdocs()->db_version;
146 $requires_update = version_compare( $_db_version, $_db_code_version, '<' );
147
148 if ( ! $requires_update ) {
149 return;
150 }
151
152 global $wpdb;
153
154 $charset_collate = $wpdb->get_charset_collate();
155
156 // keyword_hash exists purely to make the lookup indexable: `keyword` is
157 // TEXT and is matched with BINARY (for collation safety), which no index
158 // can serve — so every front-end search used to full-scan this table.
159 // The hash narrows to a single row via the index; the BINARY comparison
160 // still decides the match, so behaviour is unchanged.
161 $search_keyword_table = $wpdb->prefix . 'betterdocs_search_keyword';
162 $search_keyword = "CREATE TABLE $search_keyword_table (
163 id bigint NOT NULL AUTO_INCREMENT,
164 keyword text NOT NULL,
165 keyword_hash char(32) NOT NULL DEFAULT '',
166 PRIMARY KEY (id),
167 KEY keyword_hash (keyword_hash)
168 ) {$charset_collate};";
169
170 $search_log_table = $wpdb->prefix . 'betterdocs_search_log';
171 $search_log = "CREATE TABLE $search_log_table (
172 id bigint NOT NULL AUTO_INCREMENT,
173 keyword_id bigint NOT NULL,
174 count mediumint(9) NULL,
175 not_found_count mediumint(9) NULL,
176 created_at date DEFAULT '0000-00-00' NOT NULL,
177 PRIMARY KEY (id),
178 KEY keyword_id (keyword_id),
179 KEY created_at (created_at),
180 KEY keyword_created (keyword_id, created_at)
181 ) {$charset_collate};";
182
183 $_analytics_table = $wpdb->prefix . 'betterdocs_analytics';
184 $analytics_table = "CREATE TABLE $_analytics_table (
185 id bigint NOT NULL AUTO_INCREMENT,
186 post_id bigint DEFAULT 0 NOT NULL,
187 impressions bigint DEFAULT 0 NOT NULL,
188 unique_visit bigint DEFAULT 0 NOT NULL,
189 happy bigint DEFAULT 0 NOT NULL,
190 sad bigint DEFAULT 0 NOT NULL,
191 normal bigint DEFAULT 0 NOT NULL,
192 created_at date DEFAULT '0000-00-00' NOT NULL,
193 PRIMARY KEY (id),
194 KEY post_id (post_id),
195 KEY impressions (impressions),
196 KEY unique_visit (unique_visit),
197 KEY happy (happy),
198 KEY sad (sad),
199 KEY normal (normal),
200 KEY created_at (created_at),
201 UNIQUE KEY post_created (post_id, created_at)
202 ) {$charset_collate};";
203
204 // The betterdocs_api_specs table moved to Pro (API Documentation is a
205 // Pro-only feature; Pro's Install creates it).
206
207 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
208 dbDelta( $search_keyword . $search_log . $analytics_table );
209
210 // Update DB Version
211 update_option( 'betterdocs_db_version', $_db_code_version );
212 }
213
214 public function migrate_customizer() {
215 /**
216 * Seed the layout Customizer settings for installs that never explicitly
217 * picked a layout. Some consumers read the raw theme_mod without a fallback
218 * (e.g. FrontEnd::article_reactions()), so an unseeded mod can render
219 * differently from the layout the front-end otherwise defaults to.
220 *
221 * Two rules keep this safe and correct:
222 * 1. Only seed a mod that has never been set ( get_theme_mod() === false ).
223 * An explicit choice — including an explicit 'layout-1' — is never
224 * overwritten, so existing sites cannot change layout on update.
225 * 2. Pull the value from Customizer\Defaults (the single source of truth
226 * the front-end already renders from) instead of a hardcoded string, so
227 * it can never drift from the real default again. Pro defaults are merged
228 * in automatically when BetterDocs Pro is active.
229 */
230 $defaults = betterdocs()->customizer->defaults->defaults();
231 $layout_mods = [
232 'betterdocs_search_layout_select',
233 'betterdocs_docs_layout_select',
234 'betterdocs_single_layout_select',
235 'betterdocs_archive_layout_select',
236 'betterdocs_select_faq_template',
237 'betterdocs_multikb_layout_select', // BetterDocs Pro.
238 'betterdocs_select_faq_template_mkb', // BetterDocs Pro.
239 ];
240
241 foreach ( $layout_mods as $mod ) {
242 // Respect an explicit user choice (including an explicit 'layout-1').
243 if ( get_theme_mod( $mod, false ) !== false ) {
244 continue;
245 }
246
247 // Only seed when a real default is registered (skips inactive add-ons).
248 if ( empty( $defaults[ $mod ] ) ) {
249 continue;
250 }
251
252 set_theme_mod( $mod, $defaults[ $mod ] );
253 }
254
255 $search_heading = get_theme_mod( 'betterdocs_live_search_heading_switch' );
256 if ( empty( $search_heading ) ) {
257 set_theme_mod( 'betterdocs_live_search_heading_switch', false );
258 }
259
260 if ( get_option( 'betterdocs_settings' ) && betterdocs()->settings->get( 'enable_estimated_reading_time' ) == false ) {
261 betterdocs()->settings->save( 'enable_estimated_reading_time', false );
262 }
263 }
264 }
265