经过一些艰苦的工作和研究,我终于想出了这个可行的解决方案。
请随时改进此代码并发布替代答案。出于某种原因,查询似乎运行了不止一次(在我的情况下是三到四次)。
这里,我用三个钩子,posts_search
, posts_join
和posts_groupby
作用custom_search_posts 允许您一起搜索术语和用户。
-搜索用户和术语。例如:如果有一篇标题为“金钱”的帖子,是由用户史密斯写的。你可以搜索Smith money,结果将在帖子中显示。注意:作者姓名必须排在术语之前。
-仅搜索用户(usermeta
, first_name
或last_name
)
-仅搜索术语(仅在标题中)。
-您甚至可以一次搜索多个用户。
function custom_search_posts( $search, &$wp_query )
{
global $wpdb;
if ( empty( $search ) )
return $search; // exit if search is empty
$q = $wp_query->query_vars;
$n = ! empty( $q[\'exact\'] ) ? \'\' : \'%\';
$search = \'\';
$searchand = \'\';
add_filter(\'posts_join\', \'custom_posts_join\' );
add_filter(\'posts_groupby\', \'custom_posts_groupby\' );
foreach ( (array) $q[\'search_terms\'] as $term ) {
$user_args = array(
\'meta_query\' => array(
\'relation\' => \'OR\',
array(
\'key\' => \'first_name\',
\'value\' => $term,
\'compare\' => \'LIKE\'
),
array(
\'key\' => \'last_name\',
\'value\' => $term,
\'compare\' => \'LIKE\'
)
));
$user_query = new WP_User_Query( $user_args );
$users = $user_query ->get_results();
$term = esc_sql( like_escape( $term ) );
$search .= "{$searchand} $wpdb->posts.post_title LIKE \'{$n}{$term}{$n}\' ";
if (!empty($users)) {
foreach ($users as $user) {
$user_id = $user->ID;
$search .= " OR $wpdb->posts.post_author IN (\'{$user_id}\') ";
}
}
$searchand = \' AND \';
}
if ( ! empty( $search ) ) {
$search = " AND ({$search}) ";
if ( ! is_user_logged_in() )
$search .= " AND ($wpdb->posts.post_password = \'\') ";
}
$search .= " AND $wpdb->posts.post_type IN (\'post\')";
$search .= " AND $wpdb->posts.post_status = \'publish\'";
remove_filter(\'posts_join\', \'custom_posts_join\' );
remove_filter(\'posts_groupby\', \'custom_posts_groupby\' );
return $search;
}
add_filter( \'posts_search\', \'custom_search_posts\', 500, 2 );
功能
custom_posts_join 允许我们加入
postmeta
在…上
posts
按作者搜索帖子。
function custom_posts_join($join){
global $wpdb;
if( is_search() && !is_admin()) {
$join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
}
return $join;
}
功能
custom_posts_groupby 现在我们分组
postmeta
和
posts
按职位
ID
function custom_posts_groupby( $groupby ) {
global $wpdb;
if( is_search() && !is_admin()) {
$groupby = "$wpdb->posts.ID";
}
return $groupby;
}
我在通过mysql查询用户时遇到了一些问题,所以我改用WP\\u User\\u Query。
我希望有人来改进代码,主要是在性能方面。
EDIT:没有必要posts_join
和posts_groupby
在这种情况下。