rekomendacja wtyczki – Jak przeszukać wszystkie meta użytkowników z users.php w admin
Oczywiście, jak wiesz, musisz zmodyfikować wykonywane wyszukiwanie, co możesz zrobić, modyfikując wartości w instancji WP_User_Search
klasa używana do wyszukiwania (kod źródłowy można znaleźć pod adresem /wp-admin/includes/user.php
jeśli chcesz się tego uczyć).
The WP_User_Search
Obiekt (amortyzowany)
Oto co A print_r()
tego obiektu wygląda tak, jak w WordPress 3.0.3 podczas wyszukiwania terminu „TEST
„ i bez żadnych innych wtyczek, które mogłyby na to wpłynąć:
WP_User_Search Object
(
[results] =>
[search_term] => TEST
[page] => 1
[role] =>
[raw_page] =>
[users_per_page] => 50
[first_user] => 0
[last_user] =>
[query_limit] => LIMIT 0, 50
[query_orderby] => ORDER BY user_login
[query_from] => FROM wp_users
[query_where] => WHERE 1=1 AND (user_login LIKE '%TEST%' OR user_nicename LIKE '%TEST%' OR user_email LIKE '%TEST%' OR user_url LIKE '%TEST%' OR display_name LIKE '%TEST%')
[total_users_for_query] => 0
[too_many_total_users] =>
[search_errors] =>
[paging_text] =>
)
The pre_user_search
Hak (przeceniony)
Aby zmodyfikować wartości WP_User_Search
obiekt, z którego będziesz korzystać 'pre_user_search'
hak, który odbiera bieżącą instancję obiektu; dzwoniłem print_r()
z tego haka, aby uzyskać dostęp do jego wartości, które pokazałem powyżej.
Poniższy przykład, który możesz skopiować do swojego motywu functions.php
plik lub którego możesz użyć w pliku PHP dla wtyczki, którą piszesz, dodaje możliwość wyszukaj w opisie użytkownika oprócz możliwości wyszukiwania w innych polach. Funkcja modyfikuje query_from
i query_where
właściwości $user_search
obiekt, którego zrozumienie wymaga znajomości języka SQL.
Ostrożne modyfikowanie kodu SQL w hookach
Kod w yoursite_pre_user_search()
zakłada, że żadna inna wtyczka nie zmodyfikowała pliku query_where
klauzula przed nim; jeśli inna wtyczka zmodyfikowała klauzulę where w taki sposób, że zastąpienie 'WHERE 1=1 AND ('
z "WHERE 1=1 AND ({$description_where} OR"
już nie działa, to też się zepsuje. O wiele trudniej jest napisać solidny dodatek, którego nie można zepsuć inną wtyczką podczas takiej modyfikacji SQL, ale tak właśnie jest.
Dodaj wiodące i końcowe spacje podczas wstawiania kodu SQL w hookach
Należy również pamiętać, że podczas używania SQL w ten sposób w WordPress zawsze dobrym pomysłem jest uwzględnienie wiodących i końcowych spacji, takich jak with " INNER JOIN {$wpdb->usermeta} ON "
w przeciwnym razie zapytanie SQL może zawierać następujące elementy, w których wcześniej nie ma spacji "INNER"
co oczywiście zakończy się niepowodzeniem: " FROM wp_postsINNER JOIN {$wpdb->usermeta} ON "
.
Używać "{$wpdb->table_name"}
zamiast kodowania na stałe nazw tabel
Następnie pamiętaj, aby zawsze używać $wpdb
properties do odwoływania się do nazw tabel na wypadek, gdyby witryna zmieniła prefiks tabeli z 'wp_'
do czegoś innego. Dlatego lepiej jest odnieść się do "{$wpdb->users}.ID"
(z podwójnymi cudzysłowami, a nie pojedynczymi) zamiast twardego kodowania "wp_users.ID"
.
Ogranicz zapytanie do tylko wtedy, gdy istnieją wyszukiwane hasła
Na koniec modyfikuj zapytanie tylko wtedy, gdy istnieje wyszukiwane hasło, które możesz przetestować, sprawdzając search_term
własność r WP_User_Search
obiekt.
The yoursite_pre_user_search()
Funkcja dla 'pre_user_search'
add_action('pre_user_search','yoursite_pre_user_search');
function yoursite_pre_user_search($user_search) {
global $wpdb;
if (!is_null($user_search->search_term)) {
$user_search->query_from .= " INNER JOIN {$wpdb->usermeta} ON " .
"{$wpdb->users}.ID={$wpdb->usermeta}.user_id AND " .
"{$wpdb->usermeta}.meta_key='description' ";
$description_where = $wpdb->prepare("{$wpdb->usermeta}.meta_value LIKE '%s'",
"%{$user_search->search_term}%");
$user_search->query_where = str_replace('WHERE 1=1 AND (',
"WHERE 1=1 AND ({$description_where} OR ",$user_search->query_where);
}
}
Przeszukiwanie każdej pary klucz-wartość meta wymaga kodu SQL JOIN
Oczywiście prawdopodobnym powodem, dla którego WordPress nie pozwala wyszukiwać w polach usermeta, jest to, że każde z nich dodaje SQL JOIN
do zapytania i do zapytania ze zbyt wieloma sprzężeniami może być rzeczywiście powolny. Jeśli naprawdę potrzebujesz przeszukiwać wiele pól, utworzę plik '_search_cache'
pole w usermeta, które gromadzi wszystkie inne informacje w jednym polu usermeta, aby wymagać tylko jednego połączenia, aby przeszukać je wszystkie.
Wiodące podkreślenia w kluczach meta mówią WordPressowi, aby się nie wyświetlał
Zwróć uwagę, że wiodące podkreślenie w '_search_cache'
mówi WordPressowi, że jest to wartość wewnętrzna, a nie coś, co kiedykolwiek ma być wyświetlane użytkownikowi.
Utwórz pamięć podręczną wyszukiwania za pomocą 'profile_update'
I 'user_register'
Haki
Więc będziesz musiał podłączyć oba 'profile_update'
I 'user_register'
uruchamiane odpowiednio po zapisaniu użytkownika i zarejestrowaniu nowego użytkownika. Możesz pobrać wszystkie klucze meta i ich wartości w tych hakach (ale pomiń te, których wartości są serializowanymi lub tablicami zakodowanymi w adresach URL) a następnie połącz je, aby zapisać jako jedną długą wartość meta za pomocą '_search_cache'
klucz.
Zapisz Meta jako '|'
Rozdzielone pary klucz-wartość
Postanowiłem pobrać wszystkie nazwy kluczy i wszystkie ich wartości i połączyć je w jeden duży ciąg z dwukropkami („:”) oddzielającymi klucze od wartości i pionowymi kreskami („|”) oddzielającymi pary klucz-wartość w ten sposób (Owinąłem je w wielu liniach, abyś mógł je bez przewijania w prawo):
nickname:mikeschinkel|first_name:mikeschinkel|description:This is my bio|
rich_editing:true|comment_shortcuts:false|admin_color:fresh|use_ssl:null|
wp_user_level:10|last_activity:2010-07-28 01:25:46|screen_layout_dashboard:2|
plugins_last_view:recent|screen_layout_post:2|screen_layout_page:2|
business_name:NewClarity LLC|business_description:WordPress Plugin Consulting|
phone:null|last_name:null|aim:null|yim:null|jabber:null|
people_lists_linkedin_url:null
###Włącza wyspecjalizowane wyszukiwanie przy użyciu meta key:value
Dodanie klucza i wartości, tak jak my, umożliwia wyszukiwanie typu „rich_editing:true
aby znaleźć wszystkich, którzy mają bogate możliwości edycji, lub wyszukaj „phone:null
„, aby znaleźć tych, którzy nie mają numeru telefonu.
Ale uważaj na artefakty wyszukiwania
Oczywiście użycie tej techniki tworzy potencjalnie niechciane artefakty wyszukiwania, takie jak search for „biznes” i wszyscy będą wpisani. Jeśli to stanowi problem, możesz nie chcieć używać tak rozbudowanej pamięci podręcznej.
The yoursite_profile_update()
Funkcja dla 'profile_update'
I 'user_register'
Dla funkcji yoursite_profile_update()
tak jak yoursite_pre_user_search()
powyżej można skopiować do swojego motywu functions.php
plik lub możesz użyć w pliku PHP dla wtyczki, którą piszesz:
add_action('profile_update','yoursite_profile_update');
add_action('user_register','yoursite_profile_update');
function yoursite_profile_update($user_id) {
$metavalues = get_user_metavalues(array($user_id));
$skip_keys = array(
'wp_user-settings-time',
'nav_menu_recently_edited',
'wp_dashboard_quick_press_last_post_id',
);
foreach($metavalues[$user_id] as $index => $meta) {
if (preg_match('#^a:[0-9]+:{.*}$#ms',$meta->meta_value))
unset($metavalues[$index]); // Remove any serialized arrays
else if (preg_match_all('#[^=]+=[^&]\&#',"{$meta->meta_value}&",$m)>0)
unset($metavalues[$index]); // Remove any URL encoded arrays
else if (in_array($meta->meta_key,$skip_keys))
unset($metavalues[$index]); // Skip and uninteresting keys
else if (empty($meta->meta_value)) // Allow searching for empty
$metavalues[$index] = "{$meta->meta_key }:null";
else if ($meta->meta_key!='_search_cache') // Allow searching for everything else
$metavalues[$index] = "{$meta->meta_key }:{$meta->meta_value}";
}
$search_cache = implode('|',$metavalues);
update_user_meta($user_id,'_search_cache',$search_cache);
}
Zaktualizowano yoursite_pre_user_search()
Funkcja umożliwiająca pojedynczy SQL JOIN
do wyszukiwania wszystkich interesujących wartości meta
Oczywiście dla yoursite_profile_update()
aby uzyskać jakikolwiek efekt, musisz zmodyfikować yoursite_pre_user_search()
korzystać z '_search_cache'
meta klucz zamiast opisu, który mamy tutaj (z tymi samymi zastrzeżeniami, co powyżej):
add_action('pre_user_search','yoursite_pre_user_search');
function yoursite_pre_user_search($user_search) {
global $wpdb;
if (!is_null($user_search->search_term)) {
$user_search->query_from .= " INNER JOIN {$wpdb->usermeta} ON " .
"{$wpdb->users}.ID={$wpdb->usermeta}.user_id AND " .
"{$wpdb->usermeta}.meta_key='_search_cache' ";
$meta_where = $wpdb->prepare("{$wpdb->usermeta}.meta_value LIKE '%s'",
"%{$user_search->search_term}%");
$user_search->query_where = str_replace('WHERE 1=1 AND (',
"WHERE 1=1 AND ({$meta_where} OR ",$user_search->query_where);
}
}