Wordpress,也在 post 的类别描述中搜索(或 term_taxonomy.description LIKE %A%)
Wordpress, search in post's categories description too (OR term_taxonomy.description LIKE %A%)
我正在努力寻找一种简单的方法让 wordpress 搜索也能在 post 的类别描述中进行搜索。
我发现的主题很少,但没有真正的答案。
问题是,用户可能也在输入他们搜索的内容 + 类别名称(例如,"Mario Nintendo 64",其中 "Nintendo 64" 是类别名称。截至目前,它会 return 没有结果,这感觉不对)。
我需要在 term_taxonomy.description 中搜索,因为类别有别名,我在此字段中输入别名(例如:"Nintendo 64, N64 etc...")
这是我想出的。
function custom_posts_join ($a) {
global $wpdb;
return $a . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_id) ";
}
function custom_posts_where ($a) {
global $wpdb;
return $a . " AND $wpdb->term_taxonomy.taxonomy = 'category'";
}
add_filter('posts_join', custom_posts_join );
add_filter('posts_where', custom_posts_where );
不过,我需要能够将 OR (term_taxonomy.description LIKE '%A%')
整合到搜索中
截至目前,sql 请求仅搜索
(posts.post_title LIKE '%A%')
OR (posts.post_excerpt LIKE '%A%')
OR (posts.post_content LIKE '%A%')
此外,是否可以添加 DISTINCT,因此它不会多次 return 相同的 post,基于 post 可以属于多个类别的事实.
我真的不知道我是否走在正确的道路上,但我被困住了。
另外我想知道有多大,可能看起来有点调整,结果会在服务器上吗?
好多年没开发了,现在回过头来,也不确定这样会不会让搜索负担过重。 INNER JOIN 是最好的方法吗?
是否有另一种方法可以处理搜索以在 post 的类别描述中进行搜索。
经过几个小时的研究,我终于取得了进展,一切都很完美!
这是现在的样子:
function custom_posts_join ( $join ) {
global $wpdb;
if ( is_search() ) {
$join .= " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_id) ";
}
return $join;
}
function custom_posts_where ( $where ) {
global $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"(".$wpdb->posts.".post_title LIKE ) OR (".$wpdb->term_taxonomy.".description LIKE )", $a );
$where .= " AND $wpdb->term_taxonomy.taxonomy='category'";
}
return $where;
}
add_filter('posts_join', custom_posts_join );
add_filter('posts_where', custom_posts_where );
并添加 DISTINCT:
function custom_posts_distinct ( $distinct ) {
global $wpdb;
if ( is_search() ) {
return "DISTINCT";
}
return $distinct;
}
add_filter( 'posts_distinct', 'custom_posts_distinct' );
不过,性能怎么样,每次研究都做 2 INNER JOIN?
无论如何,这是一个完整的解决方案,我希望这对某人有所帮助。
我正在努力寻找一种简单的方法让 wordpress 搜索也能在 post 的类别描述中进行搜索。 我发现的主题很少,但没有真正的答案。
问题是,用户可能也在输入他们搜索的内容 + 类别名称(例如,"Mario Nintendo 64",其中 "Nintendo 64" 是类别名称。截至目前,它会 return 没有结果,这感觉不对)。
我需要在 term_taxonomy.description 中搜索,因为类别有别名,我在此字段中输入别名(例如:"Nintendo 64, N64 etc...")
这是我想出的。
function custom_posts_join ($a) {
global $wpdb;
return $a . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_id) ";
}
function custom_posts_where ($a) {
global $wpdb;
return $a . " AND $wpdb->term_taxonomy.taxonomy = 'category'";
}
add_filter('posts_join', custom_posts_join );
add_filter('posts_where', custom_posts_where );
不过,我需要能够将 OR (term_taxonomy.description LIKE '%A%')
整合到搜索中
截至目前,sql 请求仅搜索
(posts.post_title LIKE '%A%')
OR (posts.post_excerpt LIKE '%A%')
OR (posts.post_content LIKE '%A%')
此外,是否可以添加 DISTINCT,因此它不会多次 return 相同的 post,基于 post 可以属于多个类别的事实.
我真的不知道我是否走在正确的道路上,但我被困住了。 另外我想知道有多大,可能看起来有点调整,结果会在服务器上吗? 好多年没开发了,现在回过头来,也不确定这样会不会让搜索负担过重。 INNER JOIN 是最好的方法吗?
是否有另一种方法可以处理搜索以在 post 的类别描述中进行搜索。
经过几个小时的研究,我终于取得了进展,一切都很完美!
这是现在的样子:
function custom_posts_join ( $join ) {
global $wpdb;
if ( is_search() ) {
$join .= " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_id) ";
}
return $join;
}
function custom_posts_where ( $where ) {
global $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"(".$wpdb->posts.".post_title LIKE ) OR (".$wpdb->term_taxonomy.".description LIKE )", $a );
$where .= " AND $wpdb->term_taxonomy.taxonomy='category'";
}
return $where;
}
add_filter('posts_join', custom_posts_join );
add_filter('posts_where', custom_posts_where );
并添加 DISTINCT:
function custom_posts_distinct ( $distinct ) {
global $wpdb;
if ( is_search() ) {
return "DISTINCT";
}
return $distinct;
}
add_filter( 'posts_distinct', 'custom_posts_distinct' );
不过,性能怎么样,每次研究都做 2 INNER JOIN?
无论如何,这是一个完整的解决方案,我希望这对某人有所帮助。