' . aksrt_renderer_title_markup($data, $cfg) . ''; $excerpt_class = ($cfg['style'] ?? '') === 'style2' ? 'text-ellipsis-2' : 'text-ellipsis'; $excerpt = '
' . aksrt_renderer_excerpt_markup($data, $cfg) . '
'; $thumb = aksrt_renderer_thumb($data, $cfg); $mult = aksrt_renderer_mult_thumb($data, $cfg); $graphic = ''; if ($thumb !== '' && empty($data['is_mult_thumb'])) { $graphic = '
' . $thumb . '
'; } $badges = aksrt_renderer_badges($data, $cfg); $meta = aksrt_renderer_meta($data, $cfg, false); $html = ''; if (($cfg['style'] ?? '') === 'style2') { $html .= $title . '
' . $graphic . '
'; $html .= $mult !== '' ? $mult : $excerpt; $html .= $badges . $meta . '
'; } else { $html .= $graphic . '
' . $title; $html .= $mult !== '' ? $mult : $excerpt; $html .= '
' . $badges . $meta . '
'; } return $html . '
'; } } if (!function_exists('aksrt_renderer_card')) { function aksrt_renderer_card(array $data, array $cfg): string { $classes = ['posts-item', 'card', 'ajax-item']; if ((string) ($cfg['style'] ?? '') !== '') { $classes[] = (string) $cfg['style']; } $title = '

' . aksrt_renderer_title_markup($data, $cfg) . '

'; $html = ''; $html .= aksrt_renderer_thumb($data, $cfg); $html .= '
' . $title; $html .= aksrt_renderer_badges($data, $cfg); $html .= aksrt_renderer_meta($data, $cfg, true); return $html . '
'; } } if (!function_exists('aksrt_renderer_mini')) { function aksrt_renderer_mini(array $data, array $cfg = []): string { $target = !empty($cfg['target_blank']) ? ' target="_blank"' : ''; $thumb = ''; $show_thumb = !array_key_exists('show_thumb', $cfg) || !empty($cfg['show_thumb']); $show_meta = !array_key_exists('show_meta', $cfg) || !empty($cfg['show_meta']); if ($show_thumb && (string) $data['primary'] !== '') { $default_attr = empty($data['has_real']) ? ' data-thumb="default"' : ''; $thumb = '
'; } $number = ''; if (!empty($cfg['show_number'])) { $number_value = max(1, (int) ($cfg['number_offset'] ?? 1)); $colors = ['c-red', 'c-yellow', 'c-purple', 'c-blue', 'c-green']; $number_class = $colors[$number_value - 1] ?? ''; $number = '' . $number_value . ''; } $title_class = $show_thumb ? ' text-ellipsis-2' : ' text-ellipsis' . (!$show_meta && empty($cfg['show_number']) ? ' icon-circle' : ''); $title = esc_html((string) $data['title']); if ((string) ($data['subtitle'] ?? '') !== '') { $title .= '' . esc_html((string) $data['subtitle']) . ''; } $meta = ''; if ($show_meta) { $show_time = !empty($cfg['show_time']); if (!empty($cfg['show_author'])) { $author_value = $show_time ? (string) $data['time_ago'] : (string) $data['author_name']; $meta_left = '' . esc_html($author_value) . ''; } else { $meta_left = $show_time ? '' . esc_html((string) $data['time_ago']) . '' : ''; } $pay = aksrt_renderer_pay_badge($data, true); if ($meta_left === '') { $meta_left = $pay; $pay = ''; } if ($meta_left === '') { $meta_left = ''; } $meta_right = $pay . '' . aksrt_renderer_svg_icon('view') . esc_html(aksrt_renderer_meta_number((int) $data['views'])) . ''; $meta = '
' . $meta_left . '
' . $meta_right . '
'; } $class = trim('posts-mini ' . (string) ($cfg['class'] ?? '')); return '
' . $thumb . '

' . $number . '' . $title . '

' . $meta . '
'; } } if (!function_exists('aksrt_render_post')) { function aksrt_render_post(array $args = []): string { $cfg = aksrt_renderer_config($args); $data = aksrt_renderer_collect_post_data($cfg); if (!$data) { return ''; } return ($cfg['mode'] ?? 'list') === 'card' ? aksrt_renderer_card($data, $cfg) : aksrt_renderer_list($data, $cfg); } } if (!function_exists('aksrt_render_post_list')) { /** * Render the canonical article stream. * * @param array $args legacy-shaped list arguments. * @param WP_Query|null $query Optional custom query. */ function aksrt_render_post_list(array $args = [], ?WP_Query $query = null, bool $echo = true): string { $cfg = aksrt_renderer_config($args); $has_posts = $query instanceof WP_Query ? $query->have_posts() : have_posts(); if (!$has_posts) { $html = aksrt_get_null(__('暂无内容', 'aksrt'), 100, 'null-post.svg'); if ($echo) { echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped return ''; } return $html; } $classes = ['posts-row', 'ajaxpager']; foreach (preg_split('/\s+/', trim((string) ($cfg['wrapper_class'] ?? ''))) ?: [] as $class) { $class = sanitize_html_class($class); if ($class !== '') { $classes[] = $class; } } // legacy 契约:分页等控件与列表同处一个 .ajaxpager 内,供 runtime post_ajax 提取。 $append_inner_html = (string) ($cfg['append_inner_html'] ?? ''); $html = empty($cfg['skip_wrapper']) ? '
' : ''; if ($query instanceof WP_Query) { while ($query->have_posts()) { $query->the_post(); $html .= aksrt_render_post($cfg); } wp_reset_postdata(); } else { while (have_posts()) { the_post(); $html .= aksrt_render_post($cfg); } } $html .= $append_inner_html; if (empty($cfg['skip_wrapper'])) { $html .= '
'; } if ($echo) { echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped return ''; } return $html; } } if (!function_exists('aksrt_render_mini_list')) { function aksrt_render_mini_list(WP_Query $query, array $args = [], bool $echo = true): string { $cfg = aksrt_renderer_config($args); $html = ''; $number = max(0, (int) ($args['number_offset'] ?? 0)); while ($query->have_posts()) { $query->the_post(); $data = aksrt_renderer_collect_post_data($cfg); if (!$data) { continue; } $number++; $html .= aksrt_renderer_mini($data, array_merge($cfg, ['number_offset' => $number])); } wp_reset_postdata(); if ($echo) { echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped return ''; } return $html; } } if (!function_exists('aksrt_render_placeholder')) { /** * 骨架屏占位(legacy zib_get_post_placeholder parity)。 * * 骨架块复用真实卡片的 posts-item / post-graphic / item-body 结构与尺寸, * 只是把内容换成 .placeholder。列表模式四行(标题 k1、摘要 k2、两枚 s1), * 卡片模式三行(标题 t1、摘要 k2、两枚 s1),对应参考主题 1:1。 * * @param string $mode list|card|mini|mini_thumb。 * @param int $count 重复数量,1–12。 */ function aksrt_render_placeholder(string $mode = 'list', int $count = 3): string { $count = max(1, min(12, $count)); if ($mode === 'mini') { $item = '
'; } elseif ($mode === 'mini_thumb') { $item = '
'; } elseif ($mode === 'card') { $item = '

'; } else { $item = '

'; } return str_repeat($item, $count); } }