post_content, 'business_forum' ) ) { $classes[] = 'wbf-forum-page'; } return $classes; }); // ── Cron: Abgelaufene Sperren aufheben ──────────────────────────────────────── add_action( 'wbf_check_expired_bans', function() { WBF_DB::check_expired_bans(); } ); if ( ! wp_next_scheduled( 'wbf_check_expired_bans' ) ) { wp_schedule_event( time(), 'hourly', 'wbf_check_expired_bans' ); } register_deactivation_hook( __FILE__, function() { wp_clear_scheduled_hook( 'wbf_check_expired_bans' ); wp_clear_scheduled_hook( 'wbf_check_for_updates' ); } ); // ── Forum-URL Hilfsfunktion ─────────────────────────────────────────────────── function wbf_get_forum_url() { // 1. Gespeicherte Seite aus dem Setup-Wizard $page_id = get_option('wbf_forum_page_id'); if ( $page_id ) { $url = get_permalink( $page_id ); if ( $url ) return $url; } // 2. Fallback: Seite mit [business_forum] Shortcode suchen $pages = get_posts([ 'post_type' => 'page', 'post_status' => 'publish', 'posts_per_page' => 1, 's' => 'business_forum', ]); if ( $pages ) return get_permalink( $pages[0]->ID ); // 3. Letzter Fallback: aktuelle Seite return home_url('/'); } // ── Assets ──────────────────────────────────────────────────────────────────── add_action( 'wp_enqueue_scripts', function() { wp_enqueue_style( 'wbf-style', WBF_URL . 'assets/css/forum-style.css', [], WBF_VERSION ); wp_enqueue_script( 'wbf-script', WBF_URL . 'assets/js/forum-script.js', ['jquery'], WBF_VERSION, true ); $wbf_user = WBF_Auth::get_current_user(); if ( $wbf_user ) { WBF_DB::touch_last_active( $wbf_user->id ); } wp_localize_script( 'wbf-script', 'WBF', [ 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('wbf_nonce'), 'logged_in' => WBF_Auth::is_forum_logged_in() ? 'yes' : 'no', 'auto_logout_minutes' => (int)( wbf_get_settings()['auto_logout_minutes'] ?? 30 ), 'my_id' => $wbf_user ? (int)$wbf_user->id : 0, 'unread_dm' => $wbf_user ? WBF_DB::count_unread_messages($wbf_user->id) : 0, 'forum_url' => wbf_get_forum_url(), 'reactions' => WBF_DB::get_allowed_reactions(), ]); }); // ══════════════════════════════════════════════════════════════════════════════ // ── Update-Checker ──────────────────────────────────────────────────────────── // Prüft täglich gegen die Gitea-Releases-API ob eine neue Version verfügbar ist. // Releases-URL: https://git.viper.ipv64.net/M_Viper/WP-Business-Forum/releases // ══════════════════════════════════════════════════════════════════════════════ define( 'WBF_UPDATE_API', 'https://git.viper.ipv64.net/api/v1/repos/M_Viper/WP-Business-Forum/releases?limit=1&page=1' ); define( 'WBF_RELEASES_PAGE', 'https://git.viper.ipv64.net/M_Viper/WP-Business-Forum/releases' ); define( 'WBF_UPDATE_TRANSIENT','wbf_update_check' ); /** * Holt die neueste Release-Info von Gitea (gecacht per Transient, 12h). * Gibt null zurück wenn kein Update verfügbar oder API nicht erreichbar. * * @return array|null ['version'=>string, 'url'=>string, 'name'=>string, 'published'=>string, 'body'=>string] */ function wbf_get_latest_release() { $cached = get_transient( WBF_UPDATE_TRANSIENT ); if ( $cached !== false ) { return $cached ?: null; // false = noch nie gecacht, '' = kein Update } $response = wp_remote_get( WBF_UPDATE_API, [ 'timeout' => 8, 'user-agent' => 'WP-Business-Forum/' . WBF_VERSION . '; ' . get_bloginfo('url'), 'sslverify' => true, ] ); if ( is_wp_error($response) || wp_remote_retrieve_response_code($response) !== 200 ) { // Bei Fehler 1h warten bevor erneut versucht set_transient( WBF_UPDATE_TRANSIENT, '', HOUR_IN_SECONDS ); return null; } $body = wp_remote_retrieve_body( $response ); $releases = json_decode( $body, true ); if ( empty($releases) || ! is_array($releases) || empty($releases[0]) ) { set_transient( WBF_UPDATE_TRANSIENT, '', 12 * HOUR_IN_SECONDS ); return null; } $latest = $releases[0]; $version = ltrim( $latest['tag_name'] ?? '', 'v' ); // "v1.2.0" → "1.2.0" $info = [ 'version' => $version, 'url' => $latest['html_url'] ?? WBF_RELEASES_PAGE, 'name' => $latest['name'] ?? $latest['tag_name'] ?? $version, 'published' => $latest['published_at'] ?? '', 'body' => wp_strip_all_tags( $latest['body'] ?? '' ), ]; // 12 Stunden cachen set_transient( WBF_UPDATE_TRANSIENT, $info, 12 * HOUR_IN_SECONDS ); return $info; } /** * Prüft ob ein Update verfügbar ist. * Gibt die Release-Info zurück wenn Gitea-Version > installierte Version. */ function wbf_update_available() { $latest = wbf_get_latest_release(); if ( ! $latest || empty($latest['version']) ) return null; if ( version_compare( $latest['version'], WBF_VERSION, '>' ) ) { return $latest; } return null; } // ── Cron: täglich Update prüfen (Cache warm halten) ────────────────────────── add_action( 'wbf_check_for_updates', function() { delete_transient( WBF_UPDATE_TRANSIENT ); wbf_get_latest_release(); } ); if ( ! wp_next_scheduled( 'wbf_check_for_updates' ) ) { wp_schedule_event( time(), 'twicedaily', 'wbf_check_for_updates' ); } // ── Admin-Notice wenn Update verfügbar ─────────────────────────────────────── add_action( 'admin_notices', function() { if ( ! current_user_can('manage_options') ) return; $update = wbf_update_available(); if ( ! $update ) return; // Notice ausblenden wenn der User sie weggeklickt hat (per GET-Parameter) if ( isset($_GET['wbf_dismiss_update']) && check_admin_referer('wbf_dismiss_update') ) { set_transient( 'wbf_update_dismissed_' . WBF_VERSION, $update['version'], 7 * DAY_IN_SECONDS ); wp_safe_redirect( remove_query_arg(['wbf_dismiss_update','_wpnonce']) ); exit; } $dismissed = get_transient( 'wbf_update_dismissed_' . WBF_VERSION ); if ( $dismissed === $update['version'] ) return; $dismiss_url = wp_nonce_url( add_query_arg('wbf_dismiss_update', '1'), 'wbf_dismiss_update' ); $changelog_url = esc_url( $update['url'] ); $new_ver = esc_html( $update['version'] ); $cur_ver = esc_html( WBF_VERSION ); echo "
🔔
WP Business Forum — Update verfügbar!

Version {$new_ver} ist verfügbar. Du verwendest {$cur_ver}.

📋 Changelog & Download Später erinnern
"; } ); // ── Update-Badge im WP-Admin-Menü ───────────────────────────────────────────── add_action( 'admin_menu', function() { $update = wbf_update_available(); if ( ! $update ) return; global $menu; if ( ! is_array($menu) ) return; foreach ( $menu as &$item ) { if ( isset($item[2]) && $item[2] === 'wbf-admin' ) { $item[0] .= ' 1'; break; } } }, 999 ); // ── Manuellen Cache-Reset erlauben (für die Admin-UI) ───────────────────────── add_action( 'admin_init', function() { if ( ! isset($_GET['wbf_refresh_update']) ) return; if ( ! current_user_can('manage_options') ) return; if ( ! check_admin_referer('wbf_refresh_update') ) return; delete_transient( WBF_UPDATE_TRANSIENT ); wp_safe_redirect( remove_query_arg(['wbf_refresh_update','_wpnonce']) ); exit; } );