PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 3.9.1
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v3.9.1
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 3.5.2 All 199 releases
betterdocs / includes / Plugin.php

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

463 lines 11.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace WPDeveloper\BetterDocs;
4
5 if ( ! defined( 'ABSPATH' ) ) {
6 exit; // Exit if accessed directly
7 }
8
9 use WPDeveloper\BetterDocs\Admin\Analytics;
10 use WPDeveloper\BetterDocs\Admin\Customizer\Customizer;
11 use WPDeveloper\BetterDocs\Admin\HelpScoutMigration;
12 use WPDeveloper\BetterDocs\Admin\ReportEmail;
13 use WPDeveloper\BetterDocs\Core\Admin;
14 use WPDeveloper\BetterDocs\Core\BaseAPI;
15 use WPDeveloper\BetterDocs\Core\Install;
16 use WPDeveloper\BetterDocs\Core\KBMigration;
17 use WPDeveloper\BetterDocs\Core\Query;
18 use WPDeveloper\BetterDocs\Core\Request;
19 use WPDeveloper\BetterDocs\Core\Rewrite;
20 use WPDeveloper\BetterDocs\Core\Roles;
21 use WPDeveloper\BetterDocs\Core\Scripts;
22 use WPDeveloper\BetterDocs\Core\Settings;
23 use WPDeveloper\BetterDocs\Core\ShortcodeFactory;
24 use WPDeveloper\BetterDocs\Core\WriteWithAI;
25 use WPDeveloper\BetterDocs\Dependencies\DI\Container;
26 use WPDeveloper\BetterDocs\Dependencies\DI\ContainerBuilder;
27 use WPDeveloper\BetterDocs\Editors\Editor;
28 use WPDeveloper\BetterDocs\FrontEnd\FrontEnd;
29 use WPDeveloper\BetterDocs\FrontEnd\TemplateTags;
30 use WPDeveloper\BetterDocs\Modules\StyleHandler as ModulesStyleHandler;
31 use WPDeveloper\BetterDocs\Utils\Database;
32 use WPDeveloper\BetterDocs\Utils\Enqueue;
33 use WPDeveloper\BetterDocs\Utils\Helper;
34 use WPDeveloper\BetterDocs\Utils\Views;
35
36 final class Plugin {
37 private static $_instance = null;
38 /**
39 * Assets manager
40 *
41 * @var Enqueue
42 */
43 public $assets;
44 /**
45 * View manager
46 *
47 * @var Views
48 */
49 public $views;
50 /**
51 * Container Manager
52 *
53 * @var Container
54 */
55 public $container;
56 /**
57 * Editor Manager
58 * @var Editor
59 */
60 public $editor;
61 /**
62 * Helper class
63 * @var Helper
64 */
65 public $helper;
66 /**
67 * KBMigration class
68 * @var KBMigration
69 */
70 public $kbmigration;
71 /**
72 * KBMigration class
73 * @var Admin
74 */
75 public $admin;
76 /**
77 * Helper class
78 * @var Database
79 */
80 public $database;
81 /**
82 * Helper class
83 * @var Settings
84 */
85 public $settings;
86 /**
87 * Helper class
88 * @var TemplateTags
89 */
90 public $template_helper;
91 /**
92 * Customizer class
93 * @var Customizer
94 */
95 public $customizer;
96 /**
97 * Query class
98 * @var Query
99 */
100 public $query;
101 /**
102 * Rewrite Class
103 * @var Rewrite
104 */
105 public $rewrite;
106 /**
107 * Request Class
108 * @var Request
109 */
110 public $request;
111 /**
112 * Analytics Class
113 * @var Analytics
114 */
115 public $analytics;
116 /**
117 * Plugin Version
118 * @var string
119 */
120 public $version = '3.9.1';
121
122 /**
123 * WriteWithAI Class
124 * @var string
125 */
126 public $ai_autowrtie;
127 public $backgroundProccessor;
128
129 /**
130 * Plugin DB Version
131 * @var string
132 */
133 public $db_version = '1.0.1';
134
135 public function __construct() {
136 $this->define_constants();
137
138 do_action( 'betterdocs_init_before' );
139
140 $this->setup_container();
141 /**
142 * Register activation and deactivation hooks
143 * and version updates check
144 */
145 $this->container->get( Install::class );
146
147 add_action( 'init', [ $this, 'initialize' ], 0 );
148
149 /**
150 * Initialize API
151 */
152 add_action( 'rest_api_init', [ $this, 'api_initialization' ] );
153
154 /**
155 * For admin only
156 */
157 add_action( 'admin_init', [ $this, 'admin_init' ], 0 );
158
159 /**
160 * For AJAX only
161 */
162 $this->ajax();
163
164 /**
165 * Style Handler For Parsing and Saving Styles as file.
166 */
167 ModulesStyleHandler::init();
168 }
169
170 private function define_constants() {
171 $this->define( 'BETTERDOCS_VERSION', $this->version );
172 $this->define( 'BETTERDOCS_DB_VERSION', $this->db_version );
173 $this->define( 'BETTERDOCS_ABSPATH', dirname( BETTERDOCS_PLUGIN_FILE ) . '/' );
174 $this->define( 'BETTERDOCS_ABSURL', plugin_dir_url( BETTERDOCS_PLUGIN_FILE ) );
175 $this->define( 'BETTERDOCS_PLUGIN_BASENAME', plugin_basename( BETTERDOCS_PLUGIN_FILE ) );
176 $this->define( 'BETTERDOCS_BLOCKS_DIRECTORY', BETTERDOCS_ABSPATH . 'assets/blocks/' );
177 $this->define( 'BETTERDOCS_ROOT_DIR_PATH', plugin_dir_path( BETTERDOCS_PLUGIN_FILE ) );
178 $this->define( 'BETTERDOCS_FSE_TEMPLATES_PATH', BETTERDOCS_ROOT_DIR_PATH . 'views/templates/fse' );
179
180 /**
181 * Third Party Constants
182 * @since 2.5.0
183 *
184 * WPML compatibility with Polylang
185 */
186 if ( Helper::is_plugin_active( 'polylang/polylang.php' ) ) {
187 define( 'PLL_WPML_COMPAT', false );
188 }
189 }
190
191 /**
192 * Define constant if not already set.
193 *
194 * @param string $name Constant name.
195 * @param string|bool $value Constant value.
196 */
197 private function define( $name, $value ) {
198 if ( ! defined( $name ) ) {
199 define( $name, $value );
200 }
201 }
202
203 public function setup_container() {
204 $config_array = require_once BETTERDOCS_ABSPATH . 'includes/config.php';
205 $config = apply_filters( 'betterdocs_container_config', $config_array );
206 $builder = new ContainerBuilder();
207
208 $builder->addDefinitions( $config );
209 $this->container = $builder->build();
210 }
211
212 public function initialize() {
213
214 /**
215 * Setup localization.
216 */
217 $this->load_plugin_textdomain();
218
219 $this->container->get( Scripts::class );
220 $this->rewrite = $this->container->get( Rewrite::class );
221 $this->request = $this->container->get( Request::class );
222 $this->query = $this->container->get( Query::class );
223
224 // Initialize background process
225 $this->backgroundProccessor = $this->container->get( HelpScoutMigration::class );
226
227 $this->rewrite->init();
228 $this->request->init();
229
230 $this->assets = $this->container->get( Enqueue::class );
231 $this->views = $this->container->get( Views::class );
232 $this->helper = $this->container->get( Helper::class );
233 $this->kbmigration = $this->container->get( KBMigration::class );
234 $this->admin = $this->container->get( Admin::class );
235 $this->database = $this->container->get( Database::class );
236 $this->settings = $this->container->get( Settings::class );
237 $this->analytics = $this->container->get( Analytics::class );
238
239 $this->template_helper = $this->container->get( TemplateTags::class );
240 $this->customizer = $this->container->get( Customizer::class );
241 $this->editor = $this->container->get( Editor::class );
242 $this->ai_autowrtie = $this->container->get( WriteWithAI::class );
243
244 $this->container->get( Admin::class );
245 $this->container->get( Roles::class );
246 $this->container->get( ReportEmail::class );
247
248 /**
249 * Initialize Shortcode
250 * Make sure you have listed out all shortcode in shortcode factory.
251 */
252 $this->container->get( ShortcodeFactory::class )->init();
253
254 $this->container->get( FrontEnd::class );
255
256 do_action( 'betterdocs_init' );
257
258 $this->editor->init();
259 }
260
261 /**
262 * Load plugins textdomain `betterdocs` into actions.
263 * @return void
264 */
265 public function load_plugin_textdomain( $textdomain = 'betterdocs', $plugin_file = BETTERDOCS_PLUGIN_FILE ) {
266 $locale = determine_locale();
267
268 /**
269 * Filter to adjust the BetterDocs locale to use for translations.
270 */
271 $locale = apply_filters( 'plugin_locale', $locale, $textdomain );
272
273 if ( file_exists( WP_LANG_DIR . "/$textdomain-" . $locale . '.mo' ) ) {
274 unload_textdomain( $textdomain );
275 load_textdomain( $textdomain, WP_LANG_DIR . "/$textdomain-" . $locale . '.mo' );
276 }
277
278 load_plugin_textdomain( $textdomain, false, plugin_basename( dirname( $plugin_file ) ) . '/languages' );
279 }
280
281 /**
282 * For AJAX Only
283 * @return void
284 */
285 public function ajax() {
286 }
287
288 /**
289 * Create a plugin instance.
290 *
291 * @param mixed ...$args
292 *
293 * @return static
294 *
295 * @suppress PHP0441
296 * @since 2.5.0
297 */
298 public static function get_instance() {
299 if ( self::$_instance == null ) {
300 self::$_instance = new self();
301
302 do_action( 'betterdocs_loaded' );
303 }
304
305 return self::$_instance;
306 }
307
308 /**
309 * Hooked with `admin_init` action.
310 * @return void
311 */
312 public function admin_init() {
313 /**
314 * Maybe Redirect
315 * for setup related settings.
316 */
317 $this->maybe_redirect();
318 }
319
320 /**
321 * Summary of maybe_redirect
322 * @return void
323 */
324 public function maybe_redirect() {
325 // Bail if no activation transient is set.
326 if ( ! $this->database->get_transient( 'betterdocs_maybe_redirect' ) ) {
327 return;
328 }
329
330 // Delete the activation transient.
331 $this->database->delete_transient( 'betterdocs_maybe_redirect' );
332
333 if ( ! is_multisite() ) {
334 $betterdocs_settings = get_option( 'betterdocs_settings' );
335 if ( $betterdocs_settings ) {
336 wp_safe_redirect( add_query_arg( [ 'page' => 'betterdocs-settings' ], admin_url( 'admin.php' ) ) );
337 } else {
338 wp_safe_redirect( add_query_arg( [ 'page' => 'betterdocs-setup' ], admin_url( 'admin.php' ) ) );
339 }
340 }
341 }
342
343 /**
344 * Is Pro Plugin Is Installed?
345 * @return bool
346 */
347 public function is_pro_installed() {
348 return $this->helper->get_plugins( 'betterdocs-pro/betterdocs-pro.php' );
349 }
350
351 /**
352 * Is Pro Plugin Is Active?
353 * @return bool
354 */
355 public function pro_file() {
356 return WP_PLUGIN_DIR . '/betterdocs-pro/betterdocs-pro.php';
357 }
358
359 public function is_pro_active() {
360 if ( file_exists( $this->pro_file() ) ) {
361 return $this->helper->is_plugin_active( 'betterdocs-pro/betterdocs-pro.php' );
362 }
363
364 return false;
365 }
366
367 public function chatbot_file() {
368 return WP_PLUGIN_DIR . '/betterdocs-ai-chatbot/betterdocs-ai-chatbot.php';
369 }
370
371 public function is_chatbot_active() {
372 if ( file_exists( $this->chatbot_file() ) ) {
373 return $this->helper->is_plugin_active( 'betterdocs-ai-chatbot/betterdocs-ai-chatbot.php' );
374 }
375
376 return false;
377 }
378
379 public function pro_version() {
380 if ( ! $this->is_pro_active() ) {
381 return false;
382 }
383
384 if ( ! function_exists( 'get_plugin_data' ) ) {
385 require_once ABSPATH . 'wp-admin/includes/plugin.php';
386 }
387
388 $plugin_data = get_plugin_data( $this->pro_file() );
389
390 return $plugin_data['Version'];
391 }
392
393 /**
394 * Get all the API initialized.
395 * @return void
396 */
397 public function api_initialization() {
398 $_api_classes = scandir( __DIR__ . DIRECTORY_SEPARATOR . 'REST' );
399
400 if ( ! empty( $_api_classes ) && is_array( $_api_classes ) ) {
401 foreach ( $_api_classes as $class ) {
402 if ( $class == '.' || $class == '..' || strpos( $class, '.' ) === 0 ) {
403 continue;
404 }
405
406 $classname = basename( $class, '.php' );
407 $classname = '\\' . __NAMESPACE__ . "\\REST\\$classname";
408 $_api_class = $this->container->get( $classname );
409
410 if ( $_api_class instanceof BaseAPI ) {
411 $_api_class->register();
412 }
413 }
414 }
415 }
416
417 public function is_betterdocs_screen( $hook, $admin_check = true ): bool {
418 $screens = [
419 'toplevel_page_betterdocs-dashboard',
420 'toplevel_page_betterdocs-admin',
421 'admin_page_betterdocs-admin',
422 'betterdocs_page_betterdocs-admin',
423 'betterdocs_page_betterdocs-analytics',
424 'betterdocs_page_betterdocs-settings',
425 'betterdocs_page_betterdocs-faq',
426 'betterdocs_page_betterdocs-glossaries',
427 'betterdocs_page_betterdocs-ai-chatbot',
428 ];
429
430 if ( $admin_check ) {
431 if ( in_array( $hook, $screens ) ) {
432 return true;
433 }
434
435 return false;
436 }
437
438 return false;
439 }
440
441 public function get_betterdocs_screen() {
442 $registered_screens = [
443 'toplevel_page_betterdocs-dashboard',
444 'admin_page_betterdocs-admin',
445 'betterdocs_page_betterdocs-admin',
446 'betterdocs_page_betterdocs-settings',
447 'betterdocs_page_betterdocs-analytics',
448 'betterdocs_page_betterdocs-faq',
449 'betterdocs_page_betterdocs-glossaries',
450 'betterdocs_page_betterdocs-ai-chatbot',
451 'edit-docs',
452 ];
453
454 $current_screen_id = get_current_screen() != null ? get_current_screen()->id : '';
455
456 if ( in_array( $current_screen_id, $registered_screens ) ) {
457 return $current_screen_id;
458 }
459
460 return false;
461 }
462 }
463