Я играл с фрагментами кода, которые добавляют метаданные к поискам администратора.
Лучший фрагмент, который я нашел, был написан Стефано по этому вопросу .
Тем не менее, он, похоже, имеет 1, досадную ошибку при поиске неметайных терминов.
Вот некоторые примеры из моей локальной установки dev. Я напечатал 2 запроса MySQL на экран.
Просмотр одного сообщения CPT, которое я использую для тестирования
Этот код работает, как и ожидалось, и позволяет мне искать метаданные от администратора
К сожалению, код создает дубликаты для не-мета совпадений, в данном случае для заголовка сообщения
Захват, показывающий статус поста, тип поста и пост предков дупов
! Захват, показывающий статус поста, тип поста и пост предков дупов
Вот код, который я запускаю, он в основном такой же, как у Стефано, но с моими грубыми попытками заставить запрос работать.
/*
* Search custom fields from admin keyword searches
*/
function rel_search_join( $join ) {
global $pagenow, $wpdb;
if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type'] == 'listings' && $_GET['s'] != '') {
$join .= 'LEFT JOIN ' . $wpdb->postmeta . ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
}
echo '<br><strong>JOIN</strong>: ';
print_r ( $join );
echo '<br>';
return $join;
}
add_filter('posts_join', 'rel_search_join' );
function rel_search_where( $where ) {
global $pagenow, $wpdb;
if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type']=='listings' && $_GET['s'] != '' ) {
$where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
$where = str_replace( "OR wp_posts.post_status = 'pending'", "", $where );
$where = str_replace( "OR wp_posts.post_status = 'private'", "", $where );
$where = str_replace( "OR wp_posts.post_status = 'draft'", "", $where );
$where = str_replace( "OR wp_posts.post_status = 'future'", "", $where );
}
echo '<br><strong>WHERE</strong>: ';
print_r ( $where );
echo '<br>';
return $where;
}
add_filter( 'posts_where', 'rel_search_where' );
plugin-development
custom-field
wp-admin
search
jnthnclrk
источник
источник
Ответы:
GROUP BY
Можно сгруппировать заявление ваши сообщения после того , какJOIN
. Для Wordpress вы можете использоватьposts_groupby
фильтр.источник
Спасибо за вашу работу над этим, ребята. Этот код помог мне пройти большую часть пути, но в WP 3.8 я получил ошибку неуникальной таблицы / псевдонима SQL, поэтому внес некоторые изменения. Чтобы это работало в моей настройке, я должен был установить псевдоним $ wpdb-> postmeta, который использовался в операторе JOIN. Я также проверяю только один раз, чтобы увидеть, следует ли использовать крючки, чтобы они не срабатывали каждый раз. Надеюсь, это поможет кому-то!
источник