WordPress Поиск по контенту и имени/нику автора
Есть поиск работающий через аякс, пытаюсь сделать так, чтобы искало как по контенту, так и по имени автора.
Функция ВП
function custom_search_khp() {
$post_type = $_POST['pt'];
if ( $post_type == 'reviews' ) {
$ar_query = new WP_Query( array(
'post_type' => 'reviews',
's' => $_POST['term'],
//'name' => $_POST['term'],
//'author' => $_POST['term'],
) );
/*echo '<pre>';
var_dump($ar_query);
echo '</pre>';*/
if ( $ar_query->have_posts() ) :
while ( $ar_query->have_posts() ) :
$ar_query->the_post();
get_template_part( 'template-parts/content', 'khp-reviews' );
endwhile;
else:
echo '<h3>'. __('The search has not given any results', 'gmr') . '</h3>';
endif;
}
die;
}
add_action( 'wp_ajax_nopriv_search_reviews', 'custom_search_khp' );
add_action( 'wp_ajax_search_reviews', 'custom_search_khp' );
Как я понимаю совместное использование аргументов 's' и ещё каких-либо не даст желаемых результатов. Пробовал добавить name, author , author_name, author__in.. Так же пробовал first_name и last_name как meta_query
Поиск работает либо по имени автора либо по контенту, а нужно и то и другое.
Ответы (1 шт):
Автор решения: Valerii Vasiliev
→ Ссылка
Можно сделать так
function custom_search_khp() {
$post_type = $_POST['pt'];
if ( $post_type == 'reviews' ) {
add_filter('posts_where', 'custom_posts_where' );
$ar_query = new WP_Query( array(
'post_type' => 'reviews',
's' => $_POST['term'],
//'name' => $_POST['term'],
//'author' => $_POST['term'],
) );
/*echo '<pre>';
var_dump($ar_query);
echo '</pre>';*/
if ( $ar_query->have_posts() ) :
while ( $ar_query->have_posts() ) :
$ar_query->the_post();
get_template_part( 'template-parts/content', 'khp-reviews' );
endwhile;
else:
echo '<h3>'. __('The search has not given any results', 'gmr') . '</h3>';
endif;
remove_filter('posts_where', 'custom_posts_where' );
}
die;
}
add_action( 'wp_ajax_nopriv_search_reviews', 'custom_search_khp' );
add_action( 'wp_ajax_search_reviews', 'custom_search_khp' );
function custom_posts_where( $where = '' ){
global $wpdb;
$search = ( isset($_POST['term']) ) ? sanitize_text_field($_POST['term']) : false ;
$search = (string)$search;
$users = $wpdb->get_results( "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'first_name' AND meta_value = '$search'",OBJECT_K );
foreach ($users as $user)
{
$users_ids.=$user->user_id.',';
}
$users_ids = rtrim($users_ids, ',');
$where .= " AND ( ($wpdb->posts.post_author IN ({$users_ids}))
OR ($wpdb->posts.post_title LIKE '$search')
OR ($wpdb->posts.post_content LIKE '$search') )
AND $wpdb->posts.post_type = 'post'
AND $wpdb->posts.post_status = 'publish'";
return $where;
}