Plugin Name: Bildimport Abschnitte * Plugin URI: https://muhsin.de * Description: v3.2 FIXED: Komplett korrigierte H2-Bild-Injection für beide Modi - Tiefgreifende Bug-Fixes * Version: 3.2.0 * Author: Muhsin * Author URI: https://muhsin.de * License: GPL v2 or later * License URI: https://www.gnu.org/licenses/gpl-2.0.html * Text Domain: bildimport-abschnitte * Network: false * Requires at least: 5.0 * Tested up to: 6.5 * Requires PHP: 7.4 */ if (!defined('ABSPATH')) { exit('Direct access not permitted.'); } // ===================================================================== // HOOKS & CRON-JOBS // ===================================================================== register_activation_hook(__FILE__, 'bia_activate_plugin'); function bia_activate_plugin() { if (!wp_next_scheduled('bia_batch_processing_hook')) { wp_schedule_event(time(), 'hourly', 'bia_batch_processing_hook'); } } register_deactivation_hook(__FILE__, 'bia_deactivate_plugin'); function bia_deactivate_plugin() { wp_clear_scheduled_hook('bia_batch_processing_hook'); wp_unschedule_hook('bia_fetch_image_hook'); } add_action('bia_batch_processing_hook', 'bia_process_batch_of_old_posts'); add_action('bia_fetch_image_hook', 'bia_fetch_and_process_pending_image', 10, 1); add_action('publish_post', 'bia_trigger_for_post', 10, 1); add_action('wp_ajax_bia_manual_trigger', 'bia_handle_manual_trigger'); add_action('admin_menu', function() { add_menu_page( 'Bildimport Steuerung', 'Bildimport', 'manage_options', 'bildimport-abschnitte', 'bia_render_admin_page', 'dashicons-camera-alt' ); }); // ===================================================================== // KERNFUNKTIONEN // ===================================================================== /** * Ermittelt die aktuelle Strategie basierend auf Tageszeit */ function bia_get_current_s3_strategy() { $tz = get_option('timezone_string') ?: 'UTC'; $h = (new DateTime('now', new DateTimeZone($tz)))->format('H'); if ($h >= 8 && $h < 18) { return ['mode' => 'TAG', 'icon' => '☀️', 'immediate' => true]; } else { return ['mode' => 'NACHT', 'icon' => '🌙', 'immediate' => false]; } } /** * Holt API-Keys aus wp-config.php */ function get_api_keys_bildimport_unique() { return [ 'BILDIMPORT_API_KEY' => defined('BILDIMPORT_API_KEY') ? BILDIMPORT_API_KEY : '', 'OPENAI_API_KEY' => defined('OPENAI_API_KEY') ? OPENAI_API_KEY : '', 'AWS_ACCESS_KEY_ID' => defined('AWS_ACCESS_KEY_ID') ? AWS_ACCESS_KEY_ID : '', 'AWS_SECRET_ACCESS_KEY' => defined('AWS_SECRET_ACCESS_KEY') ? AWS_SECRET_ACCESS_KEY : '', 'MODELSLAB_S3_BUCKET' => defined('MODELSLAB_S3_BUCKET') ? MODELSLAB_S3_BUCKET : '', 'MODELSLAB_S3_REGION' => defined('MODELSLAB_S3_REGION') ? MODELSLAB_S3_REGION : 'eu-central-1' ]; } /** * Stündlicher Cron-Job für alte Beiträge */ function bia_process_batch_of_old_posts() { write_abschnitte_log_unique('INFO', "[BATCH] Starte stündlichen Cron-Job zur Verarbeitung alter Beiträge."); $posts_to_process = get_posts([ 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => 5, 'meta_query' => [['key' => '_bia_process_status_v3', 'compare' => 'NOT EXISTS']] ]); if (empty($posts_to_process)) { write_abschnitte_log_unique('INFO', "[BATCH] Keine unverarbeiteten Beiträge gefunden."); return; } foreach ($posts_to_process as $post) { bia_trigger_for_post($post->ID); sleep(5); } } /** * Trigger für einzelnen Post */ function bia_trigger_for_post($post_id) { if (get_post_meta($post_id, '_bia_process_status_v3', true)) { return; } update_post_meta($post_id, '_bia_process_status_v3', 'processing_' . time()); bia_main_processor($post_id); } /** * HAUPTPROZESSOR - Verarbeitet H1 und H2 Bilder (KOMPLETT KORRIGIERT v3.2) */ function bia_main_processor($post_id) { $strategy = bia_get_current_s3_strategy(); write_abschnitte_log_unique('INFO', "===== Starte BIA v3.2 für Post ID: {$post_id} im {$strategy['icon']} {$strategy['mode']}-MODUS ====="); $post = get_post($post_id); if (!$post) return; // H1 BILD - Immer als Beitragsbild if (!has_post_thumbnail($post_id)) { write_abschnitte_log_unique('INFO', "[H1] Generiere Beitragsbild für: " . substr($post->post_title, 0, 50)); bia_process_h1_image($post_id, $post->post_title); } else { write_abschnitte_log_unique('INFO', "[H1] Beitragsbild bereits vorhanden - überspringe"); } sleep(2); // H2 BILDER - VEREINFACHTE EINHEITLICHE LOGIK $content = $post->post_content; $h2_count = 0; $content_changed = false; write_abschnitte_log_unique('INFO', "[PROCESSOR] Starte H2-Verarbeitung mit vereinfachter Logik"); // VEREINFACHTE EINHEITLICHE VERARBEITUNG $updated_content = preg_replace_callback('/