feat(widgets): shared render_html for oneline/comments/users
Expose remote-refreshable HTML builders for zibll-style widget modules without full page reload.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/**
|
||||
* Horizontal one-line posts scroller (zibll widget_ui_oneline_posts lite).
|
||||
* Horizontal one-line posts scroller (zibll oneline + remote HTML).
|
||||
*
|
||||
* @package AKSRT
|
||||
*/
|
||||
@@ -22,16 +22,11 @@ class WidgetOnelinePosts extends \WP_Widget {
|
||||
);
|
||||
}
|
||||
|
||||
public function widget($args, $instance): void {
|
||||
public static function build_query_args(array $instance): array {
|
||||
$count = max(1, min(20, (int) ($instance['count'] ?? 8)));
|
||||
$style = sanitize_key((string) ($instance['style'] ?? 'card'));
|
||||
if (!in_array($style, ['card', 'mini', 'list'], true)) {
|
||||
$style = 'card';
|
||||
}
|
||||
$orderby = sanitize_key((string) ($instance['orderby'] ?? 'date'));
|
||||
$cat = (int) ($instance['cat'] ?? 0);
|
||||
$limit_day = max(0, (int) ($instance['limit_day'] ?? 0));
|
||||
|
||||
$query = [
|
||||
'post_type' => 'post',
|
||||
'post_status' => 'publish',
|
||||
@@ -62,20 +57,23 @@ class WidgetOnelinePosts extends \WP_Widget {
|
||||
$query['orderby'] = 'date';
|
||||
$query['order'] = 'DESC';
|
||||
}
|
||||
return $query;
|
||||
}
|
||||
|
||||
$q = new \WP_Query($query);
|
||||
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();
|
||||
return;
|
||||
return function_exists('aksrt_get_ajax_null')
|
||||
? aksrt_get_ajax_null(__('暂无文章', 'aksrt'))
|
||||
: '<p class="widget-empty ajax-item">' . esc_html__('暂无文章', 'aksrt') . '</p>';
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
echo '<div class="aksrt-oneline style-' . esc_attr($style) . '"><div class="aksrt-oneline__track">';
|
||||
ob_start();
|
||||
echo '<div class="aksrt-oneline style-' . esc_attr($style) . ' ajax-item"><div class="aksrt-oneline__track">';
|
||||
while ($q->have_posts()) {
|
||||
$q->the_post();
|
||||
$thumb = get_the_post_thumbnail_url(get_the_ID(), $style === 'card' ? 'medium' : 'thumbnail');
|
||||
@@ -94,7 +92,20 @@ class WidgetOnelinePosts extends \WP_Widget {
|
||||
}
|
||||
echo '</div></div>';
|
||||
wp_reset_postdata();
|
||||
return (string) ob_get_clean();
|
||||
}
|
||||
|
||||
public function widget($args, $instance): void {
|
||||
$html = self::render_html($instance);
|
||||
if ($html === '') {
|
||||
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
|
||||
}
|
||||
echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user