wordpress WP_Query:按分类名称搜索

nwo49xxi  于 2022-12-03  发布在  WordPress
关注(0)|答案(1)|浏览(163)

bounty将在2天后过期。回答此问题可获得+50声望奖励。Moni希望吸引更多人关注此问题。

问题:WP_Query搜索字符串需要查找分类名称。
默认情况下,$args['s']只在标题、内容和摘录中搜索,但我还需要在自定义分类名称中搜索。
因此,现在我尝试使用自定义查询来实现它;下面是我代码:

$keyword = "Monster";
$args['s'] = $keyword;

add_filter('posts_join', 'filter_post_join', 10, 1);
add_filter('posts_where', 'filter_post_where', 10, 1);

$posts = new WP_Query($args);


function filter_post_join( $join ) {

    global $wpdb;

    $join .= " LEFT JOIN $wpdb->term_relationships as txr ON ( {$wpdb->posts}.ID = txr.object_id )";
    $join .= " LEFT JOIN $wpdb->terms as trms on ( txr.term_taxonomy_id = trms.term_id )";

    return $join;
}

function filter_post_where( $where ) {
   
    global $keyword;

    $where .= " AND trms.name LIKE $keyword";
    return $where;
}

有谁能告诉我我做错了什么吗?
我找到了一个可行的解决方案https://gist.github.com/markoman78/e22bbebe0d2305f294eb554d5a39d8c3
但它有一个问题,它不能过滤post_type;如果我想从“x”帖子类型中获取帖子,它也会从具有匹配标记名称的其他帖子类型中获取帖子

eh57zj3b

eh57zj3b1#

要使用WP_Query搜索特定分类中的帖子,您可以在查询中使用tax_query参数。此参数允许您指定要搜索的分类,以及要包括在结果中的该分类中的术语。
下面是一个示例,说明如何在WP_Query搜索字符串中使用tax_query参数按分类名称筛选帖子:

$args = array(
    'post_type' => 'my_custom_post_type',
    'tax_query' => array(
        array(
            'taxonomy' => 'my_taxonomy',
            'field' => 'name',
            'terms' => array( 'my_taxonomy_term' )
        )
    )
);

$query = new WP_Query( $args );

此示例使用my_custom_post_type帖子类型与my_taxonomy分类,并搜索分配给该分类中my_taxonomy_term术语得帖子.
在MySQL中,等效的查询可能如下所示:

SELECT *
FROM wp_posts
INNER JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
INNER JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
INNER JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_posts.post_type = 'my_custom_post_type'
    AND wp_term_taxonomy.taxonomy = 'my_taxonomy'
    AND wp_terms.name = 'my_taxonomy_term'

此查询对wp_posts、wp_term_relationships、wp_term_taxonomy和wp_terms表执行JOIN,以搜索分配给指定分类术语的帖子。它按帖子类型和分类名称筛选结果,并返回wp_posts表中匹配帖子的所有列。
当然,您可以根据需要调整此查询以满足您的特定要求。例如,您可能希望包含附加WHERE子句以进一步过滤结果,或者仅从wp_posts表中选择特定列。

相关问题