' .
'' .
'';
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';
}
}