PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 4.9.4
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v4.9.4
4.9.4 4.9.3 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 All 202 releases
← All changes | betterdocs.php +43 -5 4.9.1 → 4.9.4 View file →
@@ -3,9 +3,9 @@
3 3 /**
4 4 * Plugin Name: BetterDocs
5 5 * Plugin URI: https://betterdocs.co/
6 6 * Description: Create stunning Knowledge base & FAQs for your WordPress website and reduce support pressure with the help of BetterDocs. Get access to amazing templates and create fully customizable KB with AI Write.
7 - * Version: 4.9.1
7 + * Version: 4.9.4
8 8 * Requires at least: 6.4
9 9 * Requires PHP: 7.4
10 10 * Author: WPDeveloper
11 11 * Author URI: https://wpdeveloper.com
@@ -81,14 +81,52 @@
81 81 return Plugin::get_instance();
82 82 }
83 83
84 84 /**
85 + * Whether an active BetterDocs add-on has not been loaded yet.
86 + *
87 + * Pro and the AI Chatbot hook `betterdocs_init_before` / `betterdocs_loaded`
88 + * and the `betterdocs_container_config` filter, all of which fire while Free
89 + * boots. They are meant to load first (alphabetically they do), but a migrated
90 + * `active_plugins` order, a plugin-ordering tool or a network-activated Free
91 + * can put an add-on after Free. Booting then is too early: the add-on's hooks
92 + * are missing, and the Chatbot's config needs Pro's classes, which fatals the
93 + * whole site when Pro has not loaded yet.
94 + *
95 + * @since 4.9.4
96 + * @return bool
97 + */
98 +function betterdocs_has_pending_addons() {
99 + $addons = [
100 + 'betterdocs-pro/betterdocs-pro.php' => 'BETTERDOCS_PRO_FILE',
101 + 'betterdocs-ai-chatbot/betterdocs-ai-chatbot.php' => 'BETTERDOCS_CHATBOT_FILE',
102 + ];
103 +
104 + $active = (array) get_option( 'active_plugins', [] );
105 + if ( is_multisite() ) {
106 + $active = array_merge( $active, array_keys( (array) get_site_option( 'active_sitewide_plugins', [] ) ) );
107 + }
108 +
109 + foreach ( $addons as $plugin => $loaded_constant ) {
110 + if ( in_array( $plugin, $active, true ) && ! defined( $loaded_constant ) ) {
111 + return true;
112 + }
113 + }
114 +
115 + return false;
116 +}
117 +
118 +/**
85 119 * Initialize BetterDocs (Free)
86 120 * Here, begins the execution of the plugin.
87 121 *
88 - * Returns the main instance of BetterDocs.
122 + * Boots right away, as always, unless an active add-on is still to load; then
123 + * boots first thing on `plugins_loaded`, once every plugin has registered its
124 + * hooks, so any load order behaves like the default one.
89 125 *
90 - * @return Plugin
91 126 * @since 3.0
92 127 */
93 -
94 -betterdocs();
128 +if ( ! did_action( 'plugins_loaded' ) && betterdocs_has_pending_addons() ) {
129 + add_action( 'plugins_loaded', 'betterdocs', PHP_INT_MIN );
130 +} else {
131 + betterdocs();
132 +}