You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在WordPress 4.9.6中如何从侧边栏小部件获取文章ID?

从WordPress侧边栏小部件中提取文章ID(4.9.6版本)

针对你这个需求,我给你分步骤说明怎么实现,不需要渲染文章,只拿ID就行:

第一步:获取目标侧边栏的小部件列表

首先我们得先拿到test-sidebar这个侧边栏下所有的小部件ID,用WordPress自带的wp_get_sidebars_widgets()函数就能做到:

// 获取所有侧边栏的小部件配置
$sidebar_widgets = wp_get_sidebars_widgets();

// 检查目标侧边栏是否存在
if (isset($sidebar_widgets['test-sidebar'])) {
    $target_widget_ids = $sidebar_widgets['test-sidebar'];
    
    // 遍历每个小部件处理
    foreach ($target_widget_ids as $widget_id) {
        // 下面的处理逻辑写在这里
    }
}

第二步:解析小部件的类型和设置

每个小部件的配置都存在WordPress的选项里,我们需要拆分小部件ID来获取它的类型和实例编号,再取出对应的设置:

// 拆分小部件ID,比如"widget_recent_entries-1"会拆成类型和实例号
$widget_parts = explode('-', $widget_id);
$widget_type = $widget_parts[0];
$widget_instance = isset($widget_parts[1]) ? $widget_parts[1] : 1;

// 获取该类型小部件的所有配置
$widget_options = get_option($widget_type);

// 拿到当前小部件实例的具体设置
if (isset($widget_options[$widget_instance])) {
    $widget_settings = $widget_options[$widget_instance];
    
    // 根据小部件类型处理,下面分常见情况说明
}

第三步:针对不同小部件类型提取ID

情况1:默认的「近期文章」小部件(widget_recent_entries)

这个小部件的设置里包含了文章类型、数量、分类筛选等参数,我们可以直接用这些参数做查询,只返回ID:

if ($widget_type === 'widget_recent_entries') {
    // 构建查询参数
    $query_args = array(
        'post_type'      => isset($widget_settings['post_type']) ? $widget_settings['post_type'] : 'post',
        'posts_per_page' => isset($widget_settings['number']) ? $widget_settings['number'] : 5,
        'post_status'    => 'publish',
        'fields'         => 'ids', // 只获取ID,提升性能
    );

    // 如果小部件设置了分类筛选,加上分类参数
    if (!empty($widget_settings['category'])) {
        $query_args['category__in'] = array($widget_settings['category']);
    }

    // 执行查询
    $post_query = new WP_Query($query_args);
    
    // 拿到文章ID数组
    if ($post_query->have_posts()) {
        $post_ids = $post_query->posts;
        // 这里可以打印或存储$post_ids
        // print_r($post_ids);
    }

    // 重置查询
    wp_reset_postdata();
}

情况2:自定义HTML小部件(widget_text)

如果是手动在HTML小部件里加了文章链接,我们需要解析HTML内容提取ID:

if ($widget_type === 'widget_text') {
    $widget_content = $widget_settings['text'];
    $post_ids = array();

    // 匹配带?p=ID的链接
    preg_match_all('/\?p=(\d+)/', $widget_content, $query_matches);
    if (!empty($query_matches[1])) {
        $post_ids = array_merge($post_ids, $query_matches[1]);
    }

    // 匹配永久链接,用url_to_postid函数转成ID
    preg_match_all('/href="([^"]+)"/', $widget_content, $link_matches);
    foreach ($link_matches[1] as $link) {
        $post_id = url_to_postid($link);
        if ($post_id) {
            $post_ids[] = $post_id;
        }
    }

    // 去重并整理
    $post_ids = array_unique($post_ids);
    // print_r($post_ids);
}

情况3:自定义开发的小部件

如果是你自己或者第三方开发的自定义小部件,得看它的配置逻辑——通常这类小部件会直接把选择的文章ID存在设置里,比如$widget_settings['selected_post_ids'],直接取出这个数组就行。

注意事项

  • 如果你用了侧边栏条件显示插件(比如根据页面类型显示不同小部件),wp_get_sidebars_widgets()返回的是全局配置,不是当前页面实际渲染的小部件。这种情况可以用dynamic_sidebar_before钩子来捕获当前页面加载的小部件。
  • 你的WordPress 4.9.6版本完全支持上面所有函数,不用担心兼容性问题。

内容的提问来源于stack exchange,提问作者Vadim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:40:35