diff --git a/src/AKSRT/Widgets/WidgetOnelinePosts.php b/src/AKSRT/Widgets/WidgetOnelinePosts.php index f5299348..e942f9bb 100644 --- a/src/AKSRT/Widgets/WidgetOnelinePosts.php +++ b/src/AKSRT/Widgets/WidgetOnelinePosts.php @@ -1,6 +1,8 @@ esc_html__('横向滚动的文章卡片/迷你列表。', 'aksrt'), + 'description' => esc_html__('横向滚动的文章卡片/迷你列表(共享 swiper-scroll)。', 'aksrt'), 'classname' => 'widget_aksrt_oneline_posts', ] ); } + /** + * @param array $instance + * @return array + */ public static function build_query_args(array $instance): array { - $count = max(1, min(20, (int) ($instance['count'] ?? 8))); - $orderby = sanitize_key((string) ($instance['orderby'] ?? 'date')); - $cat = (int) ($instance['cat'] ?? 0); + $count = max(1, min(20, (int) ($instance['count'] ?? 8))); + $orderby = sanitize_key((string) ($instance['orderby'] ?? 'date')); + $cat = (int) ($instance['cat'] ?? 0); $limit_day = max(0, (int) ($instance['limit_day'] ?? 0)); - $query = [ + $query = [ 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => $count, @@ -43,28 +49,32 @@ class WidgetOnelinePosts extends \WP_Widget { switch ($orderby) { case 'views': $query['meta_key'] = 'aksrt_post_views'; - $query['orderby'] = 'meta_value_num'; - $query['order'] = 'DESC'; + $query['orderby'] = 'meta_value_num'; + $query['order'] = 'DESC'; break; case 'comments': $query['orderby'] = 'comment_count'; - $query['order'] = 'DESC'; + $query['order'] = 'DESC'; break; case 'rand': $query['orderby'] = 'rand'; break; default: $query['orderby'] = 'date'; - $query['order'] = 'DESC'; + $query['order'] = 'DESC'; } return $query; } + /** + * @param array $instance + */ public static function render_html(array $instance): string { $style = sanitize_key((string) ($instance['style'] ?? 'card')); if (!in_array($style, ['card', 'mini', 'list'], true)) { $style = 'card'; } + $q = new \WP_Query(self::build_query_args($instance)); if (!$q->have_posts()) { wp_reset_postdata(); @@ -72,29 +82,75 @@ class WidgetOnelinePosts extends \WP_Widget { ? aksrt_get_ajax_null(__('暂无文章', 'aksrt')) : '

' . esc_html__('暂无文章', 'aksrt') . '

'; } - ob_start(); - echo '
'; - while ($q->have_posts()) { - $q->the_post(); - $thumb = get_the_post_thumbnail_url(get_the_ID(), $style === 'card' ? 'medium' : 'thumbnail'); - echo ''; - if ($thumb) { - echo '
'; - } else { - echo '
'; + + $mode = $style === 'mini' ? 'mini' : ($style === 'list' ? 'list' : 'card'); + $cfg = [ + 'mode' => $mode, + 'context' => 'widget', + 'show_thumb' => true, + 'show_meta' => $style !== 'mini', + 'show_excerpt' => false, + 'show_author' => false, + 'show_comments' => false, + 'show_likes' => false, + 'show_tags' => false, + 'show_badges' => $style === 'card', + 'skip_wrapper' => true, + 'extra_class' => 'posts-item', + ]; + + $slides = ''; + if (function_exists('aksrt_render_post')) { + while ($q->have_posts()) { + $q->the_post(); + $item = aksrt_render_post($cfg); + if ($item === '') { + continue; + } + // Ensure freeMode width calc has a posts-item root when renderer wraps differently. + if (strpos($item, 'posts-item') === false && strpos($item, 'posts-mini') === false) { + $item = '
' . $item . '
'; + } + $slides .= '
' . $item . '
'; } - echo '
'; + wp_reset_postdata(); } + + if ($slides === '') { + return function_exists('aksrt_get_ajax_null') + ? aksrt_get_ajax_null(__('暂无文章', 'aksrt')) + : '

' . esc_html__('暂无文章', 'aksrt') . '

'; + } + + // zibll: .widget-main-post.style-{card|mini|list} + .swiper-container.swiper-scroll data-slideClass="posts-item". + ob_start(); + echo '
'; + echo '
'; + echo '
'; + echo $slides; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo '
'; + echo '
'; + echo '
'; echo '
'; - wp_reset_postdata(); return (string) ob_get_clean(); } + /** + * @param array $args + * @param array $instance + */ public function widget($args, $instance): void { $html = self::render_html($instance); if ($html === '') { @@ -112,6 +168,9 @@ class WidgetOnelinePosts extends \WP_Widget { echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } + /** + * @param array $instance + */ public function form($instance): void { ?>

@@ -156,6 +215,11 @@ class WidgetOnelinePosts extends \WP_Widget { $new_instance + * @param array $old_instance + * @return array + */ public function update($new_instance, $old_instance): array { $style = sanitize_key((string) ($new_instance['style'] ?? 'card')); if (!in_array($style, ['card', 'mini', 'list'], true)) {