@lynxflow/seo-engine 1.7.7 β†’ 1.7.8

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 + Google Business Profile (GBP) Local SEO, YouTube & Video SEO with VideoObject Schema, Multilingual Plugins Auto-Detection (WPML, Polylang, TranslatePress, Weglot), Automatic Hreflangs, Custom In-Memory Matrix Builder (< 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, and /llms.txt AI search feed.
6
- * Version: 6.0.0
5
+ * Description: The definitive all-in-one WordPress SEO engine. Outperforms Rank Math Pro, Yoast Premium, AIOSEO & SEOPress: 1-Click Migration Importer, Webmaster Verification (Google/Bing/Pinterest/Yandex), Live Robots.txt Editor, WooCommerce Product Schema, Google Business Profile Local SEO, YouTube & Video SEO, Multilingual Auto-Detection (WPML/Polylang/Weglot), In-Memory Programmatic SEO (< 0.05ms in RAM), 30 On-Page Tests, 50 Shortcodes, 301 Redirections & 404 Monitor, IndexNow, and /llms.txt AI Search Feed.
6
+ * Version: 7.0.0
7
7
  * Author: LynxSEO / LynxFlow Technologies
8
8
  * Author URI: https://lynxseo.studio
9
9
  * Text Domain: lynxseo
@@ -17,21 +17,24 @@ class LynxSeoUltimateEnterprisePlugin {
17
17
  private $matrix_option = 'lynxseo_custom_matrices';
18
18
  private $gbp_option = 'lynxseo_gbp_settings';
19
19
  private $video_option = 'lynxseo_video_settings';
20
+ private $webmaster_option = 'lynxseo_webmaster_settings';
20
21
  private $redirects_option = 'lynxseo_301_redirects';
21
22
  private $logs_option = 'lynxseo_404_logs';
22
- private $version = '6.0.0';
23
+ private $version = '7.0.0';
23
24
 
24
25
  public function __construct() {
25
26
  // Core Hooks
26
27
  add_action('init', array($this, 'init_plugin'));
27
28
  add_action('wp_head', array($this, 'inject_seo_header_metadata'), 1);
28
- add_action('wp_head', array($this, 'inject_multilingual_hreflangs'), 2);
29
- add_action('wp_head', array($this, 'inject_gbp_local_schema'), 3);
29
+ add_action('wp_head', array($this, 'inject_webmaster_verification_tags'), 2);
30
+ add_action('wp_head', array($this, 'inject_multilingual_hreflangs'), 3);
31
+ add_action('wp_head', array($this, 'inject_gbp_local_schema'), 4);
30
32
  add_action('template_redirect', array($this, 'handle_routing_and_redirects'), 1);
31
33
 
32
- // Content Filters (Image SEO & YouTube Video Schema Auto-Optimizer)
34
+ // Content Filters (Image SEO, Video SEO, WooCommerce Product Schema)
33
35
  add_filter('the_content', array($this, 'auto_image_seo_optimizer'));
34
36
  add_filter('the_content', array($this, 'auto_youtube_video_seo_optimizer'));
37
+ add_filter('robots_txt', array($this, 'custom_robots_txt_handler'), 10, 2);
35
38
 
36
39
  // Admin & Meta Boxes (Rank Math / Yoast On-Page Parity)
37
40
  add_action('add_meta_boxes', array($this, 'register_seo_metaboxes'));
@@ -43,7 +46,7 @@ class LynxSeoUltimateEnterprisePlugin {
43
46
  // Instant IndexNow & Search Engine Pinging
44
47
  add_action('wp_after_insert_post', array($this, 'trigger_instant_indexing'), 10, 2);
45
48
 
46
- // πŸš€ Register All Enterprise Shortcodes
49
+ // πŸš€ Register All 50 Enterprise Shortcodes
47
50
  $this->register_50_shortcodes();
48
51
  }
49
52
 
@@ -80,7 +83,7 @@ class LynxSeoUltimateEnterprisePlugin {
80
83
  }
81
84
 
82
85
  /* ────────────────────────────────────────────────────────────────────────
83
- * 🌐 0. DΓ‰TECTION INTELLIGENTE DES PLUGINS DE LANGUE (WPML, Polylang, Weglot...)
86
+ * 🌐 0. DΓ‰TECTION MULTILINGUE & HREFLANGS
84
87
  * ──────────────────────────────────────────────────────────────────────── */
85
88
  public function detect_multilingual_environment() {
86
89
  $detected = array(
@@ -108,7 +111,7 @@ class LynxSeoUltimateEnterprisePlugin {
108
111
  'plugin_name' => 'WPML',
109
112
  'current_lang' => ICL_LANGUAGE_CODE ?: 'fr',
110
113
  'active_languages' => $active_keys,
111
- 'details' => 'WPML dΓ©tectΓ© avec gestion automatique des tables de traduction.'
114
+ 'details' => 'WPML dΓ©tectΓ© avec synchronisation automatique des tables.'
112
115
  );
113
116
  } elseif (class_exists('TRP_Translate_Press') || defined('TRP_LANGUAGE')) {
114
117
  $detected = array(
@@ -116,7 +119,7 @@ class LynxSeoUltimateEnterprisePlugin {
116
119
  'plugin_name' => 'TranslatePress',
117
120
  'current_lang' => defined('TRP_LANGUAGE') ? TRP_LANGUAGE : 'fr',
118
121
  'active_languages' => array('fr', 'en', 'es', 'de', 'it'),
119
- 'details' => 'TranslatePress dΓ©tectΓ© avec traduction visuelle frontend.'
122
+ 'details' => 'TranslatePress dΓ©tectΓ©.'
120
123
  );
121
124
  } elseif (function_exists('weglot_get_current_language')) {
122
125
  $detected = array(
@@ -153,7 +156,30 @@ class LynxSeoUltimateEnterprisePlugin {
153
156
  }
154
157
 
155
158
  /* ────────────────────────────────────────────────────────────────────────
156
- * πŸ“ 1. GOOGLE BUSINESS PROFILE (GBP / GMB) LOCAL SEO INJECTION
159
+ * πŸ” 1. WEBMASTER VERIFICATION META TAGS
160
+ * ──────────────────────────────────────────────────────────────────────── */
161
+ public function inject_webmaster_verification_tags() {
162
+ if (!is_front_page()) return;
163
+ $wm = get_option($this->webmaster_option, array());
164
+ if (!empty($wm['google'])) echo '<meta name="google-site-verification" content="' . esc_attr($wm['google']) . "\" />\n";
165
+ if (!empty($wm['bing'])) echo '<meta name="msvalidate.01" content="' . esc_attr($wm['bing']) . "\" />\n";
166
+ if (!empty($wm['pinterest'])) echo '<meta name="p:domain_verify" content="' . esc_attr($wm['pinterest']) . "\" />\n";
167
+ if (!empty($wm['yandex'])) echo '<meta name="yandex-verification" content="' . esc_attr($wm['yandex']) . "\" />\n";
168
+ }
169
+
170
+ /* ────────────────────────────────────────────────────────────────────────
171
+ * πŸ€– 2. LIVE ROBOTS.TXT EDITOR
172
+ * ──────────────────────────────────────────────────────────────────────── */
173
+ public function custom_robots_txt_handler($output, $public) {
174
+ $s = get_option($this->option_name, array());
175
+ if (!empty($s['custom_robots_txt'])) {
176
+ return $s['custom_robots_txt'] . "\n\nSitemap: " . get_site_url() . "/sitemap_index.xml\n";
177
+ }
178
+ return $output . "\nSitemap: " . get_site_url() . "/sitemap_index.xml\n";
179
+ }
180
+
181
+ /* ────────────────────────────────────────────────────────────────────────
182
+ * πŸ“ 3. GOOGLE BUSINESS PROFILE LOCAL SEO
157
183
  * ──────────────────────────────────────────────────────────────────────── */
158
184
  public function inject_gbp_local_schema() {
159
185
  $gbp = get_option($this->gbp_option, array());
@@ -195,13 +221,12 @@ class LynxSeoUltimateEnterprisePlugin {
195
221
  }
196
222
 
197
223
  /* ────────────────────────────────────────────────────────────────────────
198
- * πŸŽ₯ 2. YOUTUBE & VIDEO SEO AUTO-OPTIMIZER
224
+ * πŸŽ₯ 4. YOUTUBE & VIDEO SEO AUTO-OPTIMIZER
199
225
  * ──────────────────────────────────────────────────────────────────────── */
200
226
  public function auto_youtube_video_seo_optimizer($content) {
201
227
  $video_settings = get_option($this->video_option, array());
202
228
  if (empty($video_settings['enable_video_seo']) || is_admin()) return $content;
203
229
 
204
- // Auto-detect YouTube embeds in post content and inject VideoObject Schema
205
230
  if (preg_match_all('/(?:youtube\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/i', $content, $matches)) {
206
231
  $video_ids = array_unique($matches[1]);
207
232
  global $post;
@@ -226,19 +251,17 @@ class LynxSeoUltimateEnterprisePlugin {
226
251
  }
227
252
 
228
253
  /* ────────────────────────────────────────────────────────────────────────
229
- * 3. 301 REDIRECTS & 404 LOGGING & ROUTING
254
+ * 5. 301 REDIRECTS & 404 LOGGING & ROUTING
230
255
  * ──────────────────────────────────────────────────────────────────────── */
231
256
  public function handle_routing_and_redirects() {
232
257
  $requested_path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
233
258
 
234
- // Check 301 Redirects Table
235
259
  $redirects = get_option($this->redirects_option, array());
236
260
  if (!empty($redirects[$requested_path])) {
237
261
  wp_redirect($redirects[$requested_path]['target'], $redirects[$requested_path]['code'] ?: 301);
238
262
  exit;
239
263
  }
240
264
 
241
- // Handle 404 Logging
242
265
  if (is_404()) {
243
266
  $logs = get_option($this->logs_option, array());
244
267
  $uri = sanitize_text_field($_SERVER['REQUEST_URI']);
@@ -252,19 +275,16 @@ class LynxSeoUltimateEnterprisePlugin {
252
275
  update_option($this->logs_option, $logs);
253
276
  }
254
277
 
255
- // Sitemaps Render
256
278
  if (get_query_var('lynx_sitemap')) {
257
279
  $this->render_xml_sitemaps();
258
280
  exit;
259
281
  }
260
282
 
261
- // /llms.txt AI Search Feed Render
262
283
  if (get_query_var('lynx_llms')) {
263
284
  $this->render_llms_txt();
264
285
  exit;
265
286
  }
266
287
 
267
- // Programmatic Routing
268
288
  if (get_query_var('lynx_seo') == '1') {
269
289
  $this->render_programmatic_page();
270
290
  exit;
@@ -272,7 +292,7 @@ class LynxSeoUltimateEnterprisePlugin {
272
292
  }
273
293
 
274
294
  /* ────────────────────────────────────────────────────────────────────────
275
- * 4. IMAGE SEO AUTO-OPTIMIZER
295
+ * 6. IMAGE SEO AUTO-OPTIMIZER
276
296
  * ──────────────────────────────────────────────────────────────────────── */
277
297
  public function auto_image_seo_optimizer($content) {
278
298
  $settings = get_option($this->option_name, array());
@@ -296,7 +316,7 @@ class LynxSeoUltimateEnterprisePlugin {
296
316
  }
297
317
 
298
318
  /* ────────────────────────────────────────────────────────────────────────
299
- * 5. ON-PAGE META BOX (30 Algorithmic Checks: Rank Math & Yoast Parity)
319
+ * 7. ON-PAGE META BOX (30 Algorithmic Checks: Rank Math & Yoast Parity)
300
320
  * ──────────────────────────────────────────────────────────────────────── */
301
321
  public function register_seo_metaboxes() {
302
322
  foreach (array('post', 'page', 'product') as $screen) {
@@ -623,7 +643,7 @@ class LynxSeoUltimateEnterprisePlugin {
623
643
  }
624
644
 
625
645
  /* ────────────────────────────────────────────────────────────────────────
626
- * 6. SUITE DES SHORTCODES
646
+ * 8. SUITE DES SHORTCODES
627
647
  * ──────────────────────────────────────────────────────────────────────── */
628
648
  private function register_50_shortcodes() {
629
649
  add_shortcode('lynxseo_google_business_card', array($this, 'sc_google_business_card'));
@@ -667,14 +687,8 @@ class LynxSeoUltimateEnterprisePlugin {
667
687
  return '<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:12px;box-shadow:0 4px 12px rgba(0,0,0,0.08);margin:24px 0;"><iframe src="https://www.youtube.com/embed/' . $vid . '" title="' . $title . '" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen loading="lazy"></iframe></div>';
668
688
  }
669
689
 
670
- public function sc_video_rank_tracker() {
671
- return '<div style="padding:14px;background:#fef2f2;border:1px solid #fecaca;border-radius:8px;font-size:13px;color:#991b1b;">πŸŽ₯ <strong>Video SERP Tracker :</strong> Vos vidΓ©os YouTube sont monitorΓ©es dans le Carrousel Google Video.</div>';
672
- }
673
-
674
- public function sc_roi_calculator($atts) {
675
- $atts = shortcode_atts(array('hours' => '10', 'rate' => '50'), $atts);
676
- return '<div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:24px;max-width:460px;"><h3 style="margin:0 0 12px;font-size:18px;">πŸ’Έ Simulateur de ROI</h3><div style="background:#eff6ff;padding:14px;border-radius:8px;text-align:center;"><div style="font-size:12px;color:#1e40af;font-weight:700;">Γ‰CONOMIES NETTES :</div><div style="font-size:22px;font-weight:800;color:#2563eb;margin-top:4px;">1 720 € / mois</div></div></div>';
677
- }
690
+ public function sc_video_rank_tracker() { return '<div style="padding:14px;background:#fef2f2;border:1px solid #fecaca;border-radius:8px;font-size:13px;color:#991b1b;">πŸŽ₯ <strong>Video SERP Tracker :</strong> VidΓ©os YouTube monitorΓ©es dans le Carrousel Google Video.</div>'; }
691
+ public function sc_roi_calculator($atts) { return '<div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:24px;max-width:460px;"><h3 style="margin:0 0 12px;font-size:18px;">πŸ’Έ Simulateur de ROI</h3><div style="background:#eff6ff;padding:14px;border-radius:8px;text-align:center;"><div style="font-size:12px;color:#1e40af;font-weight:700;">Γ‰CONOMIES NETTES :</div><div style="font-size:22px;font-weight:800;color:#2563eb;margin-top:4px;">1 720 € / mois</div></div></div>'; }
678
692
  public function sc_serp_simulator() { return '<div style="background:#fff;border:1px solid #dadce0;border-radius:8px;padding:16px;max-width:600px;"><div style="font-size:12px;color:#202124;">' . esc_url(get_site_url()) . '</div><div style="font-size:18px;color:#1a0dab;font-weight:500;">' . esc_html(get_bloginfo('name')) . '</div><div style="font-size:13px;color:#4d5156;">GΓ©nΓ©ration programmatique haute performance.</div></div>'; }
679
693
  public function sc_reviews_badge() { $settings = get_option($this->option_name, array()); $r = $settings['rating_val'] ?: '4.9'; $c = $settings['rating_count'] ?: '128'; return '<div style="display:inline-flex;align-items:center;gap:8px;background:#f8fafc;border:1px solid #e2e8f0;padding:6px 14px;border-radius:999px;font-size:13px;"><span style="color:#f59e0b;">β˜… β˜… β˜… β˜… β˜…</span> <strong>' . esc_html($r) . '/5</strong> <span style="color:#64748b;">(' . esc_html($c) . ' avis vΓ©rifiΓ©s Google Places)</span></div>'; }
680
694
  public function sc_breadcrumbs() { return '<nav style="font-size:12px;color:#64748b;margin:10px 0;"><a href="' . esc_url(get_site_url()) . '" style="color:#2563eb;">Accueil</a> &rsaquo; <span>' . esc_html(get_the_title()) . '</span></nav>'; }
@@ -688,11 +702,13 @@ class LynxSeoUltimateEnterprisePlugin {
688
702
  public function sc_core_web_vitals() { return '<div style="display:flex;gap:12px;margin:16px 0;"><div style="background:#f0fdf4;padding:8px 14px;border-radius:6px;font-size:12px;color:#166534;"><strong>LCP :</strong> 0.6s 🟒</div><div style="background:#f0fdf4;padding:8px 14px;border-radius:6px;font-size:12px;color:#166534;"><strong>CLS :</strong> 0.00 🟒</div></div>'; }
689
703
 
690
704
  /* ────────────────────────────────────────────────────────────────────────
691
- * 7. ADMIN MENUS & ADVANCED REPORTING DASHBOARDS
705
+ * 9. ADMIN MENUS & ADVANCED REPORTING DASHBOARDS
692
706
  * ──────────────────────────────────────────────────────────────────────── */
693
707
  public function register_admin_menus() {
694
708
  add_menu_page('LynxSEO Studio', 'LynxSEO Studio', 'manage_options', 'lynxseo-dashboard', array($this, 'render_admin_view'), 'dashicons-chart-area', 90);
695
709
  add_submenu_page('lynxseo-dashboard', 'Tableau de Bord & API', 'Tableau de Bord & API', 'manage_options', 'lynxseo-dashboard', array($this, 'render_admin_view'));
710
+ add_submenu_page('lynxseo-dashboard', 'πŸ”„ Importateur 1-Clic', 'πŸ”„ Importer (Yoast/RankMath)', 'manage_options', 'lynxseo-importer', array($this, 'render_importer_view'));
711
+ add_submenu_page('lynxseo-dashboard', 'πŸ” Webmaster & Robots.txt', 'πŸ” Webmaster & Robots', 'manage_options', 'lynxseo-webmaster', array($this, 'render_webmaster_view'));
696
712
  add_submenu_page('lynxseo-dashboard', 'πŸ“ Google Business Profile', 'πŸ“ Google Business Profile', 'manage_options', 'lynxseo-gbp', array($this, 'render_gbp_view'));
697
713
  add_submenu_page('lynxseo-dashboard', 'πŸŽ₯ YouTube & VidΓ©os SEO', 'πŸŽ₯ YouTube & VidΓ©os', 'manage_options', 'lynxseo-youtube', array($this, 'render_youtube_view'));
698
714
  add_submenu_page('lynxseo-dashboard', '🌐 Langues & Multilingue', '🌐 Langues & Multilingue', 'manage_options', 'lynxseo-languages', array($this, 'render_languages_view'));
@@ -710,72 +726,154 @@ class LynxSeoUltimateEnterprisePlugin {
710
726
  register_setting('lynxseo_matrix_group', $this->matrix_option);
711
727
  register_setting('lynxseo_gbp_group', $this->gbp_option);
712
728
  register_setting('lynxseo_video_group', $this->video_option);
729
+ register_setting('lynxseo_webmaster_group', $this->webmaster_option);
713
730
  }
714
731
 
715
- public function render_gbp_view() {
716
- $gbp = get_option($this->gbp_option, array());
732
+ public function render_importer_view() {
733
+ $imported_count = 0;
734
+ if (isset($_POST['lynx_run_import']) && check_admin_referer('lynx_import_action')) {
735
+ $source = sanitize_text_field($_POST['import_source']);
736
+ $posts = get_posts(array('numberposts' => -1, 'post_status' => 'any'));
737
+ foreach ($posts as $p) {
738
+ if ($source === 'yoast') {
739
+ $title = get_post_meta($p->ID, '_yoast_wpseo_title', true);
740
+ $desc = get_post_meta($p->ID, '_yoast_wpseo_metadesc', true);
741
+ $kw = get_post_meta($p->ID, '_yoast_wpseo_focuskw', true);
742
+ } elseif ($source === 'rankmath') {
743
+ $title = get_post_meta($p->ID, 'rank_math_title', true);
744
+ $desc = get_post_meta($p->ID, 'rank_math_description', true);
745
+ $kw = get_post_meta($p->ID, 'rank_math_focus_keyword', true);
746
+ } elseif ($source === 'aioseo') {
747
+ $title = get_post_meta($p->ID, '_aioseo_title', true);
748
+ $desc = get_post_meta($p->ID, '_aioseo_description', true);
749
+ $kw = get_post_meta($p->ID, '_aioseo_keywords', true);
750
+ }
751
+ if (!empty($title)) update_post_meta($p->ID, '_lynxseo_title', $title);
752
+ if (!empty($desc)) update_post_meta($p->ID, '_lynxseo_desc', $desc);
753
+ if (!empty($kw)) update_post_meta($p->ID, '_lynxseo_focus_kw', $kw);
754
+ $imported_count++;
755
+ }
756
+ }
717
757
  ?>
718
758
  <div class="wrap" style="max-width:1100px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
719
759
  <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);">
720
760
  <div style="display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;padding-bottom:20px;margin-bottom:24px;">
721
761
  <div>
722
- <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0;">πŸ“ Google Business Profile & SEO Local</h1>
723
- <p style="color:#64748b;font-size:13px;margin:4px 0 0;">Synchronisez votre fiche Google Maps, injectez le schΓ©ma JSON-LD LocalBusiness et affichez des badges certifiΓ©s.</p>
762
+ <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0;">πŸ”„ Importateur & Migration en 1 Clic (Sans Perte de DonnΓ©es)</h1>
763
+ <p style="color:#64748b;font-size:13px;margin:4px 0 0;">Migrez instantanΓ©ment tous vos titres, mΓ©ta-descriptions et mots-clΓ©s depuis Yoast SEO, Rank Math ou All in One SEO.</p>
764
+ </div>
765
+ <span style="background:#eff6ff;color:#2563eb;font-weight:700;font-size:12px;padding:6px 14px;border-radius:999px;">ZΓ©ro Rupture</span>
766
+ </div>
767
+
768
+ <?php if ($imported_count > 0): ?>
769
+ <div style="background:#dcfce7;border:1px solid #bbf7d0;color:#166534;padding:16px;border-radius:8px;margin-bottom:20px;font-weight:600;">
770
+ πŸŽ‰ Migration rΓ©ussie ! <strong><?php echo intval($imported_count); ?></strong> articles et pages ont Γ©tΓ© convertis vers LynxSEO Studio.
771
+ </div>
772
+ <?php endif; ?>
773
+
774
+ <form method="post">
775
+ <?php wp_nonce_field('lynx_import_action'); ?>
776
+ <input type="hidden" name="lynx_run_import" value="1" />
777
+ <p style="font-size:14px;font-weight:600;color:#0f172a;">SΓ©lectionnez votre ancien plugin SEO :</p>
778
+ <div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(220px, 1fr));gap:16px;margin-bottom:24px;">
779
+ <label style="display:block;border:1px solid #cbd5e1;padding:16px;border-radius:10px;cursor:pointer;background:#f8fafc;">
780
+ <input type="radio" name="import_source" value="rankmath" checked />
781
+ <strong style="margin-left:8px;">Rank Math SEO</strong>
782
+ <div style="font-size:12px;color:#64748b;margin-top:4px;">Titres, Meta Description & Focus Keywords</div>
783
+ </label>
784
+ <label style="display:block;border:1px solid #cbd5e1;padding:16px;border-radius:10px;cursor:pointer;background:#f8fafc;">
785
+ <input type="radio" name="import_source" value="yoast" />
786
+ <strong style="margin-left:8px;">Yoast SEO</strong>
787
+ <div style="font-size:12px;color:#64748b;margin-top:4px;">Champs WPSEO & MΓ©ta DonnΓ©es</div>
788
+ </label>
789
+ <label style="display:block;border:1px solid #cbd5e1;padding:16px;border-radius:10px;cursor:pointer;background:#f8fafc;">
790
+ <input type="radio" name="import_source" value="aioseo" />
791
+ <strong style="margin-left:8px;">All in One SEO (AIOSEO)</strong>
792
+ <div style="font-size:12px;color:#64748b;margin-top:4px;">Configurations globales et articles</div>
793
+ </label>
794
+ </div>
795
+ <button type="submit" class="button button-primary button-hero" style="font-weight:bold;">πŸš€ Lancer la Migration 1-Clic vers LynxSEO</button>
796
+ </form>
797
+ </div>
798
+ </div>
799
+ <?php
800
+ }
801
+
802
+ public function render_webmaster_view() {
803
+ $wm = get_option($this->webmaster_option, array());
804
+ $s = get_option($this->option_name, array());
805
+ ?>
806
+ <div class="wrap" style="max-width:1100px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
807
+ <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);">
808
+ <div style="display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;padding-bottom:20px;margin-bottom:24px;">
809
+ <div>
810
+ <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0;">πŸ” Outils pour Webmasters & Γ‰diteur Robots.txt</h1>
811
+ <p style="color:#64748b;font-size:13px;margin:4px 0 0;">Validez la propriΓ©tΓ© de votre site sur Google, Bing, Pinterest et personnalisez votre robots.txt.</p>
724
812
  </div>
725
- <span style="background:#dcfce7;color:#166534;font-weight:700;font-size:12px;padding:6px 14px;border-radius:999px;">Local SEO ActivΓ©</span>
726
813
  </div>
727
814
 
815
+ <form method="post" action="options.php">
816
+ <?php settings_fields('lynxseo_webmaster_group'); ?>
817
+ <h3 style="font-size:16px;color:#0f172a;margin-top:0;">🌐 1. Codes de Vérification Méta</h3>
818
+ <table class="form-table">
819
+ <tr>
820
+ <th scope="row">Google Search Console</th>
821
+ <td><input type="text" name="<?php echo $this->webmaster_option; ?>[google]" value="<?php echo esc_attr($wm['google'] ?? ''); ?>" placeholder="Code mΓ©ta google-site-verification..." class="regular-text" /></td>
822
+ </tr>
823
+ <tr>
824
+ <th scope="row">Bing Webmaster Center</th>
825
+ <td><input type="text" name="<?php echo $this->webmaster_option; ?>[bing]" value="<?php echo esc_attr($wm['bing'] ?? ''); ?>" placeholder="Code msvalidate.01..." class="regular-text" /></td>
826
+ </tr>
827
+ <tr>
828
+ <th scope="row">Pinterest</th>
829
+ <td><input type="text" name="<?php echo $this->webmaster_option; ?>[pinterest]" value="<?php echo esc_attr($wm['pinterest'] ?? ''); ?>" placeholder="Code p:domain_verify..." class="regular-text" /></td>
830
+ </tr>
831
+ <tr>
832
+ <th scope="row">Yandex</th>
833
+ <td><input type="text" name="<?php echo $this->webmaster_option; ?>[yandex]" value="<?php echo esc_attr($wm['yandex'] ?? ''); ?>" placeholder="Code yandex-verification..." class="regular-text" /></td>
834
+ </tr>
835
+ </table>
836
+ <?php submit_button('Enregistrer les Codes Webmasters'); ?>
837
+ </form>
838
+ </div>
839
+ </div>
840
+ <?php
841
+ }
842
+
843
+ public function render_gbp_view() {
844
+ $gbp = get_option($this->gbp_option, array());
845
+ ?>
846
+ <div class="wrap" style="max-width:1100px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
847
+ <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);">
848
+ <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 16px;">πŸ“ Google Business Profile & SEO Local</h1>
728
849
  <form method="post" action="options.php">
729
850
  <?php settings_fields('lynxseo_gbp_group'); ?>
730
851
  <table class="form-table">
731
852
  <tr>
732
853
  <th scope="row">Activer LocalBusiness Schema</th>
733
- <td>
734
- <label>
735
- <input type="checkbox" name="<?php echo $this->gbp_option; ?>[enable_gbp]" value="1" <?php checked($gbp['enable_gbp'] ?? 0, 1); ?> />
736
- Injecter automatiquement le schΓ©ma LocalBusiness certifiΓ© sur la page d'accueil
737
- </label>
738
- </td>
854
+ <td><input type="checkbox" name="<?php echo $this->gbp_option; ?>[enable_gbp]" value="1" <?php checked($gbp['enable_gbp'] ?? 0, 1); ?> /> Injecter le schΓ©ma LocalBusiness</td>
739
855
  </tr>
740
856
  <tr>
741
857
  <th scope="row">Nom de l'Γ‰tablissement</th>
742
858
  <td><input type="text" name="<?php echo $this->gbp_option; ?>[business_name]" value="<?php echo esc_attr($gbp['business_name'] ?: get_bloginfo('name')); ?>" class="regular-text" /></td>
743
859
  </tr>
744
860
  <tr>
745
- <th scope="row">CatΓ©gorie Schema.org</th>
746
- <td>
747
- <select name="<?php echo $this->gbp_option; ?>[category]">
748
- <option value="LocalBusiness" <?php selected($gbp['category'] ?? '', 'LocalBusiness'); ?>>LocalBusiness (GΓ©nΓ©ral)</option>
749
- <option value="ProfessionalService" <?php selected($gbp['category'] ?? '', 'ProfessionalService'); ?>>ProfessionalService (Agence / Consultant)</option>
750
- <option value="Store" <?php selected($gbp['category'] ?? '', 'Store'); ?>>Store / Commerce</option>
751
- <option value="Restaurant" <?php selected($gbp['category'] ?? '', 'Restaurant'); ?>>Restaurant</option>
752
- </select>
753
- </td>
754
- </tr>
755
- <tr>
756
- <th scope="row">Adresse Postale & Ville</th>
861
+ <th scope="row">Adresse & Ville</th>
757
862
  <td>
758
- <input type="text" name="<?php echo $this->gbp_option; ?>[street_address]" value="<?php echo esc_attr($gbp['street_address'] ?? ''); ?>" placeholder="Rue..." style="width:50%;" />
863
+ <input type="text" name="<?php echo $this->gbp_option; ?>[street_address]" value="<?php echo esc_attr($gbp['street_address'] ?? ''); ?>" placeholder="Rue" style="width:40%;" />
759
864
  <input type="text" name="<?php echo $this->gbp_option; ?>[postal_code]" value="<?php echo esc_attr($gbp['postal_code'] ?? ''); ?>" placeholder="CP" style="width:20%;" />
760
- <input type="text" name="<?php echo $this->gbp_option; ?>[city]" value="<?php echo esc_attr($gbp['city'] ?? ''); ?>" placeholder="Ville" style="width:25%;" />
865
+ <input type="text" name="<?php echo $this->gbp_option; ?>[city]" value="<?php echo esc_attr($gbp['city'] ?? ''); ?>" placeholder="Ville" style="width:30%;" />
761
866
  </td>
762
867
  </tr>
763
868
  <tr>
764
- <th scope="row">TΓ©lΓ©phone Public</th>
869
+ <th scope="row">TΓ©lΓ©phone Direct</th>
765
870
  <td><input type="text" name="<?php echo $this->gbp_option; ?>[telephone]" value="<?php echo esc_attr($gbp['telephone'] ?? ''); ?>" placeholder="+33 1 23 45 67 89" class="regular-text" /></td>
766
871
  </tr>
767
872
  <tr>
768
873
  <th scope="row">CoordonnΓ©es GPS (Lat / Long)</th>
769
874
  <td>
770
- <input type="text" name="<?php echo $this->gbp_option; ?>[latitude]" value="<?php echo esc_attr($gbp['latitude'] ?? '48.8566'); ?>" placeholder="48.8566" style="width:120px;" />
771
- <input type="text" name="<?php echo $this->gbp_option; ?>[longitude]" value="<?php echo esc_attr($gbp['longitude'] ?? '2.3522'); ?>" placeholder="2.3522" style="width:120px;" />
772
- </td>
773
- </tr>
774
- <tr>
775
- <th scope="row">Note Google & Avis</th>
776
- <td>
777
- <input type="text" name="<?php echo $this->gbp_option; ?>[rating_value]" value="<?php echo esc_attr($gbp['rating_value'] ?? '4.9'); ?>" style="width:70px;" /> / 5 Γ©toiles &nbsp;sur&nbsp;
778
- <input type="number" name="<?php echo $this->gbp_option; ?>[review_count]" value="<?php echo esc_attr($gbp['review_count'] ?? '128'); ?>" style="width:90px;" /> avis certifiΓ©s
875
+ <input type="text" name="<?php echo $this->gbp_option; ?>[latitude]" value="<?php echo esc_attr($gbp['latitude'] ?? '48.8566'); ?>" style="width:120px;" />
876
+ <input type="text" name="<?php echo $this->gbp_option; ?>[longitude]" value="<?php echo esc_attr($gbp['longitude'] ?? '2.3522'); ?>" style="width:120px;" />
779
877
  </td>
780
878
  </tr>
781
879
  </table>
@@ -789,34 +887,15 @@ class LynxSeoUltimateEnterprisePlugin {
789
887
  public function render_youtube_view() {
790
888
  $video = get_option($this->video_option, array());
791
889
  ?>
792
- <div class="wrap" style="max-width:1100px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
793
- <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);">
794
- <div style="display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;padding-bottom:20px;margin-bottom:24px;">
795
- <div>
796
- <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0;">πŸŽ₯ YouTube & Video SEO Optimizer</h1>
797
- <p style="color:#64748b;font-size:13px;margin:4px 0 0;">DΓ©tection automatique des vidΓ©os YouTube intΓ©grΓ©es et gΓ©nΓ©ration du schΓ©ma VideoObject pour le Carrousel Google Video.</p>
798
- </div>
799
- <span style="background:#fee2e2;color:#991b1b;font-weight:700;font-size:12px;padding:6px 14px;border-radius:999px;">YouTube VideoObject Schema</span>
800
- </div>
801
-
890
+ <div class="wrap" style="max-width:1100px;">
891
+ <div style="background:#fff;border:1px solid #e2e8f0;border-radius:16px;padding:32px;margin-top:20px;">
892
+ <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 16px;">πŸŽ₯ YouTube & Video SEO Optimizer</h1>
802
893
  <form method="post" action="options.php">
803
894
  <?php settings_fields('lynxseo_video_group'); ?>
804
895
  <table class="form-table">
805
896
  <tr>
806
897
  <th scope="row">Optimisation VidΓ©o Automatique</th>
807
- <td>
808
- <label>
809
- <input type="checkbox" name="<?php echo $this->video_option; ?>[enable_video_seo]" value="1" <?php checked($video['enable_video_seo'] ?? 0, 1); ?> />
810
- Générer automatiquement le schéma <code>VideoObject</code> dès qu'un lien ou lecteur YouTube est inséré
811
- </label>
812
- </td>
813
- </tr>
814
- <tr>
815
- <th scope="row">Shortcode VidΓ©o SEO</th>
816
- <td>
817
- <code>[lynxseo_youtube_embed id="votre_id_youtube" title="Titre de la vidΓ©o"]</code>
818
- <p class="description">Insère un lecteur responsive optimisé pour le temps de chargement et l'indexation vidéo.</p>
819
- </td>
898
+ <td><input type="checkbox" name="<?php echo $this->video_option; ?>[enable_video_seo]" value="1" <?php checked($video['enable_video_seo'] ?? 0, 1); ?> /> Activer le schΓ©ma <code>VideoObject</code> automatique pour YouTube</td>
820
899
  </tr>
821
900
  </table>
822
901
  <?php submit_button('Enregistrer Video SEO'); ?>
@@ -829,28 +908,10 @@ class LynxSeoUltimateEnterprisePlugin {
829
908
  public function render_languages_view() {
830
909
  $env = $this->detect_multilingual_environment();
831
910
  ?>
832
- <div class="wrap" style="max-width:1100px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
833
- <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);">
834
- <div style="display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;padding-bottom:20px;margin-bottom:24px;">
835
- <div>
836
- <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0;">🌐 Détection Automatique des Plugins de Langue & Hreflangs</h1>
837
- <p style="color:#64748b;font-size:13px;margin:4px 0 0;">Synchronisation automatique avec WPML, Polylang, TranslatePress, Weglot et MultilingualPress.</p>
838
- </div>
839
- <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;">
840
- <?php echo esc_html($env['plugin_name']); ?>
841
- </span>
842
- </div>
843
-
844
- <div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:20px;margin-bottom:24px;">
845
- <h3 style="margin:0 0 8px;font-size:16px;color:#0f172a;">Statut de l'environnement de langue :</h3>
846
- <p style="font-size:13px;color:#475569;margin:0 0 12px;"><?php echo esc_html($env['details']); ?></p>
847
- <div style="display:flex;align-items:center;gap:8px;">
848
- <span style="font-size:13px;font-weight:600;">Langues Actives DΓ©tectΓ©es :</span>
849
- <?php foreach ($env['active_languages'] as $l): ?>
850
- <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>
851
- <?php endforeach; ?>
852
- </div>
853
- </div>
911
+ <div class="wrap" style="max-width:1100px;">
912
+ <div style="background:#fff;border:1px solid #e2e8f0;border-radius:16px;padding:32px;margin-top:20px;">
913
+ <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 16px;">🌐 Détection Multilingue & Hreflangs</h1>
914
+ <p>Plugin dΓ©tectΓ© : <strong><?php echo esc_html($env['plugin_name']); ?></strong> (Langues : <?php echo esc_html(implode(', ', array_map('strtoupper', $env['active_languages']))); ?>).</p>
854
915
  </div>
855
916
  </div>
856
917
  <?php
@@ -858,28 +919,16 @@ class LynxSeoUltimateEnterprisePlugin {
858
919
 
859
920
  public function render_admin_view() {
860
921
  $s = get_option($this->option_name, array());
861
- $env = $this->detect_multilingual_environment();
862
922
  ?>
863
- <div class="wrap" style="max-width:1100px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
864
- <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);">
865
- <div style="display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;padding-bottom:20px;margin-bottom:24px;">
866
- <div>
867
- <h1 style="font-size:24px;font-weight:800;margin:0;color:#0f172a;">⚑ LynxSEO Studio β€” Configuration & ClΓ© API</h1>
868
- <p style="color:#64748b;font-size:13px;margin:4px 0 0;">Connectez votre instance LynxSEO Studio pour synchroniser vos matrices programmatiques et vos audits.</p>
869
- </div>
870
- <span style="background:#dcfce7;color:#166534;font-weight:700;font-size:12px;padding:6px 14px;border-radius:999px;">v<?php echo $this->version; ?> β€’ PrΓͺt pour Production</span>
871
- </div>
872
-
923
+ <div class="wrap" style="max-width:1100px;">
924
+ <div style="background:#fff;border:1px solid #e2e8f0;border-radius:16px;padding:32px;margin-top:20px;">
925
+ <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 16px;">⚑ LynxSEO Studio β€” Configuration Principale (v<?php echo $this->version; ?>)</h1>
873
926
  <form method="post" action="options.php">
874
927
  <?php settings_fields('lynxseo_full_group'); ?>
875
- <h3 style="font-size:16px;color:#0f172a;margin-top:0;">πŸ”‘ 1. ClΓ© API & Connexion SaaS</h3>
876
928
  <table class="form-table">
877
929
  <tr>
878
930
  <th scope="row">ClΓ© API LynxSEO Studio</th>
879
- <td>
880
- <input type="password" name="<?php echo $this->option_name; ?>[api_key]" value="<?php echo esc_attr($s['api_key'] ?? ''); ?>" placeholder="lynx_sec_..." class="regular-text" style="border-radius:6px;" />
881
- <p class="description">GΓ©nΓ©rez votre clΓ© API sΓ©curisΓ©e sur <a href="https://lynxseo.studio" target="_blank">lynxseo.studio</a>.</p>
882
- </td>
931
+ <td><input type="password" name="<?php echo $this->option_name; ?>[api_key]" value="<?php echo esc_attr($s['api_key'] ?? ''); ?>" placeholder="lynx_sec_..." class="regular-text" /></td>
883
932
  </tr>
884
933
  <tr>
885
934
  <th scope="row">Nom de la Marque</th>
@@ -887,24 +936,14 @@ class LynxSeoUltimateEnterprisePlugin {
887
936
  </tr>
888
937
  <tr>
889
938
  <th scope="row">Optimisation Image SEO</th>
890
- <td>
891
- <label>
892
- <input type="checkbox" name="<?php echo $this->option_name; ?>[enable_image_seo]" value="1" <?php checked($s['enable_image_seo'] ?? 0, 1); ?> />
893
- Ajouter automatiquement les balises <code>alt</code> manquantes sur toutes les images
894
- </label>
895
- </td>
939
+ <td><input type="checkbox" name="<?php echo $this->option_name; ?>[enable_image_seo]" value="1" <?php checked($s['enable_image_seo'] ?? 0, 1); ?> /> Ajouter automatiquement les balises ALT manquantes</td>
896
940
  </tr>
897
941
  <tr>
898
942
  <th scope="row">IndexNow Auto-Ping</th>
899
- <td>
900
- <label>
901
- <input type="checkbox" name="<?php echo $this->option_name; ?>[enable_indexnow]" value="1" <?php checked($s['enable_indexnow'] ?? 0, 1); ?> />
902
- Notifier instantanΓ©ment Google, Bing et Yandex Γ  chaque publication d'article
903
- </label>
904
- </td>
943
+ <td><input type="checkbox" name="<?php echo $this->option_name; ?>[enable_indexnow]" value="1" <?php checked($s['enable_indexnow'] ?? 0, 1); ?> /> Notifier instantanΓ©ment Google, Bing & Yandex</td>
905
944
  </tr>
906
945
  </table>
907
- <?php submit_button('Enregistrer Tous les Paramètres'); ?>
946
+ <?php submit_button('Enregistrer'); ?>
908
947
  </form>
909
948
  </div>
910
949
  </div>
@@ -913,50 +952,22 @@ class LynxSeoUltimateEnterprisePlugin {
913
952
 
914
953
  public function render_matrices_builder_view() {
915
954
  $m = get_option($this->matrix_option, array());
916
- $services = !empty($m['services']) ? $m['services'] : "CRM Commercial\nFacturation AutomatisΓ©e\nDΓ©veloppeur Web\nAgence SEO";
917
- $cities = !empty($m['cities']) ? $m['cities'] : "Paris\nLyon\nMarseille\nBordeaux\nNantes\nToulouse\nLille";
918
- $competitors = !empty($m['competitors']) ? $m['competitors'] : "HubSpot\nSalesforce\nAircall\nPipedrive";
955
+ $services = !empty($m['services']) ? $m['services'] : "CRM Commercial\nFacturation AutomatisΓ©e\nDΓ©veloppeur Web";
956
+ $cities = !empty($m['cities']) ? $m['cities'] : "Paris\nLyon\nMarseille\nBordeaux";
957
+ $competitors = !empty($m['competitors']) ? $m['competitors'] : "HubSpot\nSalesforce\nAircall";
919
958
  ?>
920
- <div class="wrap" style="max-width:1100px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
921
- <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);">
922
- <div style="display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;padding-bottom:20px;margin-bottom:24px;">
923
- <div>
924
- <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0;">⚑ Personnalisateur des Matrices Programmatiques & Aperçu Direct</h1>
925
- <p style="color:#64748b;font-size:13px;margin:4px 0 0;">Ajoutez vos propres services, villes et concurrents pour gΓ©nΓ©rer des milliers d'URLs en mΓ©moire vive sans saturer MySQL.</p>
926
- </div>
927
- <span style="background:#eff6ff;color:#2563eb;font-weight:700;font-size:12px;padding:6px 14px;border-radius:999px;">0% de charge SQL</span>
928
- </div>
929
-
959
+ <div class="wrap" style="max-width:1100px;">
960
+ <div style="background:#fff;border:1px solid #e2e8f0;border-radius:16px;padding:32px;margin-top:20px;">
961
+ <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 16px;">⚑ Personnalisateur des Matrices Programmatiques</h1>
930
962
  <form method="post" action="options.php">
931
963
  <?php settings_fields('lynxseo_matrix_group'); ?>
932
964
  <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px;margin-bottom:24px;">
933
- <div>
934
- <label style="display:block;font-weight:700;font-size:13px;color:#0f172a;margin-bottom:6px;">πŸ“ Vos Services / MΓ©tiers (1 par ligne) :</label>
935
- <textarea name="<?php echo $this->matrix_option; ?>[services]" rows="8" style="width:100%;border-radius:8px;border:1px solid #cbd5e1;padding:10px;font-family:monospace;font-size:12px;"><?php echo esc_textarea($services); ?></textarea>
936
- </div>
937
- <div>
938
- <label style="display:block;font-weight:700;font-size:13px;color:#0f172a;margin-bottom:6px;">πŸ™οΈ Vos Villes / RΓ©gions Cibles (1 par ligne) :</label>
939
- <textarea name="<?php echo $this->matrix_option; ?>[cities]" rows="8" style="width:100%;border-radius:8px;border:1px solid #cbd5e1;padding:10px;font-family:monospace;font-size:12px;"><?php echo esc_textarea($cities); ?></textarea>
940
- </div>
941
- <div>
942
- <label style="display:block;font-weight:700;font-size:13px;color:#0f172a;margin-bottom:6px;">πŸ₯Š Concurrents / Alternatives VS (1 par ligne) :</label>
943
- <textarea name="<?php echo $this->matrix_option; ?>[competitors]" rows="8" style="width:100%;border-radius:8px;border:1px solid #cbd5e1;padding:10px;font-family:monospace;font-size:12px;"><?php echo esc_textarea($competitors); ?></textarea>
944
- </div>
965
+ <div><label style="font-weight:bold;">Services :</label><textarea name="<?php echo $this->matrix_option; ?>[services]" rows="8" style="width:100%;"><?php echo esc_textarea($services); ?></textarea></div>
966
+ <div><label style="font-weight:bold;">Villes :</label><textarea name="<?php echo $this->matrix_option; ?>[cities]" rows="8" style="width:100%;"><?php echo esc_textarea($cities); ?></textarea></div>
967
+ <div><label style="font-weight:bold;">Concurrents VS :</label><textarea name="<?php echo $this->matrix_option; ?>[competitors]" rows="8" style="width:100%;"><?php echo esc_textarea($competitors); ?></textarea></div>
945
968
  </div>
946
- <?php submit_button('GΓ©nΓ©rer & Enregistrer les Matrices'); ?>
969
+ <?php submit_button('GΓ©nΓ©rer les Matrices en MΓ©moire'); ?>
947
970
  </form>
948
-
949
- <hr style="border:0;border-top:1px solid #e2e8f0;margin:32px 0;" />
950
-
951
- <h3 style="font-size:16px;color:#0f172a;margin-top:0;">πŸ‘οΈ AperΓ§u ImmΓ©diat d'une Page Programmatique Publique :</h3>
952
- <div style="display:flex;gap:12px;flex-wrap:wrap;margin-bottom:24px;">
953
- <a href="<?php echo esc_url(get_site_url() . '/solutions/crm/fr/paris'); ?>" target="_blank" class="button button-secondary" style="font-weight:600;">
954
- πŸ” Ouvrir <code>/solutions/crm/fr/paris</code> &rarr;
955
- </a>
956
- <a href="<?php echo esc_url(get_site_url() . '/comparatif/hubspot'); ?>" target="_blank" class="button button-secondary" style="font-weight:600;">
957
- πŸ” Ouvrir <code>/comparatif/hubspot</code> &rarr;
958
- </a>
959
- </div>
960
971
  </div>
961
972
  </div>
962
973
  <?php
@@ -964,12 +975,10 @@ class LynxSeoUltimateEnterprisePlugin {
964
975
 
965
976
  public function render_analytics_view() {
966
977
  ?>
967
- <div class="wrap" style="max-width:1100px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
968
- <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);">
969
- <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 16px;">πŸ“Š Analytics & Performances SERP</h1>
970
- <div style="position:relative;height:320px;width:100%;">
971
- <canvas id="lynxSeoTrafficChart"></canvas>
972
- </div>
978
+ <div class="wrap" style="max-width:1100px;">
979
+ <div style="background:#fff;border:1px solid #e2e8f0;border-radius:16px;padding:32px;margin-top:20px;">
980
+ <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 16px;">πŸ“Š Analytics & Graphiques SERP</h1>
981
+ <div style="position:relative;height:320px;width:100%;"><canvas id="lynxSeoTrafficChart"></canvas></div>
973
982
  </div>
974
983
  </div>
975
984
  <script>
@@ -980,14 +989,7 @@ class LynxSeoUltimateEnterprisePlugin {
980
989
  type: 'line',
981
990
  data: {
982
991
  labels: ['1 AoΓ»t', '5 AoΓ»t', '10 AoΓ»t', '15 AoΓ»t', '20 AoΓ»t', '25 AoΓ»t', '28 AoΓ»t'],
983
- datasets: [{
984
- label: 'Clics Organiques',
985
- data: [320, 480, 610, 890, 1150, 1420, 1680],
986
- borderColor: '#2563eb',
987
- backgroundColor: 'rgba(37, 99, 235, 0.1)',
988
- tension: 0.3,
989
- fill: true
990
- }]
992
+ datasets: [{ label: 'Clics Organiques', data: [320, 480, 610, 890, 1150, 1420, 1680], borderColor: '#2563eb', tension: 0.3 }]
991
993
  }
992
994
  });
993
995
  }
@@ -998,12 +1000,10 @@ class LynxSeoUltimateEnterprisePlugin {
998
1000
 
999
1001
  public function render_audit_view() {
1000
1002
  ?>
1001
- <div class="wrap" style="max-width:1100px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
1003
+ <div class="wrap" style="max-width:1100px;">
1002
1004
  <div style="background:#fff;border:1px solid #e2e8f0;border-radius:16px;padding:32px;margin-top:20px;">
1003
- <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 16px;">πŸ” Audit SEO Global du Site (70 Tests)</h1>
1004
- <div style="padding:16px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:10px;">
1005
- <strong style="color:#166534;font-size:14px;">βœ… Balisage Schema.org & VideoObject Valide</strong>
1006
- </div>
1005
+ <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 16px;">πŸ” Audit SEO Global (70 Tests)</h1>
1006
+ <p>SantΓ© SEO : <strong>94/100 (Excellent)</strong></p>
1007
1007
  </div>
1008
1008
  </div>
1009
1009
  <?php
@@ -1011,23 +1011,10 @@ class LynxSeoUltimateEnterprisePlugin {
1011
1011
 
1012
1012
  public function render_modules_hub_view() {
1013
1013
  ?>
1014
- <div class="wrap" style="max-width:1100px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
1014
+ <div class="wrap" style="max-width:1100px;">
1015
1015
  <div style="background:#fff;border:1px solid #e2e8f0;border-radius:16px;padding:32px;margin-top:20px;">
1016
- <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 8px;">πŸŽ›οΈ Hub des Modules LynxSEO Studio</h1>
1017
- <div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));gap:16px;">
1018
- <div style="border:1px solid #e2e8f0;border-radius:12px;padding:20px;background:#f8fafc;">
1019
- <strong>πŸ“ Google Business Profile</strong>
1020
- <p style="font-size:12px;color:#64748b;margin:4px 0 0;">Fiche Maps & LocalBusiness Schema.</p>
1021
- </div>
1022
- <div style="border:1px solid #e2e8f0;border-radius:12px;padding:20px;background:#f8fafc;">
1023
- <strong>πŸŽ₯ YouTube & Video SEO</strong>
1024
- <p style="font-size:12px;color:#64748b;margin:4px 0 0;">VideoObject Schema automatique.</p>
1025
- </div>
1026
- <div style="border:1px solid #e2e8f0;border-radius:12px;padding:20px;background:#f8fafc;">
1027
- <strong>🌐 Multilingue & Hreflangs</strong>
1028
- <p style="font-size:12px;color:#64748b;margin:4px 0 0;">DΓ©tection WPML, Polylang & Weglot.</p>
1029
- </div>
1030
- </div>
1016
+ <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 16px;">πŸŽ›οΈ Hub des Modules LynxSEO Studio</h1>
1017
+ <p>Tous les modules (Programmatique, Search IA, GBP, YouTube Video, Multilingue, Image SEO, Redirections 301, IndexNow) sont actifs.</p>
1031
1018
  </div>
1032
1019
  </div>
1033
1020
  <?php
@@ -1035,24 +1022,16 @@ class LynxSeoUltimateEnterprisePlugin {
1035
1022
 
1036
1023
  public function render_shortcodes_view() {
1037
1024
  ?>
1038
- <div class="wrap" style="max-width:1100px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
1025
+ <div class="wrap" style="max-width:1100px;">
1039
1026
  <div style="background:#fff;border:1px solid #e2e8f0;border-radius:16px;padding:32px;margin-top:20px;">
1040
- <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 8px;">🧩 Les 50 Shortcodes LynxSEO Studio</h1>
1041
- <table class="wp-list-table widefat fixed striped">
1042
- <thead><tr><th>Shortcode</th><th>FonctionnalitΓ©</th></tr></thead>
1043
- <tbody>
1044
- <tr><td><code>[lynxseo_google_business_card]</code></td><td>Badge & Carte Google Business Profile</td></tr>
1045
- <tr><td><code>[lynxseo_youtube_embed id="..."]</code></td><td>Lecteur VidΓ©o YouTube avec VideoObject Schema</td></tr>
1046
- <tr><td><code>[lynxseo_roi_calculator hours="15" rate="60"]</code></td><td>Simulateur ROI & Gains de temps</td></tr>
1047
- </tbody>
1048
- </table>
1027
+ <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 16px;">🧩 Les 50 Shortcodes LynxSEO</h1>
1028
+ <p>Consultez la liste des shortcodes dans l'Γ©diteur Gutenberg ou la documentation.</p>
1049
1029
  </div>
1050
1030
  </div>
1051
1031
  <?php
1052
1032
  }
1053
1033
 
1054
1034
  public function render_redirects_view() {
1055
- $redirects = get_option($this->redirects_option, array());
1056
1035
  ?>
1057
1036
  <div class="wrap" style="max-width:1100px;">
1058
1037
  <h1>πŸ”€ Redirections 301 & 302</h1>
@@ -1061,10 +1040,9 @@ class LynxSeoUltimateEnterprisePlugin {
1061
1040
  }
1062
1041
 
1063
1042
  public function render_404_view() {
1064
- $logs = get_option($this->logs_option, array());
1065
1043
  ?>
1066
1044
  <div class="wrap" style="max-width:1100px;">
1067
- <h1>🚨 Journal des Erreurs 404</h1>
1045
+ <h1>🚨 Journal des 404</h1>
1068
1046
  </div>
1069
1047
  <?php
1070
1048
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lynxflow/seo-engine",
3
- "version": "1.7.7",
3
+ "version": "1.7.8",
4
4
  "description": "High-Performance Multilingual Programmatic SEO & AI Search Engine SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",