{"slug":"easy-content-linker-lite","name":"Easy Content Linker Lite","description":"AI-powered internal linking recommendations for WordPress. Semantic analysis with OpenAI embeddings and intelligent anchor suggestions via GPT.","author":"Baptiste Guiraud","active_installs":20,"version":"1.1.1","wp_org_url":"https://wordpress.org/plugins/easy-content-linker-lite/","is_closed":false,"cleanup":{"has_uninstall_hook":true,"drops_tables_on_uninstall":true,"deletes_options_on_uninstall":true},"tables":[{"table_name":"ecl_lite_embeddings","full_table_name":"wp_ecl_lite_embeddings","description":"Stores ecl lite embeddings data created by this plugin.","detection_method":"static","confidence":"high","columns":[{"name":"id","type":"BIGINT(20) UNSIGNED","nullable":false,"primary_key":true},{"name":"post_id","type":"BIGINT(20) UNSIGNED","nullable":false,"primary_key":false},{"name":"embedding","type":"LONGTEXT","nullable":false,"primary_key":false},{"name":"content_hash","type":"VARCHAR(32)","nullable":false,"primary_key":false},{"name":"created_at","type":"DATETIME","nullable":true,"primary_key":false},{"name":"updated_at","type":"DATETIME","nullable":true,"primary_key":false},{"name":"source_post_id","type":"BIGINT(20) UNSIGNED","nullable":false,"primary_key":false},{"name":"target_post_id","type":"BIGINT(20) UNSIGNED","nullable":false,"primary_key":false},{"name":"anchor_text","type":"VARCHAR(255)","nullable":false,"primary_key":false},{"name":"similarity_score","type":"FLOAT","nullable":true,"primary_key":false},{"name":"status","type":"VARCHAR(20)","nullable":true,"primary_key":false},{"name":"created_at","type":"DATETIME","nullable":true,"primary_key":false},{"name":"updated_at","type":"DATETIME","nullable":true,"primary_key":false},{"name":"post_id","type":"BIGINT(20) UNSIGNED","nullable":false,"primary_key":false},{"name":"action","type":"VARCHAR(50)","nullable":false,"primary_key":false},{"name":"details","type":"TEXT","nullable":true,"primary_key":false},{"name":"created_at","type":"DATETIME","nullable":true,"primary_key":false},{"name":"post_id","type":"BIGINT(20) UNSIGNED","nullable":false,"primary_key":false},{"name":"action","type":"VARCHAR(50)","nullable":false,"primary_key":false},{"name":"priority","type":"INT","nullable":true,"primary_key":false},{"name":"status","type":"VARCHAR(20)","nullable":true,"primary_key":false},{"name":"attempts","type":"INT","nullable":true,"primary_key":false},{"name":"error_message","type":"TEXT","nullable":true,"primary_key":false},{"name":"started_at","type":"DATETIME","nullable":true,"primary_key":false},{"name":"created_at","type":"DATETIME","nullable":true,"primary_key":false},{"name":"updated_at","type":"DATETIME","nullable":true,"primary_key":false}],"create_sql":"CREATE TABLE IF NOT EXISTS wp_ecl_lite_embeddings ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, post_id BIGINT(20) UNSIGNED NOT NULL, embedding LONGTEXT NOT NULL, content_hash VARCHAR(32) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY post_id (post_id), KEY content_hash (content_hash) ) {$charset_collate};\"; // Links table $sql[] = \"CREATE TABLE IF NOT EXISTS wp_ecl_lite_links ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, source_post_id BIGINT(20) UNSIGNED NOT NULL, target_post_id BIGINT(20) UNSIGNED NOT NULL, anchor_text VARCHAR(255) NOT NULL, similarity_score FLOAT DEFAULT 0, status VARCHAR(20) DEFAULT 'active', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY source_post_id (source_post_id), KEY target_post_id (target_post_id), KEY status (status), UNIQUE KEY unique_link (source_post_id, target_post_id, anchor_text(100)) ) {$charset_collate};\"; // History table $sql[] = \"CREATE TABLE IF NOT EXISTS wp_ecl_lite_history ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, post_id BIGINT(20) UNSIGNED NOT NULL, action VARCHAR(50) NOT NULL, details TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY post_id (post_id), KEY action (action) ) {$charset_collate};\"; // Queue table $sql[] = \"CREATE TABLE IF NOT EXISTS wp_ecl_lite_queue ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, post_id BIGINT(20) UNSIGNED NOT NULL, action VARCHAR(50) NOT NULL, priority INT DEFAULT 5, status VARCHAR(20) DEFAULT 'pending', attempts INT DEFAULT 0, error_message TEXT, started_at DATETIME DEFAULT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY post_id (post_id), KEY status (status), KEY priority (priority) ) {$charset_collate};\"; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; foreach ( $sql as $query ) { dbDelta( $query );"},{"table_name":"ecl_lite_history","full_table_name":"wp_ecl_lite_history","description":"Stores ecl lite history data created by this plugin.","detection_method":"static","confidence":"high","columns":[],"create_sql":"CREATE TABLE `wp_ecl_lite_history` (\\n  `id` bigint unsigned NOT NULL AUTO_INCREMENT,\\n  `post_id` bigint unsigned NOT NULL,\\n  `action` varchar(50) COLLATE utf8mb4_unicode_520_ci NOT NULL,\\n  `details` text COLLATE utf8mb4_unicode_520_ci,\\n  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,\\n  PRIMARY KEY (`id`),\\n  KEY `post_id` (`post_id`),\\n  KEY `action` (`action`)\\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci"},{"table_name":"ecl_lite_links","full_table_name":"wp_ecl_lite_links","description":"Stores ecl lite links data created by this plugin.","detection_method":"static","confidence":"high","columns":[],"create_sql":"CREATE TABLE `wp_ecl_lite_links` (\\n  `id` bigint unsigned NOT NULL AUTO_INCREMENT,\\n  `source_post_id` bigint unsigned NOT NULL,\\n  `target_post_id` bigint unsigned NOT NULL,\\n  `anchor_text` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL,\\n  `similarity_score` float DEFAULT '0',\\n  `status` varchar(20) COLLATE utf8mb4_unicode_520_ci DEFAULT 'active',\\n  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,\\n  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\\n  PRIMARY KEY (`id`),\\n  UNIQUE KEY `unique_link` (`source_post_id`,`target_post_id`,`anchor_text`(100)),\\n  KEY `source_post_id` (`source_post_id`),\\n  KEY `target_post_id` (`target_post_id`),\\n  KEY `status` (`status`)\\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci"},{"table_name":"ecl_lite_queue","full_table_name":"wp_ecl_lite_queue","description":"A job queue table for managing background tasks and scheduled operations.","detection_method":"static","confidence":"high","columns":[],"create_sql":"CREATE TABLE `wp_ecl_lite_queue` (\\n  `id` bigint unsigned NOT NULL AUTO_INCREMENT,\\n  `post_id` bigint unsigned NOT NULL,\\n  `action` varchar(50) COLLATE utf8mb4_unicode_520_ci NOT NULL,\\n  `priority` int DEFAULT '5',\\n  `status` varchar(20) COLLATE utf8mb4_unicode_520_ci DEFAULT 'pending',\\n  `attempts` int DEFAULT '0',\\n  `error_message` text COLLATE utf8mb4_unicode_520_ci,\\n  `started_at` datetime DEFAULT NULL,\\n  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,\\n  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\\n  PRIMARY KEY (`id`),\\n  KEY `post_id` (`post_id`),\\n  KEY `status` (`status`),\\n  KEY `priority` (`priority`)\\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci"}],"table_count":4}