diff --git a/includes/class-peptide-news-activator.php b/includes/class-peptide-news-activator.php new file mode 100644 index 0000000..005f934 --- /dev/null +++ b/includes/class-peptide-news-activator.php @@ -0,0 +1,135 @@ +get_charset_collate(); + + // Articles table — stores fetched news data for analysis. + $articles_table = $wpdb->prefix . 'peptide_news_articles'; + $sql_articles = "CREATE TABLE {$articles_table} ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + source VARCHAR(100) NOT NULL DEFAULT '', + source_url VARCHAR(2048) NOT NULL DEFAULT '', + title TEXT NOT NULL, + excerpt TEXT NOT NULL, + content LONGTEXT NOT NULL DEFAULT '', + author VARCHAR(255) NOT NULL DEFAULT '', + thumbnail_url VARCHAR(2048) NOT NULL DEFAULT '', + published_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + fetched_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + categories VARCHAR(500) NOT NULL DEFAULT '', + tags VARCHAR(500) NOT NULL DEFAULT '', + language VARCHAR(10) NOT NULL DEFAULT 'en', + sentiment_score FLOAT DEFAULT NULL, + hash VARCHAR(64) NOT NULL DEFAULT '', + is_active TINYINT(1) NOT NULL DEFAULT 1, + PRIMARY KEY (id), + UNIQUE KEY hash (hash), + KEY idx_published (published_at), + KEY idx_source (source), + KEY idx_active_published (is_active, published_at) + ) {$charset_collate};"; + + // Click analytics table — one row per click event. + $clicks_table = $wpdb->prefix . 'peptide_news_clicks'; + $sql_clicks = "CREATE TABLE {$clicks_table} ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + article_id BIGINT(20) UNSIGNED NOT NULL, + clicked_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + user_ip VARCHAR(45) NOT NULL DEFAULT '', + user_agent TEXT NOT NULL DEFAULT '', + referrer_url VARCHAR(2048) NOT NULL DEFAULT '', + page_url VARCHAR(2048) NOT NULL DEFAULT '', + session_id VARCHAR(64) NOT NULL DEFAULT '', + user_id BIGINT(20) UNSIGNED DEFAULT NULL, + country VARCHAR(2) NOT NULL DEFAULT '', + device_type VARCHAR(20) NOT NULL DEFAULT '', + PRIMARY KEY (id), + KEY idx_article (article_id), + KEY idx_clicked_at (clicked_at), + KEY idx_session (session_id), + KEY idx_article_date (article_id, clicked_at) + ) {$charset_collate};"; + + // Daily aggregates table — for fast trend queries. + $daily_table = $wpdb->prefix . 'peptide_news_daily_stats'; + $sql_daily = "CREATE TABLE {$daily_table} ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + article_id BIGINT(20) UNSIGNED NOT NULL, + stat_date DATE NOT NULL, + click_count INT UNSIGNED NOT NULL DEFAULT 0, + unique_visitors INT UNSIGNED NOT NULL DEFAULT 0, + PRIMARY KEY (id), + UNIQUE KEY idx_article_date (article_id, stat_date), + KEY idx_date (stat_date) + ) {$charset_collate};"; + + require_once ABSPATH . 'wp-admin/includes/upgrade.php'; + + dbDelta( $sql_articles ); + dbDelta( $sql_clicks ); + dbDelta( $sql_daily ); + + update_option( 'peptide_news_db_version', PEPTIDE_NEWS_VERSION ); + } + + /** + * Set sensible default option values. + */ + private static function set_default_options() { + $defaults = array( + 'fetch_interval' => 'twicedaily', + 'articles_count' => 10, + 'newsapi_key' => '', + 'newsapi_enabled' => 0, + 'rss_feeds' => implode( "\n", array( + 'https://news.google.com/rss/search?q=peptide+research&hl=en-US&gl=US&ceid=US:en', + 'https://pubmed.ncbi.nlm.nih.gov/rss/search/1sUlVGjEXm1YN9QiGPblv_-bwB51JCtyLwVX85CVGDKCHFFR9Q/?limit=20&utm_campaign=pubmed-2&fc=20220101000000', + ) ), + 'rss_enabled' => 1, + 'search_keywords' => 'peptide, peptides, peptide therapy, peptide research, BPC-157, Thymosin, GHK-Cu', + 'thumbnail_fallback' => PEPTIDE_NEWS_PLUGIN_URL . 'public/images/default-thumb.png', + 'article_retention' => 90, + 'analytics_retention' => 365, + 'anonymize_ip' => 1, + ); + + foreach ( $defaults as $key => $value ) { + if ( false === get_option( "peptide_news_{$key}" ) ) { + add_option( "peptide_news_{$key}", $value ); + } + } + } + + /** + * Schedule the cron event based on the configured interval. + */ + private static function schedule_cron() { + $interval = get_option( 'peptide_news_fetch_interval', 'twicedaily' ); + + if ( ! wp_next_scheduled( 'peptide_news_cron_fetch' ) ) { + wp_schedule_event( time(), $interval, 'peptide_news_cron_fetch' ); + } + } +}