' . '' . ''; return 'data:image/svg+xml;base64,' . base64_encode( $svg ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode } public function register() { register_setting( 'nanoconsent', Nanoconsent_Settings::OPTION, array( 'type' => 'array', 'sanitize_callback' => array( 'Nanoconsent_Settings', 'sanitize' ), 'default' => Nanoconsent_Settings::defaults(), ) ); } /** * "Skannaa nyt" -painike: nonce-suojattu GET, jonka jalkeen ohjataan * takaisin ilman parametria, jotta paivitys ei toista skannausta. */ public function actions() { $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( 0 !== strpos( $page, self::SLUG ) ) { return; } if ( ! current_user_can( 'manage_options' ) ) { return; } // Lokin vienti CSV:na. Nonce + oikeus; tiedosto lahtee suoraan. if ( isset( $_GET['nanoconsent_export'] ) && check_admin_referer( 'nanoconsent_export' ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended Nanoconsent_Log::export_csv(); } if ( isset( $_GET['nanoconsent_scan'] ) && self::SLUG === $page && check_admin_referer( 'nanoconsent_scan' ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended Nanoconsent_Health::get( true ); wp_safe_redirect( admin_url( 'admin.php?page=' . self::SLUG . '&nanoconsent_scanned=1' ) ); exit; } } public static function export_url() { return wp_nonce_url( admin_url( 'admin.php?page=' . self::SLUG . '&nanoconsent_export=1' ), 'nanoconsent_export' ); } public function assets( $hook ) { if ( false === strpos( $hook, self::SLUG ) ) { return; } // Kirjasimia EI haeta ulkoa. Hallintasivu on osa tuotetta, joka lupaa // ettei mihinkaan oteta yhteytta - ja WordPress.orgin saanto 7 kieltaa // ulkoiset pyynnot ilman nimenomaista lupaa. admin.css kayttaa // jarjestelman omia kirjasimia (Segoe UI, system-ui, ui-monospace). // ⚠ Versionumero valimuistin ohitukseen on tiedoston MUOKKAUSAIKA, ei // lisaosan versio. 7.9.2026 kayttaja naki tyylittoman navigaation, // koska selain tarjosi vanhan admin.css:n samalla ?ver=0.1.0- // parametrilla. Muokkausaika muuttuu joka kerta kun tiedosto muuttuu. $css_v = (string) filemtime( NANOCONSENT_DIR . 'admin/admin.css' ); $js_v = (string) filemtime( NANOCONSENT_DIR . 'admin/admin.js' ); wp_enqueue_style( 'nanoconsent-admin', NANOCONSENT_URL . 'admin/admin.css', array(), $css_v ); wp_enqueue_script( 'nanoconsent-admin', NANOCONSENT_URL . 'admin/admin.js', array(), $js_v, true ); wp_localize_script( 'nanoconsent-admin', 'nanoconsentAdmin', array( // Esikatselu lataa saman kielitiedoston kuin livesivu: // bannerBase + 'nanoconsent..min.js'. 'bannerBase' => NANOCONSENT_URL . 'assets/', 'ver' => NANOCONSENT_VERSION, 'langs' => array_keys( Nanoconsent_Settings::languages() ), // Esikatselun "auto" = sivuston kieli, sama kuin livesivulla. 'siteLang' => Nanoconsent_Settings::banner_lang( array( 'lang' => 'auto' ) ), ) ); } public function links( $links ) { array_unshift( $links, '' . esc_html__( 'Settings', 'nanoconsent' ) . '' ); return $links; } public function dashboard() { if ( ! current_user_can( 'manage_options' ) ) { return; } require NANOCONSENT_DIR . 'admin/dashboard.php'; } public function settings() { if ( ! current_user_can( 'manage_options' ) ) { return; } require NANOCONSENT_DIR . 'admin/settings.php'; } /** * Sisainen navigaatio sivujen ylaosaan. WordPressin oma alavalikko on * vasemmalla ja pieni; yllapitaja ei loyda sita ensimmaisella kerralla. */ public static function nav( $active ) { $items = array( self::SLUG => __( 'Overview', 'nanoconsent' ), self::SLUG . '-settings' => __( 'Settings', 'nanoconsent' ), ); $out = ''; } /** * Sanamerkki keksilla, sama kuin tunnuksessa. Kaytetaan sivujen * ylatunnisteessa. Jost 400, keksi 0,46 em, marginaali 0,0355 em - * mitat brand/TUNNUS.md:sta, ei arvattuja. */ public static function wordmark() { return 'nanconsent'; } }