add_help_tab( array( 'id' => 'wp360-sd-help-basics', 'title' => __( 'What does Security Digest do?', '360-orbit-security-digest' ), 'content' => '

' . __( 'It collects what WordPress already knows about pending core, plugin and theme updates and sends it as one calm digest email — daily, weekly or monthly, as configured — instead of the scattered notices in wp-admin. It has no update-checking mechanism of its own; it only reads WordPress\'s own transients.', '360-orbit-security-digest' ) . '

', ) ); $screen->add_help_tab( array( 'id' => 'wp360-sd-help-nothing', 'title' => __( 'Why did I get no email this week?', '360-orbit-security-digest' ), 'content' => '

' . __( 'If nothing is due at the scheduled time, no email is sent — only a "Nothing due" entry is added to the history below. Use "Send digest now" on the Status tab to test at any time; that always sends, even if nothing is due.', '360-orbit-security-digest' ) . '

', ) ); $screen->add_help_tab( array( 'id' => 'wp360-sd-help-delivery', 'title' => __( 'The digest never arrives — what now?', '360-orbit-security-digest' ), 'content' => '

' . __( 'WordPress only confirms that the email was handed off, not that it actually arrived. Check the Status tab: a reported delivery error shows up there and after every manual test. Most often the cause is a missing SMTP plugin with proper SPF/DKIM for your domain.', '360-orbit-security-digest' ) . '

', ) ); } /** * Deaktivierungs-Rückfrage (README "Suite-übergreifend"): kein Formular, * nur ein kurzer Hinweis vor dem eigentlichen Deaktivieren in der * Plugin-Liste, was dabei aufhoert und was erhalten bleibt. */ public static function enqueue_deactivation_notice_script( $hook ) { if ( 'plugins.php' !== $hook || ! defined( 'WP360_SD_FILE' ) ) { return; } $basename = plugin_basename( WP360_SD_FILE ); $message = __( 'Deactivate Security Digest? The scheduled digest email (and the immediate security alert, Pro) will stop. Your settings, mute list and history stay saved and come back if you reactivate the plugin.', '360-orbit-security-digest' ); // Kein eigenes Script-Tag im Markup (WordPress.org-Richtlinie): ein Handle // ohne Datei, an das der Code per wp_add_inline_script() haengt. wp_register_script( 'wp360-sd-deactivate', false, array(), WP360_SD_VERSION, true ); wp_enqueue_script( 'wp360-sd-deactivate' ); wp_add_inline_script( 'wp360-sd-deactivate', sprintf( '( function () { var row = document.querySelector( %s ); var link = row ? row.querySelector( \'a[href*="action=deactivate"]\' ) : null; if ( ! link ) { return; } link.addEventListener( \'click\', function ( event ) { if ( ! window.confirm( %s ) ) { event.preventDefault(); } } ); } )();', wp_json_encode( 'tr[data-plugin="' . $basename . '"]' ), wp_json_encode( $message ) ) ); } /** * Gesundheitscheck (README "Suite-übergreifend"): traegt zur * gemeinsamen "360 WP Orbit"-Uebersicht bei -- rein lesend, nichts * wird hier ausgeloest. Bewusst am gemeinsamen, nicht praefigierten * Filter 'wp360_orbit_health' registriert (siehe class-orbit-menu.php). */ public static function health_lines( array $lines, $slug ) { if ( '360-orbit-security-digest' !== $slug ) { return $lines; } $history = Wp360_Security_Digest_Digest::history(); $lines[] = $history ? sprintf( /* translators: %s: date of the last sent digest */ __( 'Last digest: %s', '360-orbit-security-digest' ), wp_date( 'd.m.Y', strtotime( $history[0]['sent_at'] ) ) ) : __( 'No digest sent yet.', '360-orbit-security-digest' ); return $lines; } private static function current_tab() { // 'security'/'transfer'/'license' gibt es nur im PRO-Build; FREE zeigt // stattdessen einen einzigen Hinweis-Tab 'pro'. $valid = array( 'status', 'settings', 'pro' ); if ( isset( $_GET['tab'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended $tab = sanitize_key( wp_unslash( $_GET['tab'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( in_array( $tab, $valid, true ) ) { return $tab; } } return 'status'; } public static function enqueue_assets( $hook ) { if ( self::$hook !== $hook ) { return; } wp_enqueue_style( 'wp360-sd-admin', WP360_SD_URL . 'assets/admin.css', array(), WP360_SD_VERSION ); wp_enqueue_script( 'wp360-sd-admin', WP360_SD_URL . 'assets/admin.js', array( 'jquery' ), WP360_SD_VERSION, true ); wp_localize_script( 'wp360-sd-admin', 'wp360UpdateDigest', array( 'ajaxUrl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'wp360_sd_nonce' ), 'strings' => array( 'saved' => __( 'Saved.', '360-orbit-security-digest' ), 'saveError' => __( 'Error while saving.', '360-orbit-security-digest' ), 'sending' => __( 'Sending …', '360-orbit-security-digest' ), 'sendError' => __( 'Error while sending.', '360-orbit-security-digest' ), 'mailError' => __( 'Mail delivery reported an error:', '360-orbit-security-digest' ), 'loading' => __( 'Loading …', '360-orbit-security-digest' ), 'previewError' => __( 'Error while loading the preview.', '360-orbit-security-digest' ), 'days' => __( 'days', '360-orbit-security-digest' ), 'muteFor' => __( 'Mute for', '360-orbit-security-digest' ), ), ) ); } private static function render_tabs( $current_tab ) { $tabs = array( 'status' => __( 'Status', '360-orbit-security-digest' ), 'settings' => __( 'Settings', '360-orbit-security-digest' ), ); // FREE: ein einziger Pro-Tab statt gesperrter Attrappen-Tabs // (WordPress.org-Richtlinie 11: Upgrade-Hinweise sparsam und nur auf // der eigenen Einstellungsseite). $show_pro_tab = true; if ( $show_pro_tab ) { $tabs['pro'] = __( 'Security Digest Pro', '360-orbit-security-digest' ); } ?>

' . esc_html__( 'No plugins muted.', '360-orbit-security-digest' ) . '

'; return; } if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $all_plugins = get_plugins(); ?> $expires ) { ?>

' . esc_html( $label ) . ''; if ( $description ) { echo '

' . esc_html( $description ) . '

'; } } private static function render_settings_tab( array $settings ) { $days = array( 1 => __( 'Monday', '360-orbit-security-digest' ), 2 => __( 'Tuesday', '360-orbit-security-digest' ), 3 => __( 'Wednesday', '360-orbit-security-digest' ), 4 => __( 'Thursday', '360-orbit-security-digest' ), 5 => __( 'Friday', '360-orbit-security-digest' ), 6 => __( 'Saturday', '360-orbit-security-digest' ), 7 => __( 'Sunday', '360-orbit-security-digest' ), ); ?>


360 Orbit ()

-- das steckt hier im Flex-Branding-Block, die Meldung erschiene also neben der Ueberschrift statt darunter. ?>