在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
相关产品推荐
相关产品推荐

