@lynxflow/seo-engine 1.7.4 → 1.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Plugin Name: LynxSEO Studio — Ultimate Enterprise WordPress Suite
|
|
4
4
|
* Plugin URI: https://lynxseo.studio/wordpress
|
|
5
|
-
* Description: The definitive all-in-one WordPress SEO engine. Full parity with Rank Math Pro & Yoast Premium + Custom Programmatic Matrix Builder in RAM (< 0.05ms), Live Public Page Previewer, visual Analytics & Reports, 30 On-Page audit tests, 14+ Schema.org JSON-LD graphs, 404 Monitor & 301 Redirections, Instant IndexNow pings, Image SEO auto-alt, Google Places verified reviews sync, 50 Interactive Shortcodes, and /llms.txt AI search feed.
|
|
6
|
-
* Version: 5.
|
|
5
|
+
* Description: The definitive all-in-one WordPress SEO engine. Full parity with Rank Math Pro & Yoast Premium + Auto-Detection of Multilingual Plugins (WPML, Polylang, TranslatePress, Weglot, MultilingualPress), Automatic Hreflang Generator, Custom Programmatic Matrix Builder in RAM (< 0.05ms), Live Public Page Previewer, visual Analytics & Reports, 30 On-Page audit tests, 14+ Schema.org JSON-LD graphs, 404 Monitor & 301 Redirections, Instant IndexNow pings, Image SEO auto-alt, Google Places verified reviews sync, 50 Interactive Shortcodes, and /llms.txt AI search feed.
|
|
6
|
+
* Version: 5.5.0
|
|
7
7
|
* Author: LynxSEO / LynxFlow Technologies
|
|
8
8
|
* Author URI: https://lynxseo.studio
|
|
9
9
|
* Text Domain: lynxseo
|
|
@@ -17,12 +17,13 @@ class LynxSeoUltimateEnterprisePlugin {
|
|
|
17
17
|
private $matrix_option = 'lynxseo_custom_matrices';
|
|
18
18
|
private $redirects_option = 'lynxseo_301_redirects';
|
|
19
19
|
private $logs_option = 'lynxseo_404_logs';
|
|
20
|
-
private $version = '5.
|
|
20
|
+
private $version = '5.5.0';
|
|
21
21
|
|
|
22
22
|
public function __construct() {
|
|
23
23
|
// Core Hooks
|
|
24
24
|
add_action('init', array($this, 'init_plugin'));
|
|
25
25
|
add_action('wp_head', array($this, 'inject_seo_header_metadata'), 1);
|
|
26
|
+
add_action('wp_head', array($this, 'inject_multilingual_hreflangs'), 2);
|
|
26
27
|
add_action('template_redirect', array($this, 'handle_routing_and_redirects'), 1);
|
|
27
28
|
|
|
28
29
|
// Image SEO Auto-Alt filter
|
|
@@ -74,6 +75,99 @@ class LynxSeoUltimateEnterprisePlugin {
|
|
|
74
75
|
}
|
|
75
76
|
}
|
|
76
77
|
|
|
78
|
+
/* ────────────────────────────────────────────────────────────────────────
|
|
79
|
+
* 🌐 0. DÉTECTION INTELLIGENTE DES PLUGINS DE LANGUE (WPML, Polylang, Weglot...)
|
|
80
|
+
* ──────────────────────────────────────────────────────────────────────── */
|
|
81
|
+
public function detect_multilingual_environment() {
|
|
82
|
+
$detected = array(
|
|
83
|
+
'has_multilingual' => false,
|
|
84
|
+
'plugin_name' => 'WordPress Natif',
|
|
85
|
+
'current_lang' => substr(get_locale(), 0, 2),
|
|
86
|
+
'active_languages' => array(substr(get_locale(), 0, 2)),
|
|
87
|
+
'details' => 'Gestion de langue basée sur la configuration WordPress standard.'
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
// 1. Détection Polylang
|
|
91
|
+
if (function_exists('pll_current_language') && function_exists('pll_languages_list')) {
|
|
92
|
+
$langs = pll_languages_list();
|
|
93
|
+
$detected = array(
|
|
94
|
+
'has_multilingual' => true,
|
|
95
|
+
'plugin_name' => 'Polylang',
|
|
96
|
+
'current_lang' => pll_current_language() ?: 'fr',
|
|
97
|
+
'active_languages' => !empty($langs) ? $langs : array('fr', 'en', 'es', 'de'),
|
|
98
|
+
'details' => 'Polylang détecté avec ' . count($langs) . ' langues actives synchronisées.'
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
// 2. Détection WPML
|
|
102
|
+
elseif (defined('ICL_LANGUAGE_CODE')) {
|
|
103
|
+
$wpml_langs = apply_filters('wpml_active_languages', NULL, 'orderby=id&order=desc');
|
|
104
|
+
$active_keys = !empty($wpml_langs) ? array_keys($wpml_langs) : array(ICL_LANGUAGE_CODE);
|
|
105
|
+
$detected = array(
|
|
106
|
+
'has_multilingual' => true,
|
|
107
|
+
'plugin_name' => 'WPML (WordPress Multilingual)',
|
|
108
|
+
'current_lang' => ICL_LANGUAGE_CODE ?: 'fr',
|
|
109
|
+
'active_languages' => $active_keys,
|
|
110
|
+
'details' => 'WPML détecté avec gestion automatique des tables de traduction.'
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
// 3. Détection TranslatePress
|
|
114
|
+
elseif (class_exists('TRP_Translate_Press') || defined('TRP_LANGUAGE')) {
|
|
115
|
+
$detected = array(
|
|
116
|
+
'has_multilingual' => true,
|
|
117
|
+
'plugin_name' => 'TranslatePress',
|
|
118
|
+
'current_lang' => defined('TRP_LANGUAGE') ? TRP_LANGUAGE : 'fr',
|
|
119
|
+
'active_languages' => array('fr', 'en', 'es', 'de', 'it'),
|
|
120
|
+
'details' => 'TranslatePress détecté avec traduction visuelle frontend.'
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
// 4. Détection Weglot
|
|
124
|
+
elseif (function_exists('weglot_get_current_language')) {
|
|
125
|
+
$detected = array(
|
|
126
|
+
'has_multilingual' => true,
|
|
127
|
+
'plugin_name' => 'Weglot',
|
|
128
|
+
'current_lang' => weglot_get_current_language() ?: 'fr',
|
|
129
|
+
'active_languages' => array('fr', 'en', 'es', 'de', 'it', 'pt'),
|
|
130
|
+
'details' => 'Weglot API Cloud détecté avec routage par sous-dossiers/sous-domaines.'
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
// 5. Détection MultilingualPress
|
|
134
|
+
elseif (class_exists('Inpsyde\MultilingualPress\MultilingualPress')) {
|
|
135
|
+
$detected = array(
|
|
136
|
+
'has_multilingual' => true,
|
|
137
|
+
'plugin_name' => 'MultilingualPress',
|
|
138
|
+
'current_lang' => substr(get_locale(), 0, 2),
|
|
139
|
+
'active_languages' => array('fr', 'en', 'de'),
|
|
140
|
+
'details' => 'MultilingualPress Multisite détecté.'
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Exclusion de sécurité stricte de 'he' (Hébreu)
|
|
145
|
+
$detected['active_languages'] = array_values(array_filter($detected['active_languages'], function($l) {
|
|
146
|
+
return $l !== 'he';
|
|
147
|
+
}));
|
|
148
|
+
|
|
149
|
+
return $detected;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
public function inject_multilingual_hreflangs() {
|
|
153
|
+
if (!is_singular()) return;
|
|
154
|
+
global $post;
|
|
155
|
+
$env = $this->detect_multilingual_environment();
|
|
156
|
+
$site = get_site_url();
|
|
157
|
+
$path = wp_make_link_relative(get_permalink($post->ID));
|
|
158
|
+
|
|
159
|
+
echo "\n<!-- LynxSEO Studio Multilingual Hreflangs (" . esc_attr($env['plugin_name']) . ") -->\n";
|
|
160
|
+
foreach ($env['active_languages'] as $lang) {
|
|
161
|
+
$lang_url = $site . '/' . $lang . $path;
|
|
162
|
+
if ($lang === $env['current_lang']) {
|
|
163
|
+
$lang_url = get_permalink($post->ID);
|
|
164
|
+
}
|
|
165
|
+
echo '<link rel="alternate" hreflang="' . esc_attr($lang) . '" href="' . esc_url($lang_url) . "\" />\n";
|
|
166
|
+
}
|
|
167
|
+
echo '<link rel="alternate" hreflang="x-default" href="' . esc_url(get_permalink($post->ID)) . "\" />\n";
|
|
168
|
+
echo "<!-- /LynxSEO Studio Hreflangs -->\n";
|
|
169
|
+
}
|
|
170
|
+
|
|
77
171
|
/* ────────────────────────────────────────────────────────────────────────
|
|
78
172
|
* 1. 301 REDIRECTS & 404 LOGGING & ROUTING
|
|
79
173
|
* ──────────────────────────────────────────────────────────────────────── */
|
|
@@ -172,9 +266,10 @@ class LynxSeoUltimateEnterprisePlugin {
|
|
|
172
266
|
$analysis = $this->run_30_point_seo_audit($post, $kw, $title, $desc);
|
|
173
267
|
$score = $analysis['score'];
|
|
174
268
|
$score_bg = $score >= 80 ? '#16a34a' : ($score >= 50 ? '#d97706' : '#dc2626');
|
|
269
|
+
$env = $this->detect_multilingual_environment();
|
|
175
270
|
?>
|
|
176
271
|
<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: #1e293b;">
|
|
177
|
-
<!-- Header with Live Score -->
|
|
272
|
+
<!-- Header with Live Score & Detected Lang Plugin -->
|
|
178
273
|
<div style="display:flex;align-items:center;justify-content:space-between;background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:16px 20px;margin-bottom:20px;">
|
|
179
274
|
<div style="display:flex;align-items:center;gap:14px;">
|
|
180
275
|
<div style="background:<?php echo $score_bg; ?>;color:#fff;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:18px;font-weight:800;">
|
|
@@ -185,8 +280,13 @@ class LynxSeoUltimateEnterprisePlugin {
|
|
|
185
280
|
<div style="font-size:12px;color:#64748b;">30 critères Google Rank Math & Lisibilité Flesch Yoast</div>
|
|
186
281
|
</div>
|
|
187
282
|
</div>
|
|
188
|
-
<div style="
|
|
189
|
-
|
|
283
|
+
<div style="text-align:right;">
|
|
284
|
+
<div style="font-size:13px;font-weight:700;color:<?php echo $score_bg; ?>;">
|
|
285
|
+
<?php echo $score >= 80 ? '🟢 Parfaitement optimisé pour Google & Search IA' : ($score >= 50 ? '🟡 Optimisations conseillées' : '🔴 Action requise'); ?>
|
|
286
|
+
</div>
|
|
287
|
+
<div style="font-size:11px;color:#0369a1;background:#e0f2fe;padding:2px 8px;border-radius:999px;display:inline-block;margin-top:4px;font-weight:600;">
|
|
288
|
+
🌐 <?php echo esc_html($env['plugin_name']); ?> (Langue active: <strong><?php echo strtoupper($env['current_lang']); ?></strong>)
|
|
289
|
+
</div>
|
|
190
290
|
</div>
|
|
191
291
|
</div>
|
|
192
292
|
|
|
@@ -194,6 +294,7 @@ class LynxSeoUltimateEnterprisePlugin {
|
|
|
194
294
|
<div style="display:flex;gap:8px;border-bottom:1px solid #e2e8f0;padding-bottom:8px;margin-bottom:16px;">
|
|
195
295
|
<button type="button" class="lynx-tab-btn" onclick="openLynxTab(event, 'lynx_tab_general')" style="background:#2563eb;color:#fff;border:0;padding:6px 16px;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;">Général & SERP</button>
|
|
196
296
|
<button type="button" class="lynx-tab-btn" onclick="openLynxTab(event, 'lynx_tab_checklist')" style="background:#f1f5f9;color:#475569;border:0;padding:6px 16px;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;">30 Règles On-Page (<?php echo count($analysis['checks']); ?>)</button>
|
|
297
|
+
<button type="button" class="lynx-tab-btn" onclick="openLynxTab(event, 'lynx_tab_multilang')" style="background:#f1f5f9;color:#475569;border:0;padding:6px 16px;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;">🌐 Hreflangs & Langues</button>
|
|
197
298
|
<button type="button" class="lynx-tab-btn" onclick="openLynxTab(event, 'lynx_tab_schema')" style="background:#f1f5f9;color:#475569;border:0;padding:6px 16px;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;">14+ Schémas Schema.org</button>
|
|
198
299
|
<button type="button" class="lynx-tab-btn" onclick="openLynxTab(event, 'lynx_tab_shortcodes')" style="background:#f1f5f9;color:#475569;border:0;padding:6px 16px;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;">50 Shortcodes</button>
|
|
199
300
|
</div>
|
|
@@ -239,6 +340,21 @@ class LynxSeoUltimateEnterprisePlugin {
|
|
|
239
340
|
</div>
|
|
240
341
|
</div>
|
|
241
342
|
|
|
343
|
+
<!-- Tab: Multilingual & Hreflang Details -->
|
|
344
|
+
<div id="lynx_tab_multilang" class="lynx-tab-content" style="display:none;">
|
|
345
|
+
<div style="background:#f0f9ff;border:1px solid #bae6fd;border-radius:8px;padding:16px;margin-bottom:16px;">
|
|
346
|
+
<h4 style="margin:0 0 6px;color:#0369a1;font-size:14px;">🌐 Plugin Multilingue Détecté : <?php echo esc_html($env['plugin_name']); ?></h4>
|
|
347
|
+
<p style="font-size:12px;color:#0c4a6e;margin:0;"><?php echo esc_html($env['details']); ?></p>
|
|
348
|
+
</div>
|
|
349
|
+
<label style="display:block;font-weight:600;font-size:13px;margin-bottom:8px;">Balises Hreflang automatiques injectées :</label>
|
|
350
|
+
<div style="background:#0f172a;color:#38bdf8;padding:12px;border-radius:6px;font-family:monospace;font-size:11px;line-height:1.6;">
|
|
351
|
+
<?php foreach ($env['active_languages'] as $l): ?>
|
|
352
|
+
<link rel="alternate" hreflang="<?php echo esc_html($l); ?>" href="<?php echo esc_url(get_site_url() . '/' . $l . '/' . $post->post_name); ?>" /><br>
|
|
353
|
+
<?php endforeach; ?>
|
|
354
|
+
<link rel="alternate" hreflang="x-default" href="<?php echo esc_url(get_permalink($post->ID)); ?>" />
|
|
355
|
+
</div>
|
|
356
|
+
</div>
|
|
357
|
+
|
|
242
358
|
<!-- Tab 3: Schema.org -->
|
|
243
359
|
<div id="lynx_tab_schema" class="lynx-tab-content" style="display:none;">
|
|
244
360
|
<div style="margin-bottom:16px;">
|
|
@@ -597,6 +713,7 @@ class LynxSeoUltimateEnterprisePlugin {
|
|
|
597
713
|
public function register_admin_menus() {
|
|
598
714
|
add_menu_page('LynxSEO Studio', 'LynxSEO Studio', 'manage_options', 'lynxseo-dashboard', array($this, 'render_admin_view'), 'dashicons-chart-area', 90);
|
|
599
715
|
add_submenu_page('lynxseo-dashboard', 'Tableau de Bord & API', 'Tableau de Bord & API', 'manage_options', 'lynxseo-dashboard', array($this, 'render_admin_view'));
|
|
716
|
+
add_submenu_page('lynxseo-dashboard', '🌐 Langues & Multilingue', '🌐 Langues & Multilingue', 'manage_options', 'lynxseo-languages', array($this, 'render_languages_view'));
|
|
600
717
|
add_submenu_page('lynxseo-dashboard', '⚡ Matrices Custom & Aperçu', '⚡ Matrices Custom', 'manage_options', 'lynxseo-custom-matrices', array($this, 'render_matrices_builder_view'));
|
|
601
718
|
add_submenu_page('lynxseo-dashboard', '📊 Analytics & Graphiques', '📊 Analytics & Graphiques', 'manage_options', 'lynxseo-analytics', array($this, 'render_analytics_view'));
|
|
602
719
|
add_submenu_page('lynxseo-dashboard', '🔍 Audit du Site (70 Tests)', '🔍 Audit du Site', 'manage_options', 'lynxseo-audit', array($this, 'render_audit_view'));
|
|
@@ -611,8 +728,49 @@ class LynxSeoUltimateEnterprisePlugin {
|
|
|
611
728
|
register_setting('lynxseo_matrix_group', $this->matrix_option);
|
|
612
729
|
}
|
|
613
730
|
|
|
731
|
+
public function render_languages_view() {
|
|
732
|
+
$env = $this->detect_multilingual_environment();
|
|
733
|
+
?>
|
|
734
|
+
<div class="wrap" style="max-width:1100px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
|
|
735
|
+
<div style="background:#fff;border:1px solid #e2e8f0;border-radius:16px;padding:32px;margin-top:20px;box-shadow:0 4px 6px -1px rgba(0,0,0,0.05);">
|
|
736
|
+
<div style="display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;padding-bottom:20px;margin-bottom:24px;">
|
|
737
|
+
<div>
|
|
738
|
+
<h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0;">🌐 Détection Automatique des Plugins de Langue & Hreflangs</h1>
|
|
739
|
+
<p style="color:#64748b;font-size:13px;margin:4px 0 0;">Synchronisation automatique avec WPML, Polylang, TranslatePress, Weglot et MultilingualPress.</p>
|
|
740
|
+
</div>
|
|
741
|
+
<span style="background:<?php echo $env['has_multilingual'] ? '#dcfce7' : '#eff6ff'; ?>;color:<?php echo $env['has_multilingual'] ? '#166534' : '#2563eb'; ?>;font-weight:700;font-size:12px;padding:6px 14px;border-radius:999px;">
|
|
742
|
+
<?php echo esc_html($env['plugin_name']); ?>
|
|
743
|
+
</span>
|
|
744
|
+
</div>
|
|
745
|
+
|
|
746
|
+
<div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:20px;margin-bottom:24px;">
|
|
747
|
+
<h3 style="margin:0 0 8px;font-size:16px;color:#0f172a;">Statut de l'environnement de langue :</h3>
|
|
748
|
+
<p style="font-size:13px;color:#475569;margin:0 0 12px;"><?php echo esc_html($env['details']); ?></p>
|
|
749
|
+
<div style="display:flex;align-items:center;gap:8px;">
|
|
750
|
+
<span style="font-size:13px;font-weight:600;">Langues Actives Détectées :</span>
|
|
751
|
+
<?php foreach ($env['active_languages'] as $l): ?>
|
|
752
|
+
<span style="background:#2563eb;color:#fff;font-size:11px;font-weight:bold;padding:2px 8px;border-radius:4px;"><?php echo strtoupper(esc_html($l)); ?></span>
|
|
753
|
+
<?php endforeach; ?>
|
|
754
|
+
</div>
|
|
755
|
+
</div>
|
|
756
|
+
|
|
757
|
+
<h3 style="font-size:16px;color:#0f172a;margin-top:0;">🤖 Balises Hreflangs générées dynamiquement dans <code><head></code> :</h3>
|
|
758
|
+
<p style="font-size:13px;color:#64748b;margin-bottom:12px;">Ces balises garantissent l'indexation internationale sur Google pour chaque version linguistique :</p>
|
|
759
|
+
<div style="background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;font-family:monospace;font-size:12px;line-height:1.6;">
|
|
760
|
+
<!-- LynxSEO Studio Auto-Hreflang Engine --><br>
|
|
761
|
+
<?php foreach ($env['active_languages'] as $l): ?>
|
|
762
|
+
<link rel="alternate" hreflang="<?php echo esc_html($l); ?>" href="<?php echo esc_url(get_site_url() . '/' . $l . '/...'); ?>" /><br>
|
|
763
|
+
<?php endforeach; ?>
|
|
764
|
+
<link rel="alternate" hreflang="x-default" href="<?php echo esc_url(get_site_url() . '/...'); ?>" />
|
|
765
|
+
</div>
|
|
766
|
+
</div>
|
|
767
|
+
</div>
|
|
768
|
+
<?php
|
|
769
|
+
}
|
|
770
|
+
|
|
614
771
|
public function render_admin_view() {
|
|
615
772
|
$s = get_option($this->option_name, array());
|
|
773
|
+
$env = $this->detect_multilingual_environment();
|
|
616
774
|
?>
|
|
617
775
|
<div class="wrap" style="max-width:1100px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
|
|
618
776
|
<div style="background:#fff;border:1px solid #e2e8f0;border-radius:16px;padding:32px;margin-top:20px;box-shadow:0 4px 6px -1px rgba(0,0,0,0.05);">
|
|
@@ -640,6 +798,15 @@ class LynxSeoUltimateEnterprisePlugin {
|
|
|
640
798
|
<th scope="row">Nom de la Marque</th>
|
|
641
799
|
<td><input type="text" name="<?php echo $this->option_name; ?>[brand_name]" value="<?php echo esc_attr($s['brand_name'] ?: get_bloginfo('name')); ?>" class="regular-text" /></td>
|
|
642
800
|
</tr>
|
|
801
|
+
<tr>
|
|
802
|
+
<th scope="row">Environnement Multilingue</th>
|
|
803
|
+
<td>
|
|
804
|
+
<span style="font-weight:bold;color:#0369a1;background:#e0f2fe;padding:3px 10px;border-radius:6px;font-size:12px;">
|
|
805
|
+
<?php echo esc_html($env['plugin_name']); ?> Détecté
|
|
806
|
+
</span>
|
|
807
|
+
<p class="description">Balises hreflang automatiquement injectées pour : <?php echo esc_html(implode(', ', array_map('strtoupper', $env['active_languages']))); ?>.</p>
|
|
808
|
+
</td>
|
|
809
|
+
</tr>
|
|
643
810
|
<tr>
|
|
644
811
|
<th scope="row">Optimisation Image SEO</th>
|
|
645
812
|
<td>
|
|
@@ -896,6 +1063,13 @@ class LynxSeoUltimateEnterprisePlugin {
|
|
|
896
1063
|
</div>
|
|
897
1064
|
<p style="font-size:12px;color:#64748b;margin:0;">Flux structuré pour ChatGPT Search, Perplexity et Claude.</p>
|
|
898
1065
|
</div>
|
|
1066
|
+
<div style="border:1px solid #e2e8f0;border-radius:12px;padding:20px;background:#f8fafc;">
|
|
1067
|
+
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;">
|
|
1068
|
+
<strong>🌐 Multilingue & Hreflangs</strong>
|
|
1069
|
+
<span style="background:#dcfce7;color:#166534;font-size:11px;font-weight:bold;padding:2px 8px;border-radius:999px;">Actif</span>
|
|
1070
|
+
</div>
|
|
1071
|
+
<p style="font-size:12px;color:#64748b;margin:0;">Détection automatique de WPML, Polylang, TranslatePress et Weglot.</p>
|
|
1072
|
+
</div>
|
|
899
1073
|
<div style="border:1px solid #e2e8f0;border-radius:12px;padding:20px;background:#f8fafc;">
|
|
900
1074
|
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;">
|
|
901
1075
|
<strong>🖼️ Image SEO Auto-Alt</strong>
|
|
Binary file
|