__('AKSRT 多 TAB 商品列表组件(每 tab 独立筛选 + AJAX)。', 'aksrt')] ); } /** * @return list */ private static function parse_tabs(string $tabs_raw): array { $tabs = []; foreach (array_filter(explode("\n", $tabs_raw)) as $line) { $parts = explode('|', trim($line)); if (count($parts) >= 1 && trim($parts[0]) !== '') { $tabs[] = [ 'label' => trim($parts[0]), 'cat_ids' => trim($parts[1] ?? ''), 'discount_ids' => trim($parts[2] ?? ''), 'tag_ids' => trim($parts[3] ?? ''), 'orderby' => trim($parts[4] ?? 'date'), ]; } } return $tabs; } public function widget($args, $instance): void { $title = apply_filters('widget_title', (string) ($instance['title'] ?? ''), $instance, $this->id_base); $tabs_raw = (string) ($instance['tabs'] ?? ''); $per_page = max(1, min(20, (int) ($instance['per_page'] ?? 8))); $style = sanitize_key((string) ($instance['style'] ?? 'default')); $paginate = sanitize_key((string) ($instance['paginate'] ?? 'ajax')); $tabs = self::parse_tabs($tabs_raw); if (!$tabs) { 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(__('请至少配置一个 TAB', 'aksrt')) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped : '

' . esc_html__('请至少配置一个 TAB', 'aksrt') . '

'; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } return; } echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped if ($title !== '') { echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } $rest = rest_url('aksrt/v1/shop/frontend/widgets/products'); echo '
'; echo '
'; foreach ($tabs as $i => $tab) { $active = $i === 0 ? ' is-active' : ''; echo ''; } echo '
'; foreach ($tabs as $i => $tab) { $hidden = $i > 0 ? ' style="display:none"' : ''; $loaded = $i === 0 ? '1' : '0'; echo '
'; if ($i === 0) { $inst = [ 'per_page' => $per_page, 'orderby' => sanitize_key($tab['orderby'] ?: 'date'), 'order' => 'DESC', 'cat_ids' => $tab['cat_ids'], 'tag_ids' => $tab['tag_ids'], 'discount_ids' => $tab['discount_ids'], 'style' => $style, 'paginate' => $paginate, ]; $payload = class_exists('\AKSRT\Widgets\WidgetProductList') ? WidgetProductList::query_payload($inst, 1) : ['html' => '', 'paginate_html' => '']; echo '
'; echo $payload['html']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo $payload['paginate_html']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo ''; echo '
'; } else { echo '
'; echo '
'; echo '
'; for ($si = 0; $si < min(4, $per_page); $si++) { echo '
'; } echo '
'; echo '
'; echo '
'; } echo '
'; } echo '
'; echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } public function form($instance): void { $defaults = [ 'title' => __('商品精选', 'aksrt'), 'tabs' => "热门推荐|\n最新上架|", 'per_page' => 8, 'style' => 'default', 'paginate' => 'ajax', ]; $instance = wp_parse_args($instance, $defaults); ?>

sanitize_text_field((string) ($new_instance['title'] ?? '')), 'tabs' => sanitize_textarea_field((string) ($new_instance['tabs'] ?? '')), 'per_page' => max(1, min(20, (int) ($new_instance['per_page'] ?? 8))), 'style' => sanitize_key((string) ($new_instance['style'] ?? 'default')), 'paginate' => in_array(sanitize_key((string) ($new_instance['paginate'] ?? 'ajax')), ['none', 'ajax', 'number'], true) ? sanitize_key((string) ($new_instance['paginate'] ?? 'ajax')) : 'ajax', ]; } }