/**
* =========================================================
* 横向滚动文章(可只显示置顶)小工具
* - 与主题自带「横向滚动文章(新)」完全独立,不覆盖、不冲突
* - 小工具 ID:widget_ui_oneline_posts_sticky
* - 渲染函数:zib_ol_widget_oneline_posts_sticky()
* =========================================================
*/
/* ---------------- 1. 渲染回调 ---------------- */
if (!function_exists('zib_ol_widget_oneline_posts_sticky')) {
function zib_ol_widget_oneline_posts_sticky($args, $instance)
{
if (!function_exists('zib_get_posts_query')) {
return;
}
$style = !empty($instance['style']) ? $instance['style'] : 'card';
$sticky_only = (isset($instance['sticky_only']) && $instance['sticky_only'] == '1');
$class = 'widget-main-post mb20 style-' . $style;
/* ---- 取置顶文章 ID ---- */
$post__in = array();
if ($sticky_only) {
$sticky_ids = get_option('sticky_posts');
$post__in = is_array($sticky_ids) ? array_filter(array_map('intval', $sticky_ids)) : array();
// 一篇置顶都没有:直接给空提示,避免发一次空查询
if (empty($post__in)) {
echo '
';
echo '
' . esc_html__('暂无置顶文章', 'zib_language') . '
';
echo '
';
return;
}
}
$posts_args = array(
'cat' => isset($instance['cat']) ? $instance['cat'] : '',
'topics' => isset($instance['topics']) ? $instance['topics'] : '',
'zibpay_type' => isset($instance['zibpay_type']) ? $instance['zibpay_type'] : '',
'orderby' => isset($instance['orderby']) ? $instance['orderby'] : '',
'order' => (isset($instance['order']) && $instance['order'] === 'asc') ? 'ASC' : 'DESC',
'count' => isset($instance['count']) ? (int) $instance['count'] : 12,
'limit_day' => isset($instance['limit_day']) ? (int) $instance['limit_day'] : 0,
'no_found_rows' => true,
);
if ($post__in) {
// 只显示置顶:post__in 限死范围;分类/专题/zibpay_type 仍会叠加成“交集”
$posts_args['post__in'] = $post__in;
$posts_args['ignore_sticky_posts'] = true;
}
$posts_query = zib_get_posts_query($posts_args);
$lists = '';
if ($posts_query->have_posts()) {
while ($posts_query->have_posts()) {
$posts_query->the_post();
if ($style === 'card') {
$lists .= zib_posts_mian_list_card(array());
} elseif ($style === 'mini') {
$lists .= zib_posts_mini_while(array(
'class' => 'posts-item',
'show_thumb' => true,
'show_meta' => true,
'show_number' => false,
'echo' => false,
));
} else {
$lists .= zib_posts_mian_list_list(array(
'is_mult_thumb' => 'disable',
'is_no_thumb' => 'disable',
));
}
}
wp_reset_postdata(); // 二级查询用这个即可,比 wp_reset_query() 更准确
}
// 没查到文章就不输出空壳容器(避免 swiper 空转出现空白块)
if (!$lists) {
return;
}
echo '';
}
}
/* ---------------- 2. 注册小工具 ---------------- */
if (!function_exists('zib_ol_register_oneline_posts_sticky_widget')) {
function zib_ol_register_oneline_posts_sticky_widget()
{
if (!class_exists('Zib_CFSwidget') || !function_exists('zib_ol_widget_oneline_posts_sticky')) {
return;
}
Zib_CFSwidget::create('widget_ui_oneline_posts_sticky', array(
'title' => __('横向滚动文章(置顶)', 'zib_language'),
'zib_title' => true,
'zib_affix' => true,
'zib_show' => true,
'callback' => 'zib_ol_widget_oneline_posts_sticky',
'description' => __('显示文章列表,只显示一行,左右滚动;可设置仅显示置顶文章', 'zib_language'),
'fields' => array(
array(
'id' => 'sticky_only',
'title' => __('只显示置顶文章', 'zib_language'),
'desc' => __('开启后只输出被设为「置顶」的文章;若同时填写了分类/专题限制,则取两者交集。', 'zib_language'),
'default' => '0',
'inline' => true,
'type' => 'radio',
'options' => array(
'0' => __('否', 'zib_language'),
'1' => __('是', 'zib_language'),
),
),
array(
'id' => 'cat',
'title' => __('分类限制', 'zib_language'),
'type' => 'text',
),
array(
'id' => 'topics',
'title' => __('专题限制', 'zib_language'),
'desc' => __('分类或专题限制请填写对应的ID,多个ID请用英文逗号隔开。如:1,2,3。支持负数进行排除,例如:-1,-2,-3。(在后台分类、专题列表中可查看ID)', 'zib_language'),
'type' => 'text',
),
array(
'title' => __('商品类型筛选', 'zib_language'),
'id' => 'zibpay_type',
'default' => array(),
'inline' => true,
'type' => 'checkbox',
'placeholder' => __('不做其它筛选', 'zib_language'),
'options' => array(
'1' => __('付费阅读', 'zib_language'),
'2' => __('付费下载', 'zib_language'),
'5' => __('付费图片', 'zib_language'),
'6' => __('付费视频', 'zib_language'),
),
),
array(
'id' => 'orderby',
'type' => 'select',
'default' => '',
'title' => __('排序方式', 'zib_language'),
'subtitle' => '',
'options' => CFS_Module::posts_orderby(),
),
array(
'id' => 'order',
'default' => 'desc',
'class' => 'compact',
'inline' => true,
'type' => 'radio',
'options' => array(
'desc' => __('升序', 'zib_language'),
'asc' => __('降序', 'zib_language'),
),
),
array(
'title' => __('列表样式', 'zib_language'),
'id' => 'style',
'default' => 'card',
'type' => 'radio',
'desc' => '' . esc_html__('注意:不同样式尺寸不同,请根据放置的位置合理选择。例如:放在宽度较小的侧边栏,则需选择mini样式,否则显示效果不佳', 'zib_language') . '
',
'inline' => true,
'options' => array(
'list' => __('列表样式', 'zib_language'),
'card' => __('卡片样式', 'zib_language'),
'mini' => __('mini列表', 'zib_language'),
),
),
array(
'title' => __('显示数量', 'zib_language'),
'id' => 'count',
'class' => '',
'default' => 12,
'max' => 20,
'min' => 4,
'step' => 1,
'unit' => __('篇', 'zib_language'),
'type' => 'spinner',
),
),
));
}
// 优先级 20:确保排在主题自身注册之后,不会互相覆盖
add_action('widgets_init', 'zib_ol_register_oneline_posts_sticky_widget', 20);
}
/* 诊断 1:证明代码确实被执行到了 */
add_action('admin_notices', function () {
if (!current_user_can('manage_options')) return;
printf(
'[zib_ol] 代码已加载;Zib_CFSwidget=%s;CFS_Module=%s;渲染函数=%s
',
class_exists('Zib_CFSwidget') ? '有' : '无',
class_exists('CFS_Module') ? '有' : '无',
function_exists('zib_ol_widget_oneline_posts_sticky') ? '有' : '无'
);
});
/* 诊断 2:把最终注册进 WP 的小工具 id_base 全部列出来 */
add_action('widgets_init', function () {
$GLOBALS['zib_ol_ids'] = array();
foreach ((array) $GLOBALS['wp_widget_factory']->widgets as $w) {
$GLOBALS['zib_ol_ids'][] = isset($w->id_base) ? $w->id_base : get_class($w);
}
}, 999);
add_action('admin_notices', function () {
if (empty($GLOBALS['zib_ol_ids'])) return;
echo '最终注册的 widget id:' . "\n"
. esc_html(implode("\n", $GLOBALS['zib_ol_ids'])) . ' ';
});
心语博客-最新发布-第27页