post_content ?? '')))); if ($description === '') return []; // An undefined term must not claim to be defined. $description = function_exists('mb_substr') ? mb_substr($description, 0, 1600, 'UTF-8') : substr($description, 0, 1600); $data = [ '@context' => 'https://schema.org', '@type' => 'DefinedTerm', '@id' => $url . '#defined-term', 'name' => $name, 'description' => $description, 'url' => $url, ]; $archive = get_post_type_archive_link('mkb_glossar'); if (is_string($archive) && preg_match('~^https?://~i', $archive)) $data['inDefinedTermSet'] = $archive; $synonyms = (string)get_post_meta($post_id, 'mkb_glossar_synonyms', true); $alternatives = []; foreach (preg_split('/\r\n|\r|\n/u', $synonyms) ?: [] as $alternative) { $alternative = trim(wp_strip_all_tags($alternative)); if ($alternative !== '' && $alternative !== $name && !in_array($alternative, $alternatives, true)) $alternatives[] = $alternative; if (count($alternatives) >= 30) break; } if ($alternatives) $data['alternateName'] = $alternatives; return apply_filters('mkb_glossar_defined_term_data', $data, $post_id); } function mkb_glossar_print_defined_term_data() { if (is_admin() || is_feed() || !is_singular('mkb_glossar')) return; $options = mkb_glossar_opts(); if (empty($options['schema_enabled'])) return; $id = get_queried_object_id(); if (!$id || !apply_filters('mkb_glossar_emit_defined_term', true, $id)) return; $data = mkb_glossar_defined_term_data($id); if (!$data || !is_array($data)) return; $json = wp_json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT); if (!is_string($json) || !$json) return; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- JSON-LD was encoded with all JSON_HEX_* HTML-context flags above. echo '' . "\n"; } add_action('wp_head', 'mkb_glossar_print_defined_term_data', 26); /** Design tokens only; never allow arbitrary CSS or unverified URLs as values. */ function mkb_glossar_details_design_settings($input) { $input = is_array($input) ? $input : []; $result = []; foreach (['background','text','border','heading','links'] as $field) { if (!isset($input[$field]) || !is_scalar($input[$field])) continue; $color = sanitize_hex_color(trim((string)$input[$field])); if ($color) $result[$field] = $color; } foreach (['radius','gap','padding'] as $field) { if (!isset($input[$field]) || !is_scalar($input[$field]) || $input[$field] === '') continue; $limits = ['radius'=>[0,48],'gap'=>[4,80],'padding'=>[0,60]]; $result[$field] = max($limits[$field][0],min($limits[$field][1],(int)$input[$field])); } return $result; } function mkb_glossar_enqueue_details_design() { $settings = mkb_glossar_details_design_settings((array)(mkb_glossar_opts()['details_design'] ?? [])); $vars = []; $mapping = ['background'=>'background','text'=>'text','border'=>'border','heading'=>'heading','links'=>'links']; foreach ($mapping as $key=>$css) if (isset($settings[$key])) $vars[] = '--mkb-glossar-details-'.$css.':'.$settings[$key]; foreach (['radius','gap','padding'] as $key) if (isset($settings[$key])) $vars[] = '--mkb-glossar-details-'.$key.':'.$settings[$key].'px'; if (!$vars) return; wp_enqueue_style('mkb-glossar'); wp_add_inline_style('mkb-glossar', ':root{'.implode(';',$vars).'}'); } add_action('wp_enqueue_scripts', 'mkb_glossar_enqueue_details_design', 21);