问题描述
我创建了一个自定义的帖子类型,并附加了一些自定义字段。现在,我希望作者可以在自定义帖子列表屏幕 (在管理员后端) 中执行的搜索,也可以在元数据文件上执行,而不仅仅是像往常一样查看标题和内容。
我在哪里可以挂断哪些代码?
示例图像
斯特凡诺
最佳解决方案
我解决了通过在 postmeta 表上添加 join 来更改 where 子句来过滤查询。过滤 WHERE 子句的提示 (通常需要正则表达式搜索和替换) 是 here on codex:
add_filter('posts_join', 'segnalazioni_search_join' );
function segnalazioni_search_join ($join){
global $pagenow, $wpdb;
// I want the filter only when performing a search on edit page of Custom Post Type named "segnalazioni"
if ( is_admin() && $pagenow=='edit.php' && $_GET['post_type']=='segnalazioni' && $_GET['s'] != '') {
$join .='LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
}
return $join;
}
add_filter( 'posts_where', 'segnalazioni_search_where' );
function segnalazioni_search_where( $where ){
global $pagenow, $wpdb;
// I want the filter only when performing a search on edit page of Custom Post Type named "segnalazioni"
if ( is_admin() && $pagenow=='edit.php' && $_GET['post_type']=='segnalazioni' && $_GET['s'] != '') {
$where = preg_replace(
"/(s*".$wpdb->posts.".post_titles+LIKEs*('[^']+')s*)/",
"(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
}
return $where;
}
次佳解决方案
这将工作,
function custom_search_query( $query ) {
$custom_fields = array(
// put all the meta fields you want to search for here
"rg_first_name",
"rg_1job_designation"
);
$searchterm = $query->query_vars['s'];
// we have to remove the "s" parameter from the query, because it will prevent the posts from being found
$query->query_vars['s'] = "";
if ($searchterm != "") {
$meta_query = array('relation' => 'OR');
foreach($custom_fields as $cf) {
array_push($meta_query, array(
'key' => $cf,
'value' => $searchterm,
'compare' => 'LIKE'
));
}
$query->set("meta_query", $meta_query);
};
}
add_filter( "pre_get_posts", "custom_search_query");
第三种解决方案
斯特凡诺的答案是伟大的,但它缺乏一个独特的条款:
function segnalazioni_search_distinct( $where ){
global $pagenow, $wpdb;
if ( is_admin() && $pagenow=='edit.php' && $_GET['post_type']=='segnalazioni' && $_GET['s'] != '') {
return "DISTINCT";
}
return $where;
}
add_filter( 'posts_distinct', 'segnalazioni_search_distinct' );
添加上面的代码更新它,它将不会重复。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。