PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 4.1.0
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v4.1.0
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 4.1.0, at includes/Plugin.php

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