Bawiłem się fragmentami kodu, które dodają metadane do wyszukiwań administratora.
Najlepszy fragment, jaki znalazłem, został napisany przez Stefano na to pytanie .
Wydaje się jednak, że ma 1, irytujący błąd podczas wyszukiwania terminów niemeta.
Oto kilka chwytów z mojej lokalnej instalacji deweloperskiej. Wydrukowałem 2 zapytania MySQL na ekranie.
Widok jednego posta CPT, którego używam do testowania
Ten kod działa zgodnie z oczekiwaniami i pozwala mi wyszukiwać metadane od administratora
Niestety kod tworzy duplikaty przy dopasowaniach innych niż meta, w tym przypadku przy tytule postu
Chwyt pokazujący status postu, typ posta i post przodków duplikatów
! Chwyt pokazujący status postu, typ posta i post przodków duplikatów
Oto kod, który uruchamiam, jest w zasadzie taki sam jak kod Stefano, ale przy moich prymitywnych próbach uruchomienia zapytania.
/*
* 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
źródło
źródło
Odpowiedzi:
GROUP BY
Stwierdzenie można grupować swoje posty poJOIN
. W przypadku Wordpress możesz użyćposts_groupby
filtra.źródło
Dzięki za pracę nad tym, ludzie. Ten kod zapewnił mi większość możliwości, ale używając WP 3.8 otrzymywałem nieunikalny błąd SQL / błąd aliasu, więc wprowadziłem kilka zmian. Aby działało w mojej konfiguracji, musiałem ustawić alias $ wpdb-> postmeta, który był używany w instrukcji JOIN. Sprawdzam też tylko raz, aby sprawdzić, czy należy użyć haczyków, aby za każdym razem nie strzelały. Mam nadzieję, że to komuś pomoże!
źródło