PluginProbe
Extendify / 3.2.2
Extendify v3.2.2
3.2.2 3.2.1 3.2.0 3.1.6 3.1.5 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.6 3.0.5 3.0.4 trunk 0.1.0 0.10.0 0.10.1 0.10.2 0.11.0 0.11.1 0.2.0 0.3.0 0.3.1 0.4.0 0.5.0 All 128 releases
← All changes | app/Agent/Admin.php +35 -7 3.1.6 → 3.2.2 View file →
@@ -11,8 +11,9 @@
11 11 use Extendify\Agent\Controllers\ChatHistoryController;
12 12 use Extendify\Agent\Controllers\TourController;
13 13 use Extendify\Config;
14 14 use Extendify\Constants;
15 +use Extendify\Mcp\Profile as McpProfile;
15 16 use Extendify\Shared\Services\Escaper;
16 17 use Extendify\Shared\Services\HttpClient;
17 18 use Extendify\Agent\TagBlocks;
18 19 use Extendify\Agent\TagTemplateParts;
@@ -17,11 +18,11 @@
17 18 use Extendify\Agent\TagBlocks;
18 19 use Extendify\Agent\TagTemplateParts;
19 20 use Extendify\Agent\WooProductImages;
20 21 use Extendify\Agent\AbilitiesDiscovery;
21 -use Extendify\Agent\Controllers\SiteNavigationController;
22 22 use Extendify\PartnerData;
23 23 use Extendify\Shared\DataProvider\ProductsData;
24 +use Extendify\SiteVisibility;
24 25
25 26 /**
26 27 * This class handles any file loading for the admin area.
27 28 */
@@ -41,11 +42,8 @@
41 42 // Tag blocks so we can identify them later
42 43 TagBlocks::init();
43 44 TagTemplateParts::init();
44 45
45 - // Add the site navigation ids to the navigation blocks
46 - SiteNavigationController::init();
47 -
48 46 Skeleton::init();
49 47
50 48 WooProductImages::init();
51 49
@@ -74,9 +72,9 @@
74 72 public function loadScriptsAndStyles()
75 73 {
76 74 // The Customizer preview iframe is a front-end render, so this fires
77 75 // there too — but the Agent only belongs on the live, top-level page.
78 - if (is_customize_preview()) {
76 + if (is_customize_preview() || McpProfile::isOwnScreen()) {
79 77 return;
80 78 }
81 79
82 80 $version = constant('EXTENDIFY_DEVMODE') ? uniqid() : Config::$version;
@@ -118,8 +116,10 @@
118 116 (bool) use_block_editor_for_post($this->getCurrentPostId()) :
119 117 false,
120 118 'isOnEditorOrFSE' => $this->isGutenbergOrFse(),
121 119 'activePlugins' => array_values(\get_option('active_plugins', [])),
120 + // The accessor also reads a key set by the IMAGIFY_API_KEY constant.
121 + 'hasImagifyApiKey' => function_exists('get_imagify_option') && (bool) \get_imagify_option('api_key'),
122 122 'isUsingVibes' => version_compare((string) wp_get_theme('extendable')->get('Version'), '2.0.32', '>='),
123 123 'siteTitle' => \esc_attr(\get_bloginfo('name')),
124 124 'siteDescription' => \esc_attr(\get_bloginfo('description')),
125 125 'themePresets' => $this->getThemePresets(),
@@ -139,8 +139,10 @@
139 139 }, $pluginRecommendations));
140 140 $agentContext = [
141 141 'availableAdminPages' => get_option('_transient_extendify_admin_pages_menu', []),
142 142 'pluginRecommendations' => $mappedPluginRecommendations,
143 + 'sitePublished' => SiteVisibility::isPublished(),
144 + 'comingSoonEnabled' => (bool) PartnerData::setting('useComingSoon'),
143 145 ];
144 146 $abilities = [
145 147 'canEditPost' => (bool) \current_user_can('edit_post', \get_queried_object_id()),
146 148 // TODO: this may be true for a user, while they still can't edit every post
@@ -173,10 +175,9 @@
173 175 // For example, we could check whether their theme has variations.
174 176 'abilities' => $abilities,
175 177 // Registered WordPress Abilities (6.9+) this user may run.
176 178 'wpAbilities' => AbilitiesDiscovery::discover(),
177 - // List of suggestions the AI can make for this user.
178 - // For example, we could check whether they need to set up a specific plugin.
179 + // The domain card reads only the register-domain record.
179 180 'suggestions' => $this->getSuggestions(),
180 181 'domainsSuggestionSettings' => [
181 182 'showPrimary' => (bool) PartnerData::setting('showPrimaryDomainRecommendationAgent'),
182 183 'showSecondary' => (bool) PartnerData::setting('showSecondaryDomainRecommendationAgent'),
@@ -311,12 +312,39 @@
311 312 $typography = \wp_get_global_settings(['typography']);
312 313
313 314 return [
314 315 'color' => $this->originSlugs($color, 'palette', 'defaultPalette'),
316 + 'colorValues' => $this->originValues($color, 'palette', 'defaultPalette', 'color'),
315 317 'gradient' => $this->originSlugs($color, 'gradients', 'defaultGradients'),
316 318 'fontSize' => $this->originSlugs($typography, 'fontSizes', 'defaultFontSizes'),
317 319 'fontFamily' => $this->originSlugs($typography, 'fontFamilies', 'defaultFontFamilies'),
318 320 ];
321 + }
322 +
323 + /**
324 + * Slug => value, so a colour written as its own hex finds the token naming it.
325 + *
326 + * @return array<string, string>
327 + */
328 + private function originValues($node, $listKey, $defaultKey, $valueKey)
329 + {
330 + $list = $node[$listKey] ?? [];
331 +
332 + $origins = ['custom', 'theme'];
333 + if (($node[$defaultKey] ?? true) !== false) {
334 + $origins[] = 'default';
335 + }
336 +
337 + $values = [];
338 + foreach ($origins as $origin) {
339 + foreach ($list[$origin] ?? [] as $item) {
340 + if (isset($item['slug'], $item[$valueKey])) {
341 + $values[(string) $item['slug']] = (string) $item[$valueKey];
342 + }
343 + }
344 + }
345 +
346 + return $values;
319 347 }
320 348
321 349 /**
322 350 * Preset slugs from a settings node's origin buckets; drops the `default`