esc_html__('FAQ 摘要卡 + 文档链接列表 + 帮助 CTA。', 'aksrt'), 'classname' => 'widget_aksrt_faq', ] ); } public function widget($args, $instance): void { $faqs = $this->normalize_faqs($instance['faqs'] ?? []); if (!$faqs) { if (current_user_can('manage_options')) { echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo function_exists('aksrt_get_widget_null') ? aksrt_get_widget_null(__('请添加至少一条问题', 'aksrt')) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped : '
' . esc_html__('常见问题解答:', 'aksrt') . '' . esc_html__('请添加至少一条问题', 'aksrt') . '
'; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } return; } echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $title = apply_filters('widget_title', (string) ($instance['title'] ?? ''), $instance, $this->id_base); if ($title !== '') { echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } $uid = 'aksrt-faq-' . esc_attr($this->id); echo '
'; if (!empty($instance['search_s'])) { $ph = (string) ($instance['search_placeholder'] ?? __('搜索问题…', 'aksrt')); $btn = (string) ($instance['search_btn_text'] ?? __('搜索', 'aksrt')); echo '
'; echo '
'; } $doc_title = trim((string) ($instance['doc_title'] ?? '')); $doc_desc = trim((string) ($instance['doc_desc'] ?? '')); $doc_icon = sanitize_text_field((string) ($instance['doc_icon'] ?? 'fas fa-book')); $doc_links = $this->normalize_doc_links($instance['doc_links'] ?? []); $help_title = trim((string) ($instance['help_title'] ?? '')); $help_sub = trim((string) ($instance['help_subtitle'] ?? '')); $help_icon = sanitize_text_field((string) ($instance['help_icon'] ?? 'fas fa-graduation-cap')); $help_url = esc_url_raw(trim((string) ($instance['help_btn_url'] ?? ''))); $help_btn = trim((string) ($instance['help_btn_text'] ?? '')); $has_doc = ($doc_title !== '' || $doc_desc !== '' || $doc_links); $has_help = ($help_title !== '' || $help_sub !== '' || ($help_btn !== '' && $help_url !== '')); $main_cls = 'aksrt-faq__main produck-faq-main'; if (!$has_doc && !$has_help) { $main_cls .= ' is-full'; } echo '
'; echo '
'; $n = 0; foreach ($faqs as $f) { $n++; $num = str_pad((string) $n, 2, '0', STR_PAD_LEFT); $tone = self::BADGE_TONES[($n - 1) % count(self::BADGE_TONES)]; $preview = $f['answer'] !== '' ? wp_strip_all_tags($f['answer']) : ''; if ($preview !== '') { $preview = wp_trim_words($preview, 28); } echo '
'; echo ''; echo '' . esc_html($num) . ''; echo ''; echo '' . esc_html($f['question']) . ''; if ($preview !== '') { echo '' . esc_html($preview) . ''; } echo ''; echo ''; echo ''; if ($f['answer'] !== '') { echo '
' . wp_kses_post(wpautop($f['answer'])) . '
'; } echo '
'; } echo '
'; if ($has_doc || $has_help) { echo ''; } echo '
'; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } /** * @param mixed $raw * @return array */ private function normalize_faqs($raw): array { if (is_string($raw)) { $decoded = json_decode($raw, true); $raw = is_array($decoded) ? $decoded : []; } if (!is_array($raw)) { return []; } $out = []; foreach ($raw as $row) { if (!is_array($row)) { continue; } $q = sanitize_text_field((string) ($row['question'] ?? $row['q'] ?? '')); if ($q === '') { continue; } $out[] = [ 'question' => $q, 'answer' => wp_kses_post((string) ($row['answer'] ?? $row['a'] ?? '')), 'category' => sanitize_key((string) ($row['category'] ?? 'all')), ]; if (count($out) >= 30) { break; } } return $out; } /** * @param mixed $raw * @return array */ private function normalize_doc_links($raw): array { if (is_string($raw)) { $decoded = json_decode($raw, true); $raw = is_array($decoded) ? $decoded : []; } if (!is_array($raw)) { return []; } $out = []; foreach ($raw as $row) { if (!is_array($row)) { continue; } $title = sanitize_text_field((string) ($row['title'] ?? '')); $url = esc_url_raw(trim((string) ($row['url'] ?? $row['link'] ?? ''))); if ($title === '' && $url === '') { continue; } $out[] = [ 'title' => $title, 'url' => $url, 'desc' => sanitize_text_field((string) ($row['desc'] ?? '')), 'icon' => sanitize_text_field((string) ($row['icon'] ?? '')), 'tag' => sanitize_text_field((string) ($row['tag'] ?? '')), 'btn_text' => sanitize_text_field((string) ($row['btn_text'] ?? '')), ]; if (count($out) >= 12) { break; } } return $out; } public function form($instance): void { $faqs = $this->normalize_faqs($instance['faqs'] ?? []); if (!$faqs) { $faqs = [ ['question' => '', 'answer' => '', 'category' => 'all'], ['question' => '', 'answer' => '', 'category' => 'all'], ]; } $doc_links = $this->normalize_doc_links($instance['doc_links'] ?? []); if (!$doc_links) { $doc_links = [ ['title' => '', 'url' => '', 'desc' => '', 'icon' => 'fas fa-file-alt', 'tag' => '', 'btn_text' => ''], ]; } ?>



sanitize_text_field((string) ($new_instance['title'] ?? '')), 'search_s' => !empty($new_instance['search_s']) ? 1 : 0, 'search_placeholder' => sanitize_text_field((string) ($new_instance['search_placeholder'] ?? '')), 'search_btn_text' => sanitize_text_field((string) ($new_instance['search_btn_text'] ?? '')), 'faqs' => $this->normalize_faqs($new_instance['faqs'] ?? []), 'doc_title' => sanitize_text_field((string) ($new_instance['doc_title'] ?? '')), 'doc_desc' => sanitize_textarea_field((string) ($new_instance['doc_desc'] ?? '')), 'doc_icon' => sanitize_text_field((string) ($new_instance['doc_icon'] ?? '')), 'doc_links' => $this->normalize_doc_links($new_instance['doc_links'] ?? []), 'help_title' => sanitize_text_field((string) ($new_instance['help_title'] ?? '')), 'help_subtitle' => sanitize_textarea_field((string) ($new_instance['help_subtitle'] ?? '')), 'help_icon' => sanitize_text_field((string) ($new_instance['help_icon'] ?? '')), 'help_btn_text' => sanitize_text_field((string) ($new_instance['help_btn_text'] ?? '')), 'help_btn_url' => esc_url_raw(trim((string) ($new_instance['help_btn_url'] ?? ''))), ]; } }