<?php /** * Plugin Name: Gemici Daily SEO Automation * Description: Publishes one German SEO-focused blog post per day with category assignment and featured image. * Version: 1.0.2 * Author: Gemici Automation */ if (!defined('ABSPATH')) { exit; } final class Gemici_Daily_SEO_Automation { private const HOOK = 'gemici_daily_seo_generate_post'; private const LOG_PREFIX = '[GemiciDailySEO]'; private const DAILY_META_KEY = '_gemici_daily_seo_date'; private const CATCHUP_LOCK = 'gemici_daily_seo_catchup_lock'; private static array $topic_pool = [ ['keyword' => 'kappadokien reisetipps', 'wiki' => 'Kappadokien', 'category' => 'Reise und Kultur'], ['keyword' => 'seo grundlagen', 'wiki' => 'Suchmaschinenoptimierung', 'category' => 'SEO'], ['keyword' => 'digitale transformation mittelstand', 'wiki' => 'Digitale Transformation', 'category' => 'Digitalisierung'], ['keyword' => 'e-commerce trends', 'wiki' => 'Elektronischer Handel', 'category' => 'Ecommerce'], ['keyword' => 'kuenstliche intelligenz im alltag', 'wiki' => 'Künstliche Intelligenz', 'category' => 'Künstliche Intelligenz'], ['keyword' => 'content marketing strategie', 'wiki' => 'Content-Marketing', 'category' => 'Marketing'], ['keyword' => 'fotografie tipps', 'wiki' => 'Fotografie', 'category' => 'Fotografie'], ['keyword' => 'immobilienmarkt deutschland', 'wiki' => 'Immobilienwirtschaft', 'category' => 'Immobilien'], ['keyword' => 'finanzplanung fuer einsteiger', 'wiki' => 'Finanzplanung', 'category' => 'Finanzen'], ['keyword' => 'webdesign trends', 'wiki' => 'Webdesign', 'category' => 'Design'], ]; public static function init(): void { add_action('init', [self::class, 'ensure_schedule']); add_action('init', [self::class, 'maybe_catchup_on_traffic'], 20); add_action(self::HOOK, [self::class, 'run_daily']); if (defined('WP_CLI') && WP_CLI) { WP_CLI::add_command('gemici-seo', [self::class, 'cli_command']); } } public static function activate(): void { self::schedule_event(); } public static function deactivate(): void { wp_clear_scheduled_hook(self::HOOK); } public static function ensure_schedule(): void { if (!wp_next_scheduled(self::HOOK)) { self::schedule_event(); } } public static function maybe_catchup_on_traffic(): void { if (defined('WP_CLI') && WP_CLI) { return; } if (get_transient(self::CATCHUP_LOCK)) { return; } $today = wp_date('Y-m-d'); if (self::already_published_for_date($today)) { return; } $now = new DateTime('now', wp_timezone()); $threshold = new DateTime('today 06:15:00', wp_timezone()); if ($now < $threshold) { return; } set_transient(self::CATCHUP_LOCK, '1', 10 * MINUTE_IN_SECONDS); self::log('Catch-up run triggered from site traffic.'); self::run_daily(false); delete_transient(self::CATCHUP_LOCK); } public static function run_daily(bool $force = false): void { $today = wp_date('Y-m-d'); if (!$force && self::already_published_for_date($today)) { self::log('Skipped run: post already exists for ' . $today); return; } $topic = self::pick_topic_for_date($today); $summary_data = self::fetch_wikipedia_summary($topic['wiki']); $title = self::build_title($topic, $summary_data); $content = self::build_content($topic, $summary_data, $today); $excerpt = self::build_excerpt($summary_data, $topic['keyword']); $category_id = self::ensure_category($topic['category']); $post_id = wp_insert_post([ 'post_title' => $title, 'post_content' => $content, 'post_excerpt' => $excerpt, 'post_status' => 'publish', 'post_type' => 'post', 'post_category' => [$category_id], ], true); if (is_wp_error($post_id)) { self::log('Post creation failed: ' . $post_id->get_error_message()); return; } update_post_meta($post_id, self::DAILY_META_KEY, $today); update_post_meta($post_id, '_gemici_daily_seo_keyword', $topic['keyword']); update_post_meta($post_id, 'rank_math_focus_keyword', $topic['keyword']); update_post_meta($post_id, 'rank_math_description', $excerpt); $image_url = self::resolve_image_url($summary_data, $topic['wiki']); if (!empty($image_url)) { $attachment_id = self::attach_featured_image($post_id, $image_url, $title); if ($attachment_id > 0) { self::log('Attached featured image ID ' . $attachment_id . ' to post ID ' . $post_id); } } self::log('Created post ID ' . $post_id . ' for date ' . $today . ' with keyword "' . $topic['keyword'] . '"'); } public static function cli_command(array $args, array $assoc_args): void { $subcommand = $args[0] ?? 'status'; if ($subcommand === 'run') { $force = isset($assoc_args['force']) || isset($assoc_args['f']); self::run_daily($force); WP_CLI::success('Gemici daily SEO run finished.'); return; } $next_run = wp_next_scheduled(self::HOOK); if (!$next_run) { WP_CLI::line('No schedule found. Creating one now.'); self::schedule_event(); $next_run = wp_next_scheduled(self::HOOK); } WP_CLI::line('Next run: ' . wp_date('Y-m-d H:i:s T', (int) $next_run)); WP_CLI::line('Catch-up mode: enabled (runs once daily on first traffic after 06:15 local time if WP-Cron misses).'); } private static function schedule_event(): void { if (wp_next_scheduled(self::HOOK)) { return; } $timezone = wp_timezone(); $now = new DateTime('now', $timezone); $next = new DateTime('today 06:15:00', $timezone); if ($now >= $next) { $next->modify('+1 day'); } wp_schedule_event($next->getTimestamp(), 'daily', self::HOOK); self::log('Scheduled daily event for ' . $next->format('Y-m-d H:i:s T')); } private static function already_published_for_date(string $date): bool { $query = new WP_Query([ 'post_type' => 'post', 'post_status' => ['publish', 'draft', 'future', 'pending'], 'posts_per_page' => 1, 'meta_query' => [ [ 'key' => self::DAILY_META_KEY, 'value' => $date, 'compare' => '=', ], ], 'fields' => 'ids', ]); return !empty($query->posts); } private static function pick_topic_for_date(string $date): array { $day_of_year = (int) wp_date('z', strtotime($date)); $index = $day_of_year % count(self::$topic_pool); return self::$topic_pool[$index]; } private static function fetch_wikipedia_summary(string $page_title): array { $endpoint = 'https://de.wikipedia.org/api/rest_v1/page/summary/' . rawurlencode($page_title); $response = wp_remote_get($endpoint, ['timeout' => 20]); if (is_wp_error($response)) { self::log('Wikipedia request failed: ' . $response->get_error_message()); return []; } $status = wp_remote_retrieve_response_code($response); if ($status !== 200) { self::log('Wikipedia request returned HTTP ' . $status . ' for page ' . $page_title); return []; } $body = wp_remote_retrieve_body($response); $data = json_decode($body, true); if (!is_array($data)) { self::log('Wikipedia response parsing failed for page ' . $page_title); return []; } return [ 'title' => isset($data['title']) ? sanitize_text_field($data['title']) : $page_title, 'extract' => isset($data['extract']) ? wp_kses_post($data['extract']) : '', 'url' => isset($data['content_urls']['desktop']['page']) ? esc_url_raw($data['content_urls']['desktop']['page']) : '', 'thumbnail' => isset($data['thumbnail']['source']) ? esc_url_raw($data['thumbnail']['source']) : '', 'originalimage' => isset($data['originalimage']['source']) ? esc_url_raw($data['originalimage']['source']) : '', ]; } private static function build_title(array $topic, array $summary_data): string { $base = !empty($summary_data['title']) ? $summary_data['title'] : ucwords(str_replace('-', ' ', $topic['keyword'])); return $base . ': Praxiswissen und Tipps fuer 2026'; } private static function build_excerpt(array $summary_data, string $keyword): string { if (!empty($summary_data['extract'])) { return wp_trim_words(wp_strip_all_tags($summary_data['extract']), 28, ' ...'); } return 'Erfahren Sie die wichtigsten Grundlagen und praxisnahen Tipps zum Thema ' . $keyword . ' in deutscher Sprache.'; } private static function build_content(array $topic, array $summary_data, string $date): string { $extract = !empty($summary_data['extract']) ? wp_kses_post($summary_data['extract']) : 'In diesem Beitrag beleuchten wir die wichtigsten Grundlagen, Chancen und praktische Handlungsempfehlungen.'; $source_line = ''; if (!empty($summary_data['url'])) { $source_line = '<p><em>Quelle zur Vertiefung: <a href="' . esc_url($summary_data['url']) . '" target="_blank" rel="noopener">Wikipedia</a></em></p>'; } $keyword = esc_html($topic['keyword']); $today_human = esc_html(wp_date('d.m.Y', strtotime($date))); return " <h2>Was ist {$keyword}?</h2> <p>{$extract}</p> <h2>Warum ist dieses Thema 2026 wichtig?</h2> <p>Die digitale Entwicklung, veraenderte Nutzererwartungen und staerkere Konkurrenz machen es notwendig, {$keyword} strategisch und nachhaltig umzusetzen. Unternehmen und Selbststaendige profitieren vor allem dann, wenn sie Inhalte mit echtem Mehrwert, klarer Struktur und einem konkreten Nutzen fuer ihre Zielgruppe liefern.</p> <h2>3 konkrete Tipps fuer die Umsetzung</h2> <ul> <li><strong>Analyse:</strong> Definieren Sie ein klares Ziel und messen Sie relevante Kennzahlen.</li> <li><strong>Struktur:</strong> Nutzen Sie gut gegliederte Zwischenueberschriften und beantworten Sie typische Nutzerfragen.</li> <li><strong>Kontinuitaet:</strong> Veroeffentlichen Sie regelmaessig neue, hochwertige Inhalte und aktualisieren Sie bestehende Beitraege.</li> </ul> <h2>Fazit</h2> <p>Mit einem klaren Plan und konsequenter Umsetzung wird {$keyword} zu einem nachhaltigen Wachstumstreiber. Dieser Beitrag wurde automatisch am {$today_human} erstellt und SEO-orientiert fuer gemici.de aufbereitet.</p> {$source_line} "; } private static function ensure_category(string $category_name): int { $term = term_exists($category_name, 'category'); if (!$term) { $term = wp_insert_term($category_name, 'category'); } if (is_wp_error($term)) { self::log('Category resolution failed: ' . $term->get_error_message() . ' - falling back to Uncategorized'); return 1; } if (is_array($term) && isset($term['term_id'])) { return (int) $term['term_id']; } return (int) $term; } private static function resolve_image_url(array $summary_data, string $fallback_keyword): string { if (!empty($summary_data['originalimage'])) { return $summary_data['originalimage']; } if (!empty($summary_data['thumbnail'])) { return $summary_data['thumbnail']; } $commons_image = self::fetch_wikimedia_image($fallback_keyword); if (!empty($commons_image)) { return $commons_image; } return 'https://picsum.photos/seed/' . rawurlencode(strtolower(str_replace(' ', '-', $fallback_keyword))) . '/1600/900.jpg'; } private static function fetch_wikimedia_image(string $keyword): string { $endpoint = add_query_arg([ 'action' => 'query', 'generator' => 'search', 'gsrsearch' => $keyword, 'gsrnamespace' => 6, 'gsrlimit' => 1, 'prop' => 'imageinfo', 'iiprop' => 'url', 'iiurlwidth' => 1600, 'format' => 'json', 'formatversion' => 2, ], 'https://commons.wikimedia.org/w/api.php'); $response = wp_remote_get($endpoint, ['timeout' => 20]); if (is_wp_error($response)) { self::log('Wikimedia request failed: ' . $response->get_error_message()); return ''; } if (wp_remote_retrieve_response_code($response) !== 200) { return ''; } $data = json_decode(wp_remote_retrieve_body($response), true); if (!is_array($data) || empty($data['query']['pages'][0]['imageinfo'][0])) { return ''; } $image_info = $data['query']['pages'][0]['imageinfo'][0]; $url = $image_info['thumburl'] ?? ($image_info['url'] ?? ''); return is_string($url) ? esc_url_raw($url) : ''; } private static function attach_featured_image(int $post_id, string $image_url, string $title): int { require_once ABSPATH . 'wp-admin/includes/media.php'; require_once ABSPATH . 'wp-admin/includes/file.php'; require_once ABSPATH . 'wp-admin/includes/image.php'; $attachment_id = media_sideload_image($image_url, $post_id, $title, 'id'); if (is_wp_error($attachment_id)) { self::log('Image sideload failed: ' . $attachment_id->get_error_message() . ' URL: ' . $image_url); return 0; } set_post_thumbnail($post_id, (int) $attachment_id); return (int) $attachment_id; } private static function log(string $message): void { $line = gmdate('c') . ' ' . self::LOG_PREFIX . ' ' . $message; error_log($line); $upload_dir = wp_upload_dir(); if (!empty($upload_dir['basedir'])) { $log_file = trailingslashit($upload_dir['basedir']) . 'gemici-seo-automation.log'; file_put_contents($log_file, $line . PHP_EOL, FILE_APPEND); } } } register_activation_hook(__FILE__, ['Gemici_Daily_SEO_Automation', 'activate']); register_deactivation_hook(__FILE__, ['Gemici_Daily_SEO_Automation', 'deactivate']); Gemici_Daily_SEO_Automation::init(); Kommentare zu: Künstliche Intelligenz: Praxiswissen und Tipps fuer 2026 https://gemici.de/kuenstliche-intelligenz-praxiswissen-und-tipps-fuer-2026/ Generalist aus Leidenschaft Sat, 25 Apr 2026 06:41:30 +0000 hourly 1 https://wordpress.org/?v=6.9.4