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

381 lines 10.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\Core\Admin;
10 use WPDeveloper\BetterDocs\Core\Query;
11 use WPDeveloper\BetterDocs\Core\Roles;
12 use WPDeveloper\BetterDocs\Core\WriteWithAI;
13 use WPDeveloper\BetterDocs\Dependencies\DI\Container;
14 use WPDeveloper\BetterDocs\Utils\Views;
15 use WPDeveloper\BetterDocs\Core\BaseAPI;
16 use WPDeveloper\BetterDocs\Core\Install;
17 use WPDeveloper\BetterDocs\Core\Request;
18 use WPDeveloper\BetterDocs\Core\Rewrite;
19 use WPDeveloper\BetterDocs\Core\Scripts;
20 use WPDeveloper\BetterDocs\Utils\Helper;
21 use WPDeveloper\BetterDocs\Core\Settings;
22 use WPDeveloper\BetterDocs\Core\KBMigration;
23 use WPDeveloper\BetterDocs\Utils\Enqueue;
24 use WPDeveloper\BetterDocs\Editors\Editor;
25 use WPDeveloper\BetterDocs\Utils\Database;
26 use WPDeveloper\BetterDocs\Admin\Analytics;
27 use WPDeveloper\BetterDocs\Admin\ReportEmail;
28 use WPDeveloper\BetterDocs\FrontEnd\FrontEnd;
29 use WPDeveloper\BetterDocs\Core\ShortcodeFactory;
30 use WPDeveloper\BetterDocs\FrontEnd\TemplateTags;
31 use WPDeveloper\BetterDocs\Admin\Customizer\Customizer;
32 use WPDeveloper\BetterDocs\Dependencies\DI\ContainerBuilder;
33
34 final class Plugin {
35 private static $_instance = null;
36 /**
37 * Assets manager
38 *
39 * @var Enqueue
40 */
41 public $assets;
42 /**
43 * View manager
44 *
45 * @var Views
46 */
47 public $views;
48 /**
49 * Container Manager
50 *
51 * @var Container
52 */
53 public $container;
54 /**
55 * Editor Manager
56 * @var Editor
57 */
58 public $editor;
59 /**
60 * Helper class
61 * @var Helper
62 */
63 public $helper;
64 /**
65 * KBMigration class
66 * @var KBMigration
67 */
68 public $kbmigration;
69 /**
70 * KBMigration class
71 * @var Admin
72 */
73 public $admin;
74 /**
75 * Helper class
76 * @var Database
77 */
78 public $database;
79 /**
80 * Helper class
81 * @var Settings
82 */
83 public $settings;
84 /**
85 * Helper class
86 * @var TemplateTags
87 */
88 public $template_helper;
89 /**
90 * Customizer class
91 * @var Customizer
92 */
93 public $customizer;
94 /**
95 * Query class
96 * @var Query
97 */
98 public $query;
99 /**
100 * Rewrite Class
101 * @var Rewrite
102 */
103 public $rewrite;
104 /**
105 * Request Class
106 * @var Request
107 */
108 public $request;
109 /**
110 * Analytics Class
111 * @var Analytics
112 */
113 public $analytics;
114 /**
115 * Plugin Version
116 * @var string
117 */
118 public $version = '3.5.0';
119
120 /**
121 * WriteWithAI Class
122 * @var string
123 */
124 public $ai_autowrtie;
125
126 /**
127 * Plugin DB Version
128 * @var string
129 */
130 public $db_version = '1.0.1';
131
132 public function __construct() {
133 $this->define_constants();
134
135 do_action( 'betterdocs_init_before' );
136 $this->setup_container();
137 /**
138 * Register activation and deactivation hooks
139 * and version updates check
140 */
141 $this->container->get( Install::class );
142
143 $this->initialize();
144
145 add_action( 'init', [ $this, 'init' ], 0 );
146
147 /**
148 * For admin only
149 */
150 add_action( 'admin_init', [ $this, 'admin_init' ], 0 );
151
152 /**
153 * For AJAX only
154 */
155 $this->ajax();
156 }
157
158 private function define_constants() {
159 $this->define( 'BETTERDOCS_VERSION', $this->version );
160 $this->define( 'BETTERDOCS_DB_VERSION', $this->db_version );
161 $this->define( 'BETTERDOCS_ABSPATH', dirname( BETTERDOCS_PLUGIN_FILE ) . '/' );
162 $this->define( 'BETTERDOCS_ABSURL', plugin_dir_url( BETTERDOCS_PLUGIN_FILE ) );
163 $this->define( 'BETTERDOCS_PLUGIN_BASENAME', plugin_basename( BETTERDOCS_PLUGIN_FILE ) );
164 $this->define( 'BETTERDOCS_BLOCKS_DIRECTORY', BETTERDOCS_ABSPATH . 'assets/blocks/' );
165 $this->define( 'BETTERDOCS_ROOT_DIR_PATH', plugin_dir_path( BETTERDOCS_PLUGIN_FILE ) );
166 $this->define( 'BETTERDOCS_FSE_TEMPLATES_PATH', BETTERDOCS_ROOT_DIR_PATH . 'views/templates/fse' );
167
168 /**
169 * Third Party Constants
170 * @since 2.5.0
171 *
172 * WPML compatibility with Polylang
173 */
174 if ( Helper::is_plugin_active( 'polylang/polylang.php' ) ) {
175 define( 'PLL_WPML_COMPAT', false );
176 }
177 }
178
179 /**
180 * Define constant if not already set.
181 *
182 * @param string $name Constant name.
183 * @param string|bool $value Constant value.
184 */
185 private function define( $name, $value ) {
186 if ( ! defined( $name ) ) {
187 define( $name, $value );
188 }
189 }
190
191 public function setup_container() {
192 $config_array = require_once BETTERDOCS_ABSPATH . 'includes/config.php';
193 $config = apply_filters( 'betterdocs_container_config', $config_array );
194 $builder = new ContainerBuilder();
195
196 $builder->addDefinitions( $config );
197 $this->container = $builder->build();
198 }
199
200 public function initialize() {
201 $this->container->get( Scripts::class );
202 $this->rewrite = $this->container->get( Rewrite::class );
203 $this->request = $this->container->get( Request::class );
204 $this->query = $this->container->get( Query::class );
205
206 $this->rewrite->init();
207 $this->request->init();
208
209 $this->assets = $this->container->get( Enqueue::class );
210 $this->views = $this->container->get( Views::class );
211 $this->helper = $this->container->get( Helper::class );
212 $this->kbmigration = $this->container->get( KBMigration::class );
213 $this->admin = $this->container->get( Admin::class );
214 $this->database = $this->container->get( Database::class );
215 $this->settings = $this->container->get( Settings::class );
216 $this->analytics = $this->container->get( Analytics::class );
217
218 $this->template_helper = $this->container->get( TemplateTags::class );
219 $this->customizer = $this->container->get( Customizer::class );
220 $this->editor = $this->container->get( Editor::class );
221 $this->ai_autowrtie = $this->container->get( WriteWithAI::class );
222
223 /**
224 * Initialize all editors.
225 * Elementor, Gutenberg/BlockEditor
226 */
227 add_action( 'init', [ $this->editor, 'init' ] );
228
229 /**
230 * Initialize API
231 */
232 add_action( 'rest_api_init', [ $this, 'api_initialization' ] );
233 }
234
235 /**
236 * Initialize the BetterDocs Plugin
237 *
238 * @return void
239 * @since 2.5.0
240 */
241 public function init() {
242 /**
243 * Setup localization.
244 */
245 $this->load_plugin_textdomain();
246
247 $this->container->get( Admin::class );
248 $this->container->get( Roles::class );
249 $this->container->get( ReportEmail::class );
250
251 /**
252 * Initialize Shortcode
253 * Make sure you have listed out all shortcode in shortcode factory.
254 */
255 $this->container->get( ShortcodeFactory::class )->init();
256
257 $this->container->get( FrontEnd::class );
258
259 do_action( 'betterdocs_init' );
260 }
261
262 /**
263 * Load plugins textdomain `betterdocs` into actions.
264 * @return void
265 */
266 public function load_plugin_textdomain( $textdomain = 'betterdocs', $plugin_file = BETTERDOCS_PLUGIN_FILE ) {
267 $locale = determine_locale();
268
269 /**
270 * Filter to adjust the BetterDocs locale to use for translations.
271 */
272 $locale = apply_filters( 'plugin_locale', $locale, $textdomain );
273
274 unload_textdomain( $textdomain );
275 load_textdomain( $textdomain, WP_LANG_DIR . "/$textdomain-" . $locale . '.mo' );
276 load_plugin_textdomain( $textdomain, false, plugin_basename( dirname( $plugin_file ) ) . '/languages' );
277 }
278
279 /**
280 * For AJAX Only
281 * @return void
282 */
283 public function ajax() {
284 }
285
286 /**
287 * Create a plugin instance.
288 *
289 * @param mixed ...$args
290 *
291 * @return static
292 *
293 * @suppress PHP0441
294 * @since 2.5.0
295 */
296 public static function get_instance() {
297 if ( static::$_instance == null ) {
298 static::$_instance = new self();
299
300 do_action( 'betterdocs_loaded' );
301 }
302
303 return static::$_instance;
304 }
305
306 /**
307 * Hooked with `admin_init` action.
308 * @return void
309 */
310 public function admin_init() {
311 /**
312 * Maybe Redirect
313 * for setup related settings.
314 */
315 $this->maybe_redirect();
316 }
317
318 /**
319 * Summary of maybe_redirect
320 * @return void
321 */
322 public function maybe_redirect() {
323 // Bail if no activation transient is set.
324 if ( ! $this->database->get_transient( 'betterdocs_maybe_redirect' ) ) {
325 return;
326 }
327
328 // Delete the activation transient.
329 $this->database->delete_transient( 'betterdocs_maybe_redirect' );
330
331 if ( ! is_multisite() ) {
332 $betterdocs_settings = get_option('betterdocs_settings');
333 if ( $betterdocs_settings) {
334 wp_safe_redirect( add_query_arg( [ 'page' => 'betterdocs-settings' ], admin_url( 'admin.php' ) ) );
335 } else {
336 wp_safe_redirect( add_query_arg( [ 'page' => 'betterdocs-setup' ], admin_url( 'admin.php' ) ) );
337 }
338 }
339 }
340
341 /**
342 * Is Pro Plugin Is Installed?
343 * @return bool
344 */
345 public function is_pro_installed() {
346 return $this->helper->get_plugins( 'betterdocs-pro/betterdocs-pro.php' );
347 }
348
349 /**
350 * Is Pro Plugin Is Active?
351 * @return bool
352 */
353 public function is_pro_active() {
354 return $this->helper->is_plugin_active( 'betterdocs-pro/betterdocs-pro.php' );
355 }
356
357 /**
358 * Get all the API initialized.
359 * @return void
360 */
361 public function api_initialization() {
362 $_api_classes = scandir( __DIR__ . DIRECTORY_SEPARATOR . 'REST' );
363
364 if ( ! empty( $_api_classes ) && is_array( $_api_classes ) ) {
365 foreach ( $_api_classes as $class ) {
366 if ( $class == '.' || $class == '..' || strpos( $class, '.' ) === 0) {
367 continue;
368 }
369
370 $classname = basename( $class, '.php' );
371 $classname = '\\' . __NAMESPACE__ . "\\REST\\$classname";
372 $_api_class = $this->container->get( $classname );
373
374 if ( $_api_class instanceof BaseAPI ) {
375 $_api_class->register();
376 }
377 }
378 }
379 }
380 }
381