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

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