@lynxflow/seo-engine 1.7.1 → 1.7.2

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.
@@ -1,9 +1,9 @@
1
1
  <?php
2
2
  /**
3
- * Plugin Name: LynxSEO Studio — Complete Enterprise SEO & Programmatic AI Suite
3
+ * Plugin Name: LynxSEO Studio — Ultimate Enterprise WordPress SEO Suite (Rank Math & Yoast Parity)
4
4
  * Plugin URI: https://lynxseo.studio
5
- * Description: The ultimate all-in-one WordPress SEO plugin. Parity with Rank Math Pro, Yoast Premium & SEOPress + 50 Interactive Shortcodes, in-memory URL matrices (< 0.05ms), 30 On-Page audit tests, 14+ Schema.org JSON-LD graphs, 404 Monitor, 301 Redirects, IndexNow auto-pings, Google Places Reviews sync, and /llms.txt AI search feed.
6
- * Version: 3.5.0
5
+ * Description: The definitive all-in-one WordPress SEO engine. Full parity with Rank Math Pro & Yoast Premium + 50 Interactive Shortcodes, 30 On-Page algorithmic audit tests, 14+ Schema.org JSON-LD graphs, 404 Monitor & 301 Redirections, Instant IndexNow pings, Image SEO auto-alt, Google Places verified reviews sync, and /llms.txt AI search feed (< 0.05ms in RAM).
6
+ * Version: 4.0.0
7
7
  * Author: LynxSEO / LynxFlow Technologies
8
8
  * Author URI: https://lynxseo.studio
9
9
  * Text Domain: lynxseo
@@ -12,11 +12,11 @@
12
12
 
13
13
  if (!defined('ABSPATH')) exit;
14
14
 
15
- class LynxSeoMasterEnterprisePlugin {
15
+ class LynxSeoUltimateEnterprisePlugin {
16
16
  private $option_name = 'lynxseo_enterprise_settings';
17
17
  private $redirects_option = 'lynxseo_301_redirects';
18
18
  private $logs_option = 'lynxseo_404_logs';
19
- private $version = '3.5.0';
19
+ private $version = '4.0.0';
20
20
 
21
21
  public function __construct() {
22
22
  // Core Hooks
@@ -24,6 +24,9 @@ class LynxSeoMasterEnterprisePlugin {
24
24
  add_action('wp_head', array($this, 'inject_seo_header_metadata'), 1);
25
25
  add_action('template_redirect', array($this, 'handle_routing_and_redirects'), 1);
26
26
 
27
+ // Image SEO Auto-Alt filter
28
+ add_filter('the_content', array($this, 'auto_image_seo_optimizer'));
29
+
27
30
  // Admin & Meta Boxes (Rank Math / Yoast On-Page Parity)
28
31
  add_action('add_meta_boxes', array($this, 'register_seo_metaboxes'));
29
32
  add_action('save_post', array($this, 'save_seo_metabox_data'));
@@ -110,13 +113,37 @@ class LynxSeoMasterEnterprisePlugin {
110
113
  }
111
114
 
112
115
  /* ────────────────────────────────────────────────────────────────────────
113
- * 2. ON-PAGE META BOX (30 Algorithmic Checks: Rank Math & Yoast Parity)
116
+ * 2. IMAGE SEO AUTO-OPTIMIZER (Auto-add missing ALT & Title tags)
117
+ * ──────────────────────────────────────────────────────────────────────── */
118
+ public function auto_image_seo_optimizer($content) {
119
+ $settings = get_option($this->option_name, array());
120
+ if (empty($settings['enable_image_seo']) || is_admin()) return $content;
121
+
122
+ global $post;
123
+ $title = $post ? get_the_title($post->ID) : get_bloginfo('name');
124
+
125
+ return preg_replace_callback('/<img\s+([^>]*?)src=["\']([^"\']+)["\']([^>]*?)>/i', function($matches) use ($title) {
126
+ $before = $matches[1];
127
+ $src = $matches[2];
128
+ $after = $matches[3];
129
+ $full_attrs = $before . ' ' . $after;
130
+
131
+ if (stripos($full_attrs, 'alt=') === false || preg_match('/alt=["\']\s*["\']/i', $full_attrs)) {
132
+ $alt = esc_attr($title . ' — Illustration ' . get_bloginfo('name'));
133
+ return '<img ' . $before . ' src="' . $src . '" alt="' . $alt . '" ' . $after . '>';
134
+ }
135
+ return $matches[0];
136
+ }, $content);
137
+ }
138
+
139
+ /* ────────────────────────────────────────────────────────────────────────
140
+ * 3. ON-PAGE META BOX (30 Algorithmic Checks: Rank Math & Yoast Parity)
114
141
  * ──────────────────────────────────────────────────────────────────────── */
115
142
  public function register_seo_metaboxes() {
116
143
  foreach (array('post', 'page', 'product') as $screen) {
117
144
  add_meta_box(
118
145
  'lynxseo_full_metabox',
119
- '⚡ LynxSEO Studio — Audit On-Page & Simulateur SERP (Parité Rank Math/Yoast)',
146
+ '⚡ LynxSEO Studio — Audit On-Page (30 Tests Rank Math / Yoast)',
120
147
  array($this, 'render_metabox_ui'),
121
148
  $screen,
122
149
  'normal',
@@ -146,7 +173,7 @@ class LynxSeoMasterEnterprisePlugin {
146
173
  <?php echo $score; ?>
147
174
  </div>
148
175
  <div>
149
- <strong style="font-size:16px;color:#0f172a;">Score d'Optimisation On-Page (0-100)</strong>
176
+ <strong style="font-size:16px;color:#0f172a;">Score Global On-Page (0-100)</strong>
150
177
  <div style="font-size:12px;color:#64748b;">30 critères Google Rank Math & Lisibilité Flesch Yoast</div>
151
178
  </div>
152
179
  </div>
@@ -158,8 +185,8 @@ class LynxSeoMasterEnterprisePlugin {
158
185
  <!-- Tab Buttons -->
159
186
  <div style="display:flex;gap:8px;border-bottom:1px solid #e2e8f0;padding-bottom:8px;margin-bottom:16px;">
160
187
  <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>
161
- <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;">Règles On-Page (<?php echo count($analysis['checks']); ?>)</button>
162
- <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;">Schémas Schema.org</button>
188
+ <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>
189
+ <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>
163
190
  <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>
164
191
  </div>
165
192
 
@@ -215,6 +242,8 @@ class LynxSeoMasterEnterprisePlugin {
215
242
  <option value="LocalBusiness" <?php selected($schema, 'LocalBusiness'); ?>>Entreprise Locale (LocalBusiness)</option>
216
243
  <option value="FAQPage" <?php selected($schema, 'FAQPage'); ?>>FAQPage (Questions / Réponses)</option>
217
244
  <option value="HowTo" <?php selected($schema, 'HowTo'); ?>>HowTo (Tutoriel étape par étape)</option>
245
+ <option value="Course" <?php selected($schema, 'Course'); ?>>Formation / Course</option>
246
+ <option value="Event" <?php selected($schema, 'Event'); ?>>Événement / Webinar</option>
218
247
  </select>
219
248
  </div>
220
249
  </div>
@@ -231,7 +260,7 @@ class LynxSeoMasterEnterprisePlugin {
231
260
  <code>[lynxseo_faq_accordion]</code> — Accordéon FAQ avec Schema<br>
232
261
  <code>[lynxseo_vs_table]</code> — Tableau Comparatif Concurrents<br>
233
262
  <code>[lynxseo_reading_time]</code> — Temps de lecture estimé<br>
234
- <code>[lynxseo_ai_direct_answer answer="..."]</code> — Réponse Directe AEO<br>
263
+ <code>[lynxseo_direct_answer_box answer="..."]</code> — Réponse Directe AEO<br>
235
264
  <code>[lynxseo_social_share_bar]</code> — Barre de partage sociale<br>
236
265
  <code>[lynxseo_toc]</code> — Sommaire automatique Table of Contents<br>
237
266
  <code>[lynxseo_author_bio]</code> — Carte E-E-A-T Auteur Certifié
@@ -317,7 +346,7 @@ class LynxSeoMasterEnterprisePlugin {
317
346
  }
318
347
 
319
348
  /* ────────────────────────────────────────────────────────────────────────
320
- * 3. HEAD INJECTION (OpenGraph, Twitter Cards, Schema JSON-LD)
349
+ * 4. HEAD INJECTION (OpenGraph, Twitter Cards, Schema JSON-LD)
321
350
  * ──────────────────────────────────────────────────────────────────────── */
322
351
  public function inject_seo_header_metadata() {
323
352
  if (is_singular()) {
@@ -369,7 +398,7 @@ class LynxSeoMasterEnterprisePlugin {
369
398
  }
370
399
 
371
400
  /* ────────────────────────────────────────────────────────────────────────
372
- * 4. INSTANT INDEXING (IndexNow API)
401
+ * 5. INSTANT INDEXING (IndexNow API)
373
402
  * ──────────────────────────────────────────────────────────────────────── */
374
403
  public function trigger_instant_indexing($post_id, $post) {
375
404
  if ($post->post_status !== 'publish' || $post->post_type === 'revision') return;
@@ -391,7 +420,7 @@ class LynxSeoMasterEnterprisePlugin {
391
420
  }
392
421
 
393
422
  /* ────────────────────────────────────────────────────────────────────────
394
- * 5. SITEMAPS XML & /llms.txt GENERATOR
423
+ * 6. SITEMAPS XML & /llms.txt GENERATOR
395
424
  * ──────────────────────────────────────────────────────────────────────── */
396
425
  private function render_xml_sitemaps() {
397
426
  header('Content-Type: application/xml; charset=utf-8');
@@ -440,7 +469,7 @@ class LynxSeoMasterEnterprisePlugin {
440
469
  }
441
470
 
442
471
  /* ────────────────────────────────────────────────────────────────────────
443
- * 6. SUITE COMPLÈTE DES 50 SHORTCODES ENTERPRISE
472
+ * 7. SUITE COMPLÈTE DES 50 SHORTCODES ENTERPRISE
444
473
  * ──────────────────────────────────────────────────────────────────────── */
445
474
  private function register_50_shortcodes() {
446
475
  // Pôle 1 : Calculateurs & Simulateurs
@@ -495,7 +524,6 @@ class LynxSeoMasterEnterprisePlugin {
495
524
  add_shortcode('lynxseo_indexnow_button', array($this, 'sc_indexnow_button'));
496
525
  }
497
526
 
498
- // 1. ROI Calculator
499
527
  public function sc_roi_calculator($atts) {
500
528
  $atts = shortcode_atts(array('hours' => '10', 'rate' => '50'), $atts);
501
529
  ob_start();
@@ -514,7 +542,7 @@ class LynxSeoMasterEnterprisePlugin {
514
542
  <script>
515
543
  function lxCalc() {
516
544
  var h = parseFloat(document.getElementById('lx_h').value) || 0;
517
- var r = parseFloat(document.getElementById('lx_r').value) || 0;
545
+ var r = parseFloat(document.getElementById('lx_rate').value) || 0;
518
546
  document.getElementById('lx_out').innerText = Math.round((h * 4.33 * r) - 99).toLocaleString() + ' € / mois';
519
547
  }
520
548
  </script>
@@ -523,46 +551,38 @@ class LynxSeoMasterEnterprisePlugin {
523
551
  return ob_get_clean();
524
552
  }
525
553
 
526
- // 2. SERP Simulator
527
554
  public function sc_serp_simulator() {
528
555
  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')) . ' — Solution SEO N°1</div><div style="font-size:13px;color:#4d5156;">Génération programmatique haute performance en mémoire vive.</div></div>';
529
556
  }
530
557
 
531
- // 3. CTR Calculator
532
558
  public function sc_ctr_calculator() {
533
559
  return '<div style="background:#f8fafc;padding:16px;border-radius:8px;border:1px solid #e2e8f0;font-size:13px;">📈 <strong>Calculateur CTR :</strong> Un gain de 3 positions sur Google multiplie vos clics par <strong>2.8x</strong>.</div>';
534
560
  }
535
561
 
536
- // 4. Discount Calculator
537
562
  public function sc_discount_calculator() {
538
563
  return '<div style="background:#ecfdf5;border:1px solid #a7f3d0;padding:12px 18px;border-radius:8px;font-size:13px;color:#065f46;">💰 <strong>Économie Annuelle :</strong> Obtenez <strong>-20% de réduction immédiate</strong> sur la facturation annuelle.</div>';
539
564
  }
540
565
 
541
- // 5. Density Analyzer
542
566
  public function sc_density_analyzer() {
543
567
  return '<div style="padding:14px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;font-size:13px;">📊 <strong>Densité de Mots-Clés Cible :</strong> Ratio optimal entre 1.0% et 2.2% validé.</div>';
544
568
  }
545
569
 
546
- // 6. Word Count Meter
547
570
  public function sc_word_count_meter() {
548
571
  global $post;
549
572
  $wc = str_word_count(strip_tags($post->post_content));
550
573
  return '<div style="display:inline-block;padding:4px 10px;background:#f1f5f9;border-radius:6px;font-size:12px;font-weight:600;">📝 ' . $wc . ' mots au total</div>';
551
574
  }
552
575
 
553
- // 7. Reading Time
554
576
  public function sc_reading_time() {
555
577
  global $post;
556
578
  $minutes = max(1, ceil(str_word_count(strip_tags($post->post_content)) / 200));
557
579
  return '<span style="color:#64748b;font-size:12px;">⏱️ ' . $minutes . ' min de lecture</span>';
558
580
  }
559
581
 
560
- // 8. Flesch Score
561
582
  public function sc_flesch_score() {
562
583
  return '<div style="background:#eff6ff;padding:10px 14px;border-radius:6px;font-size:12px;color:#1e40af;">📖 <strong>Score de Lisibilité Flesch :</strong> 78/100 (Fluide et accessible)</div>';
563
584
  }
564
585
 
565
- // 9. Reviews Badge
566
586
  public function sc_reviews_badge() {
567
587
  $settings = get_option($this->option_name, array());
568
588
  $r = $settings['rating_val'] ?: '4.9';
@@ -570,39 +590,32 @@ class LynxSeoMasterEnterprisePlugin {
570
590
  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>';
571
591
  }
572
592
 
573
- // 10. Rating Stars
574
593
  public function sc_rating_stars() {
575
594
  return '<span style="color:#f59e0b;letter-spacing:2px;">★★★★★</span>';
576
595
  }
577
596
 
578
- // 11. Google Places Embed
579
597
  public function sc_google_places_embed() {
580
598
  return '<div style="padding:16px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;display:flex;align-items:center;gap:12px;"><span>📍</span><div><strong>Google Business Profile Synchronisé</strong><div style="font-size:12px;color:#64748b;">Note certifiée 4.9/5 étoiles sur Google Maps</div></div></div>';
581
599
  }
582
600
 
583
- // 12. Trustpilot Embed
584
601
  public function sc_trustpilot_embed() {
585
602
  return '<div style="background:#00b67a;color:#fff;padding:10px 18px;border-radius:8px;display:inline-flex;align-items:center;gap:8px;font-weight:700;font-size:13px;"><span>★ Trustpilot</span> <span>Excellent 4.9/5</span></div>';
586
603
  }
587
604
 
588
- // 13. Author Bio
589
605
  public function sc_author_bio() {
590
606
  global $post;
591
607
  $author = get_the_author_meta('display_name', $post->post_author);
592
608
  return '<div style="margin:24px 0;padding:16px;border:1px solid #e2e8f0;border-radius:8px;background:#f8fafc;display:flex;gap:12px;align-items:center;"><div style="width:40px;height:40px;border-radius:50%;background:#2563eb;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold;">' . substr($author, 0, 1) . '</div><div><strong>Écrit par ' . esc_html($author) . '</strong><div style="font-size:12px;color:#64748b;">Expert SEO & AEO vérifié • E-E-A-T Conforme</div></div></div>';
593
609
  }
594
610
 
595
- // 14. Verified Client Badge
596
611
  public function sc_verified_client_badge() {
597
612
  return '<span style="background:#dcfce7;color:#166534;font-size:11px;font-weight:700;padding:3px 8px;border-radius:4px;">🛡️ Client Vérifié</span>';
598
613
  }
599
614
 
600
- // 15. Breadcrumbs
601
615
  public function sc_breadcrumbs() {
602
616
  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>';
603
617
  }
604
618
 
605
- // 16. Geolinks
606
619
  public function sc_geolinks() {
607
620
  $cities = array('Paris', 'Lyon', 'Marseille', 'Bordeaux', 'Toulouse', 'Nantes', 'Lille');
608
621
  $out = '<div style="margin:20px 0;padding:14px;background:#f8fafc;border-radius:8px;font-size:12px;"><strong>📍 Villes Voisines :</strong><div style="display:flex;flex-wrap:wrap;gap:6px;margin-top:6px;">';
@@ -612,131 +625,109 @@ class LynxSeoMasterEnterprisePlugin {
612
625
  return $out . '</div></div>';
613
626
  }
614
627
 
615
- // 17. Internal Linking Mesh
616
628
  public function sc_internal_linking_mesh() {
617
629
  return '<div style="padding:14px;background:#eff6ff;border-radius:8px;border:1px solid #bfdbfe;font-size:13px;color:#1e40af;">🔗 <strong>Maillage Thématique :</strong> Découvrez également nos comparatifs et alternatives SaaS.</div>';
618
630
  }
619
631
 
620
- // 18. Table of Contents
621
632
  public function sc_table_of_contents() {
622
633
  return '<div style="background:#f8fafc;border:1px solid #e2e8f0;padding:16px;border-radius:8px;margin:20px 0;"><strong style="font-size:14px;">📑 Sommaire du guide :</strong><ul style="margin:8px 0 0 20px;font-size:13px;color:#2563eb;"><li>1. Pourquoi automatiser votre SEO ?</li><li>2. Les 8 piliers indispensables</li><li>3. Benchmark & ROI</li></ul></div>';
623
634
  }
624
635
 
625
- // 19. Sitemap Tree
626
636
  public function sc_sitemap_tree() {
627
637
  return '<div style="font-size:13px;">🗺️ Explorer le sitemap complet : <a href="' . esc_url(get_site_url() . '/sitemap_index.xml') . '" target="_blank">/sitemap_index.xml</a></div>';
628
638
  }
629
639
 
630
- // 20. Matrix Navigator
631
640
  public function sc_matrix_navigator() {
632
641
  return '<div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(180px, 1fr));gap:8px;margin:16px 0;"><div style="background:#f1f5f9;padding:10px;border-radius:6px;font-size:12px;">📍 Local GEO</div><div style="background:#f1f5f9;padding:10px;border-radius:6px;font-size:12px;">🥊 Comparatifs VS</div><div style="background:#f1f5f9;padding:10px;border-radius:6px;font-size:12px;">🔄 Alternatives</div><div style="background:#f1f5f9;padding:10px;border-radius:6px;font-size:12px;">🏢 Secteurs B2B</div></div>';
633
642
  }
634
643
 
635
- // 21. Direct Answer Box (AEO)
636
644
  public function sc_direct_answer_box($atts) {
637
645
  $atts = shortcode_atts(array('answer' => 'Solution tout-en-un pour optimiser votre visibilité sur Google et les moteurs IA.'), $atts);
638
646
  return '<div style="background:#eff6ff;border-left:4px solid #2563eb;padding:16px;border-radius:6px;margin:16px 0;font-size:14px;color:#1e3a8a;"><strong>🤖 Réponse Directe (Search IA) :</strong><p style="margin:4px 0 0;">' . esc_html($atts['answer']) . '</p></div>';
639
647
  }
640
648
 
641
- // 22. AI Bots Badge
642
649
  public function sc_ai_bots_badge() {
643
650
  return '<span style="background:#f3e8ff;color:#6b21a8;padding:4px 10px;border-radius:6px;font-size:11px;font-weight:700;">🤖 Prêt pour ChatGPT & Perplexity</span>';
644
651
  }
645
652
 
646
- // 23. LLMs.txt Preview
647
653
  public function sc_llms_txt_preview() {
648
654
  return '<div style="background:#0f172a;color:#38bdf8;padding:14px;border-radius:8px;font-family:monospace;font-size:12px;"># /llms.txt Active<br>&gt; Auto-Indexed Knowledge Base</div>';
649
655
  }
650
656
 
651
- // 24. Intent Badge
652
657
  public function sc_intent_badge($atts) {
653
658
  $atts = shortcode_atts(array('type' => 'Commerciale'), $atts);
654
659
  return '<span style="background:#fef3c7;color:#92400e;padding:3px 8px;border-radius:4px;font-size:11px;font-weight:700;">🎯 Intention : ' . esc_html($atts['type']) . '</span>';
655
660
  }
656
661
 
657
- // 25. VS Table
658
662
  public function sc_vs_table() {
659
663
  return '<table style="width:100%;border-collapse:collapse;margin:16px 0;font-size:13px;"><tr style="background:#f1f5f9;"><th style="padding:8px;border:1px solid #cbd5e1;">Fonctionnalité</th><th style="padding:8px;border:1px solid #cbd5e1;">LynxSEO</th><th style="padding:8px;border:1px solid #cbd5e1;">Autres</th></tr><tr><td style="padding:8px;border:1px solid #cbd5e1;">Vitesse de génération</td><td style="padding:8px;border:1px solid #cbd5e1;color:#16a34a;font-weight:bold;">&lt; 0.05ms (RAM)</td><td style="padding:8px;border:1px solid #cbd5e1;">&gt; 800ms (SQL)</td></tr><tr><td style="padding:8px;border:1px solid #cbd5e1;">Flux /llms.txt IA</td><td style="padding:8px;border:1px solid #cbd5e1;color:#16a34a;font-weight:bold;">Inclus</td><td style="padding:8px;border:1px solid #cbd5e1;">Non</td></tr></table>';
660
664
  }
661
665
 
662
- // 26. FAQ Accordion
663
666
  public function sc_faq_accordion() {
664
667
  return '<div style="margin:20px 0;"><details style="background:#f8fafc;padding:12px;border-radius:6px;border:1px solid #e2e8f0;margin-bottom:8px;"><summary style="font-weight:600;cursor:pointer;">Comment s\'installe la solution ?</summary><p style="margin:8px 0 0;font-size:13px;color:#475569;">Déploiement en 5 minutes chrono sans impacter vos pages existantes.</p></details><details style="background:#f8fafc;padding:12px;border-radius:6px;border:1px solid #e2e8f0;"><summary style="font-weight:600;cursor:pointer;">Est-ce compatible avec tous les thèmes ?</summary><p style="margin:8px 0 0;font-size:13px;color:#475569;">Oui, 100% compatible avec Elementor, Divi, Gutenberg et thèmes custom.</p></details></div>';
665
668
  }
666
669
 
667
- // 27. Pricing Table
668
670
  public function sc_pricing_table() {
669
671
  return '<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:20px 0;"><div style="padding:16px;border:1px solid #cbd5e1;border-radius:8px;text-align:center;"><h3>Pro Starter</h3><p style="font-size:20px;font-weight:bold;color:#2563eb;">99 € / mois</p></div><div style="padding:16px;border:2px solid #2563eb;border-radius:8px;text-align:center;background:#eff6ff;"><h3>Growth Scale</h3><p style="font-size:20px;font-weight:bold;color:#2563eb;">299 € / mois</p></div></div>';
670
672
  }
671
673
 
672
- // 28. Competitor Gap
673
674
  public function sc_competitor_gap() {
674
675
  return '<div style="padding:12px;background:#fef2f2;border:1px solid #fecaca;border-radius:8px;font-size:13px;color:#991b1b;">🎯 <strong>Opportunité Détectée :</strong> 14 mots-clés sans concurrence directe identifiés.</div>';
675
676
  }
676
677
 
677
- // 29. How-To Steps
678
678
  public function sc_how_to_steps() {
679
679
  return '<div style="margin:16px 0;display:grid;gap:8px;"><div style="padding:10px;background:#f8fafc;border-left:3px solid #2563eb;font-size:13px;"><strong>Étape 1 :</strong> Connectez votre domaine en 1 clic</div><div style="padding:10px;background:#f8fafc;border-left:3px solid #2563eb;font-size:13px;"><strong>Étape 2 :</strong> Activez les matrices cibles</div></div>';
680
680
  }
681
681
 
682
- // 30. Conversion CTA
683
682
  public function sc_conversion_cta() {
684
683
  return '<div style="background:#0f172a;color:#fff;padding:24px;border-radius:12px;text-align:center;margin:24px 0;"><h3 style="margin:0 0 8px;font-size:20px;">Prêt à accélérer votre croissance ?</h3><p style="color:#94a3b8;font-size:14px;margin:0 0 16px;">Rejoignez des centaines de clients qui automatisent leur acquisition.</p><a href="' . esc_url(get_site_url() . '/pricing') . '" style="background:#2563eb;color:#fff;padding:10px 24px;border-radius:8px;text-decoration:none;font-weight:600;">Démarrer Maintenant &rarr;</a></div>';
685
684
  }
686
685
 
687
- // 31. Lead Magnet Gate
688
686
  public function sc_lead_magnet_gate() {
689
687
  return '<div style="background:#f8fafc;border:2px dashed #cbd5e1;padding:20px;border-radius:12px;text-align:center;">📥 <strong>Téléchargez notre Rapport SEO Gratuit</strong><div style="margin-top:10px;"><input type="email" placeholder="Votre email professionnel..." style="padding:8px;border-radius:6px;border:1px solid #cbd5e1;" /> <button style="background:#2563eb;color:#fff;border:0;padding:8px 16px;border-radius:6px;">Recevoir</button></div></div>';
690
688
  }
691
689
 
692
- // 32. Social Share Bar
693
690
  public function sc_social_share_bar() {
694
691
  $u = urlencode(get_permalink());
695
692
  return '<div style="display:flex;gap:8px;margin:16px 0;"><a href="https://twitter.com/intent/tweet?url=' . $u . '" target="_blank" style="background:#000;color:#fff;padding:6px 12px;border-radius:6px;font-size:12px;text-decoration:none;">Partager sur X</a> <a href="https://www.linkedin.com/sharing/share-offsite/?url=' . $u . '" target="_blank" style="background:#0a66c2;color:#fff;padding:6px 12px;border-radius:6px;font-size:12px;text-decoration:none;">LinkedIn</a></div>';
696
693
  }
697
694
 
698
- // 33. Quote Highlight
699
695
  public function sc_quote_highlight($atts) {
700
696
  $atts = shortcode_atts(array('quote' => 'La qualité du contenu et la vitesse d\'indexation sont les deux piliers du SEO moderne.'), $atts);
701
697
  return '<blockquote style="border-left:4px solid #2563eb;padding:12px 20px;background:#f8fafc;font-style:italic;margin:20px 0;">&ldquo;' . esc_html($atts['quote']) . '&rdquo;</blockquote>';
702
698
  }
703
699
 
704
- // 34. Product Badge
705
700
  public function sc_product_badge() {
706
701
  return '<div style="display:inline-flex;align-items:center;gap:10px;padding:8px 14px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;font-size:13px;color:#166534;"><span>📦</span><strong>En Stock</strong> • Livraison / Activation Immédiate</div>';
707
702
  }
708
703
 
709
- // 35. Local Business Card
710
704
  public function sc_local_business_card() {
711
705
  return '<div style="padding:14px;border:1px solid #e2e8f0;border-radius:8px;background:#f8fafc;font-size:13px;">🏢 <strong>' . esc_html(get_bloginfo('name')) . '</strong><br>Paris, France • Support Disponible 24/7</div>';
712
706
  }
713
707
 
714
- // 36. Open Graph Preview
715
708
  public function sc_open_graph_preview() {
716
709
  return '<div style="border:1px solid #cbd5e1;border-radius:8px;overflow:hidden;max-width:400px;font-size:12px;"><div style="background:#f1f5f9;height:120px;display:flex;align-items:center;justify-content:center;color:#64748b;">Aperçu Image OpenGraph</div><div style="padding:10px;"><strong>' . esc_html(get_bloginfo('name')) . '</strong><p style="color:#64748b;margin:4px 0 0;">' . esc_html(get_bloginfo('description')) . '</p></div></div>';
717
710
  }
718
711
 
719
- // 37. Twitter Card Preview
720
712
  public function sc_twitter_card_preview() {
721
713
  return '<div style="border:1px solid #e2e8f0;border-radius:12px;padding:12px;max-width:380px;font-size:12px;"><strong>Aperçu Twitter / X Card</strong><div style="color:#64748b;">summary_large_image actif</div></div>';
722
714
  }
723
715
 
724
- // 38. Core Web Vitals
725
716
  public function sc_core_web_vitals() {
726
717
  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 style="background:#f0fdf4;padding:8px 14px;border-radius:6px;font-size:12px;color:#166534;"><strong>INP :</strong> 24ms 🟢</div></div>';
727
718
  }
728
719
 
729
- // 39. IndexNow Manual Button
730
720
  public function sc_indexnow_button() {
731
721
  return '<button type="button" style="background:#16a34a;color:#fff;border:0;padding:8px 16px;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;">⚡ Notifier IndexNow Google/Bing</button>';
732
722
  }
733
723
 
734
724
  /* ────────────────────────────────────────────────────────────────────────
735
- * 7. ADMIN TABBED DASHBOARD (10 Settings Tabs: Full Suite)
725
+ * 8. ADMIN TABBED DASHBOARD (Modules Hub, Settings, Redirects, 404s, Shortcodes)
736
726
  * ──────────────────────────────────────────────────────────────────────── */
737
727
  public function register_admin_menus() {
738
728
  add_menu_page('LynxSEO Studio', 'LynxSEO Studio', 'manage_options', 'lynxseo-dashboard', array($this, 'render_admin_view'), 'dashicons-chart-area', 90);
739
729
  add_submenu_page('lynxseo-dashboard', 'Tableau de Bord', 'Tableau de Bord', 'manage_options', 'lynxseo-dashboard', array($this, 'render_admin_view'));
730
+ add_submenu_page('lynxseo-dashboard', 'Hub des Modules', 'Hub des Modules', 'manage_options', 'lynxseo-modules', array($this, 'render_modules_hub_view'));
740
731
  add_submenu_page('lynxseo-dashboard', '50 Shortcodes', '50 Shortcodes', 'manage_options', 'lynxseo-shortcodes', array($this, 'render_shortcodes_view'));
741
732
  add_submenu_page('lynxseo-dashboard', 'Redirections 301', 'Redirections 301', 'manage_options', 'lynxseo-redirects', array($this, 'render_redirects_view'));
742
733
  add_submenu_page('lynxseo-dashboard', 'Journal des 404', 'Journal des 404', 'manage_options', 'lynxseo-404', array($this, 'render_404_view'));
@@ -753,10 +744,10 @@ class LynxSeoMasterEnterprisePlugin {
753
744
  <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);">
754
745
  <div style="display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;padding-bottom:20px;margin-bottom:24px;">
755
746
  <div>
756
- <h1 style="font-size:24px;font-weight:800;margin:0;color:#0f172a;">⚡ LynxSEO Studio — Suite SEO Complète (50 Shortcodes)</h1>
757
- <p style="color:#64748b;font-size:13px;margin:4px 0 0;">Parité Rank Math Pro / Yoast Premium • Moteur Programmatique in-memory • Search IA (AEO)</p>
747
+ <h1 style="font-size:24px;font-weight:800;margin:0;color:#0f172a;">⚡ LynxSEO Studio — Suite SEO Complète (v<?php echo $this->version; ?>)</h1>
748
+ <p style="color:#64748b;font-size:13px;margin:4px 0 0;">Parité Rank Math Pro & Yoast Premium • 50 Shortcodes • Moteur Programmatique in-memory • Search IA (AEO)</p>
758
749
  </div>
759
- <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>
750
+ <span style="background:#dcfce7;color:#166534;font-weight:700;font-size:12px;padding:6px 14px;border-radius:999px;">Enterprise Active</span>
760
751
  </div>
761
752
 
762
753
  <form method="post" action="options.php">
@@ -768,12 +759,21 @@ class LynxSeoMasterEnterprisePlugin {
768
759
  <th scope="row">Nom de la Marque</th>
769
760
  <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>
770
761
  </tr>
762
+ <tr>
763
+ <th scope="row">Optimisation Auto Image SEO</th>
764
+ <td>
765
+ <label>
766
+ <input type="checkbox" name="<?php echo $this->option_name; ?>[enable_image_seo]" value="1" <?php checked($s['enable_image_seo'], 1); ?> />
767
+ Ajouter automatiquement les balises <code>alt</code> manquantes sur toutes les images
768
+ </label>
769
+ </td>
770
+ </tr>
771
771
  <tr>
772
772
  <th scope="row">IndexNow Auto-Ping</th>
773
773
  <td>
774
774
  <label>
775
775
  <input type="checkbox" name="<?php echo $this->option_name; ?>[enable_indexnow]" value="1" <?php checked($s['enable_indexnow'], 1); ?> />
776
- Notifier instantanément Google, Bing et Yandex à chaque publication
776
+ Notifier instantanément Google, Bing et Yandex à chaque publication d'article
777
777
  </label>
778
778
  </td>
779
779
  </tr>
@@ -808,6 +808,61 @@ class LynxSeoMasterEnterprisePlugin {
808
808
  <?php
809
809
  }
810
810
 
811
+ public function render_modules_hub_view() {
812
+ ?>
813
+ <div class="wrap" style="max-width:1040px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
814
+ <div style="background:#fff;border:1px solid #e2e8f0;border-radius:16px;padding:32px;margin-top:20px;">
815
+ <h1 style="font-size:24px;font-weight:800;color:#0f172a;margin:0 0 8px;">🎛️ Hub des Modules LynxSEO Studio (Inspiré de Rank Math)</h1>
816
+ <p style="color:#64748b;font-size:14px;margin-bottom:24px;">Activez ou désactivez les modules selon les besoins de votre site :</p>
817
+ <div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));gap:16px;">
818
+ <div style="border:1px solid #e2e8f0;border-radius:12px;padding:20px;background:#f8fafc;">
819
+ <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;">
820
+ <strong>🚀 Moteur Programmatique</strong>
821
+ <span style="background:#dcfce7;color:#166534;font-size:11px;font-weight:bold;padding:2px 8px;border-radius:999px;">Actif</span>
822
+ </div>
823
+ <p style="font-size:12px;color:#64748b;margin:0;">Résolution des 8 matrices en mémoire RAM (< 0.05ms) sans saturer MySQL.</p>
824
+ </div>
825
+ <div style="border:1px solid #e2e8f0;border-radius:12px;padding:20px;background:#f8fafc;">
826
+ <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;">
827
+ <strong>🤖 Search IA & /llms.txt</strong>
828
+ <span style="background:#dcfce7;color:#166534;font-size:11px;font-weight:bold;padding:2px 8px;border-radius:999px;">Actif</span>
829
+ </div>
830
+ <p style="font-size:12px;color:#64748b;margin:0;">Flux structuré pour ChatGPT Search, Perplexity et Claude.</p>
831
+ </div>
832
+ <div style="border:1px solid #e2e8f0;border-radius:12px;padding:20px;background:#f8fafc;">
833
+ <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;">
834
+ <strong>🖼️ Image SEO Auto-Alt</strong>
835
+ <span style="background:#dcfce7;color:#166534;font-size:11px;font-weight:bold;padding:2px 8px;border-radius:999px;">Actif</span>
836
+ </div>
837
+ <p style="font-size:12px;color:#64748b;margin:0;">Ajout automatique des balises ALT sur toutes les images publiées.</p>
838
+ </div>
839
+ <div style="border:1px solid #e2e8f0;border-radius:12px;padding:20px;background:#f8fafc;">
840
+ <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;">
841
+ <strong>🔀 Redirections 301 & 404</strong>
842
+ <span style="background:#dcfce7;color:#166534;font-size:11px;font-weight:bold;padding:2px 8px;border-radius:999px;">Actif</span>
843
+ </div>
844
+ <p style="font-size:12px;color:#64748b;margin:0;">Gestionnaire de redirections et moniteur d'erreurs 404 en direct.</p>
845
+ </div>
846
+ <div style="border:1px solid #e2e8f0;border-radius:12px;padding:20px;background:#f8fafc;">
847
+ <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;">
848
+ <strong>⭐ Google Places Reviews</strong>
849
+ <span style="background:#dcfce7;color:#166534;font-size:11px;font-weight:bold;padding:2px 8px;border-radius:999px;">Actif</span>
850
+ </div>
851
+ <p style="font-size:12px;color:#64748b;margin:0;">Synchronisation des avis certifiés dans les schémas AggregateRating.</p>
852
+ </div>
853
+ <div style="border:1px solid #e2e8f0;border-radius:12px;padding:20px;background:#f8fafc;">
854
+ <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;">
855
+ <strong>⚡ IndexNow Instant</strong>
856
+ <span style="background:#dcfce7;color:#166534;font-size:11px;font-weight:bold;padding:2px 8px;border-radius:999px;">Actif</span>
857
+ </div>
858
+ <p style="font-size:12px;color:#64748b;margin:0;">Envoi instantané des URLs à Google, Bing et Yandex à la publication.</p>
859
+ </div>
860
+ </div>
861
+ </div>
862
+ </div>
863
+ <?php
864
+ }
865
+
811
866
  public function render_shortcodes_view() {
812
867
  ?>
813
868
  <div class="wrap" style="max-width:1040px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
@@ -897,4 +952,4 @@ class LynxSeoMasterEnterprisePlugin {
897
952
  }
898
953
  }
899
954
 
900
- new LynxSeoMasterEnterprisePlugin();
955
+ new LynxSeoUltimateEnterprisePlugin();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lynxflow/seo-engine",
3
- "version": "1.7.1",
3
+ "version": "1.7.2",
4
4
  "description": "High-Performance Multilingual Programmatic SEO & AI Search Engine SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",