'widget_aksrt_category_recommend', 'description' => esc_html__('分类推荐卡片区块,可挂载到首页内容挂载区。', 'aksrt'), 'customize_selective_refresh' => true, ] ); } public function widget($args, $instance): void { $title = apply_filters('widget_title', $instance['title'] ?? '', $instance, $this->id_base); $title = $title !== '' ? $title : __('分类推荐', 'aksrt'); $category_ids = aksrt_home_widget_normalize_category_ids($instance['category_ids'] ?? [], 4); $posts_per_cat = max(1, min(8, (int) ($instance['posts_per_category'] ?? 5))); $columns = max(1, min(4, (int) ($instance['columns'] ?? 2))); $show_views = ! empty($instance['show_views']); $show_description = ! empty($instance['show_description']); $show_dates = ! empty($instance['show_dates']); $show_more = ! empty($instance['show_more']); if (empty($category_ids)) { $category_ids = aksrt_home_widget_fallback_category_ids(4); } $cards = $this->build_cards($category_ids, $posts_per_cat, $show_views, $show_description); echo $args['before_widget']; echo '
'; aksrt_home_widget_render_header($title); if (empty($cards)) { echo function_exists('aksrt_get_widget_null') ? aksrt_get_widget_null(__('暂无推荐分类', 'aksrt')) : '

' . esc_html__('暂无推荐分类', 'aksrt') . '

'; echo '
'; echo $args['after_widget']; return; } $lazy = aksrt_home_widget_get_lazyload_args(); printf('
', (int) $columns); foreach ($cards as $card) { ?>
<?php echo esc_attr($card['name']); ?> <?php echo esc_attr($card['name']); ?> 0) : ?>
'; echo ''; echo $args['after_widget']; } public function form($instance): void { $title = (string) ($instance['title'] ?? __('分类推荐', 'aksrt')); $category_ids = aksrt_home_widget_normalize_category_ids($instance['category_ids'] ?? [], 4); $posts_per_cat = (int) ($instance['posts_per_category'] ?? 5); $columns = (int) ($instance['columns'] ?? 2); $show_views = ! empty($instance['show_views']); $show_description = ! array_key_exists('show_description', $instance) || ! empty($instance['show_description']); $show_dates = ! array_key_exists('show_dates', $instance) || ! empty($instance['show_dates']); $show_more = ! array_key_exists('show_more', $instance) || ! empty($instance['show_more']); $categories = aksrt_home_widget_available_categories(); ?>

id="get_field_id('show_views')); ?>" name="get_field_name('show_views')); ?>" value="1">

id="get_field_id('show_description')); ?>" name="get_field_name('show_description')); ?>" value="1">

id="get_field_id('show_dates')); ?>" name="get_field_name('show_dates')); ?>" value="1">

id="get_field_id('show_more')); ?>" name="get_field_name('show_more')); ?>" value="1">

sanitize_text_field($new_instance['title'] ?? ''), 'category_ids' => aksrt_home_widget_normalize_category_ids($new_instance['category_ids'] ?? [], 4), 'posts_per_category' => max(1, min(8, absint($new_instance['posts_per_category'] ?? 5))), 'columns' => max(1, min(4, absint($new_instance['columns'] ?? 2))), 'show_views' => ! empty($new_instance['show_views']) ? 1 : 0, 'show_description' => ! empty($new_instance['show_description']) ? 1 : 0, 'show_dates' => ! empty($new_instance['show_dates']) ? 1 : 0, 'show_more' => ! empty($new_instance['show_more']) ? 1 : 0, ]; } /** * Build category recommend cards. * * @param array $category_ids Category ids. * @param int $posts_per_cat Post count per category. * @param bool $show_views Whether to calculate views. * @param bool $show_description Whether to fetch description. * @return array> */ private function build_cards(array $category_ids, int $posts_per_cat, bool $show_views, bool $show_description): array { $cards = []; foreach ($category_ids as $category_id) { $term = get_term($category_id, 'category'); if (! $term || is_wp_error($term)) { continue; } $posts = get_posts([ 'post_type' => aksrt_home_widget_post_types(), 'cat' => $category_id, 'posts_per_page' => $posts_per_cat, 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'DESC', 'no_found_rows' => true, ]); $post_items = []; foreach ($posts as $post) { $post_items[] = [ 'title' => get_the_title($post->ID), 'link' => get_permalink($post->ID), 'date' => function_exists('aksrt_time_ago') ? aksrt_time_ago($post->post_date) : get_the_date('Y-m-d', $post->ID), ]; } $cards[] = [ 'name' => $term->name, 'link' => get_category_link($category_id), 'cover' => class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_category_cover_url($category_id) : (get_template_directory_uri() . '/assets/img/placeholder.svg'), 'description' => $show_description && class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_category_recommend_desc($category_id) : ($show_description ? (string) $term->description : ''), 'count' => (int) $term->count, 'views' => $show_views && function_exists('aksrt_get_category_total_views') ? aksrt_get_category_total_views($category_id) : 0, 'posts' => $post_items, ]; } return $cards; } }