WordPress如何获取标题、标签或分类含指定关键词的文章?
解决get_posts()同时匹配标题、内容和标签的问题
默认情况下,WordPress的get_posts()函数的's'参数仅搜索文章的标题、内容和摘要,不会覆盖标签这类分类法字段。要让搜索范围包含标签,需要通过posts_where钩子修改查询的SQL条件。
方法一:全局修改搜索行为
在主题的functions.php或自定义插件中添加以下代码,让所有前台搜索自动包含标签匹配:
function search_include_tags($where, $wp_query) { global $wpdb; // 仅在前台搜索且存在关键词时生效 if ( !is_admin() && $wp_query->is_search && $wp_query->get('s') ) { $search_term = $wp_query->get('s'); // 拼接标签关联的查询条件,避免SQL注入 $where .= " OR EXISTS ( SELECT 1 FROM $wpdb->term_relationships tr JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id JOIN $wpdb->terms t ON tt.term_id = t.term_id WHERE tr.object_id = $wpdb->posts.ID AND tt.taxonomy = 'post_tag' AND t.name LIKE '%{$wpdb->esc_like($search_term)}%' )"; } return $where; } add_filter('posts_where', 'search_include_tags', 10, 2);
之后你的原有代码无需修改,'s'参数会同时匹配标题、内容和标签:
$args = array( 'numberposts' => 99, 's' => 'sunflower' ); $postslist = get_posts( $args );
方法二:仅针对特定查询生效
如果不想全局修改搜索逻辑,可以给get_posts()添加自定义标记,仅指定查询包含标签搜索:
首先修改钩子函数:
function search_include_tags($where, $wp_query) { global $wpdb; // 仅当查询包含自定义参数include_tags时生效 if ( !is_admin() && $wp_query->get('include_tags') && $wp_query->get('s') ) { $search_term = $wp_query->get('s'); $where .= " OR EXISTS ( SELECT 1 FROM $wpdb->term_relationships tr JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id JOIN $wpdb->terms t ON tt.term_id = t.term_id WHERE tr.object_id = $wpdb->posts.ID AND tt.taxonomy = 'post_tag' AND t.name LIKE '%{$wpdb->esc_like($search_term)}%' )"; } return $where; } add_filter('posts_where', 'search_include_tags', 10, 2);
然后调用get_posts()时加上自定义参数:
$args = array( 'numberposts' => 99, 's' => 'sunflower', 'include_tags' => true // 标记该查询需要包含标签搜索 ); $postslist = get_posts( $args );
补充说明
- 若需要同时匹配分类(category),可在SQL条件中添加
OR tt.taxonomy = 'category'; - 必须使用
$wpdb->esc_like()处理搜索关键词,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Kerans
相关产品推荐
相关产品推荐

