WordPress

rekomendacja wtyczki – Jak przeszukać wszystkie meta użytkowników z users.php w admin

  • 22 grudnia, 2010
  • 8 min read
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.

Warto przeczytać!  Jak korzystać z Asystenta pisania SEO w WordPress, aby poprawić SEO

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.

Warto przeczytać!  php - Wordpress Query - Blog Cards Duplikat problemu

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:trueaby znaleźć wszystkich, którzy mają bogate możliwości edycji, lub wyszukaj „phone:null„, aby znaleźć tych, którzy nie mają numeru telefonu.

Warto przeczytać!  zapytanie wp — filtr wyszukiwania WordPress Ajax przy wyborze listy rozwijanej

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);
  }
}


Źródło