Creați un CRM simplu în WordPress Extinderea WordPress Search

Ne-am uitat la modul de a crea un simplu sistem CRM în WordPress. În ultima parte a acestei serii, am adăugat un cod pluginului nostru care ne-a permis să afișăm câmpurile personalizate avansate în Tabelul listei WordPress (WP_List_Table) și să sortarem datele noastre în ordine alfabetică prin acele câmpuri noi.

Astăzi vom discuta cum să extindem funcția de căutare pentru a include datele stocate în câmpurile personalizate.

Funcția de căutare

Fiecare tip de postare care are o interfață de administrare vine cu o casetă de căutare:

În mod implicit, atunci când un utilizator caută postări în interfața de administrare WordPress, WordPress va căuta wp_posts tabelă pentru a găsi toate potrivirile parțiale de conținut din următoarele câmpuri:

  • Titlu
  • Conţinut
  • Extras

Dacă încercăm să căutăm un număr de telefon parțial, vom vedea că nu apare niciun rezultat:

Pentru tipul de postare personalizată de contact, acest lucru nu este foarte util dacă dorim să găsim un contact prin numărul de telefon sau adresa de e-mail!

Câmpurile personalizate avansate își stochează datele în wp_postmeta tabel, care WordPress nu caută în mod implicit. Trebuie să folosim două dintre cele oferite de WordPress filtre pentru a permite funcționalității de căutare WordPress să caute, de asemenea, date personalizate pentru câmpurile personalizate. Aceste filtre vor:

  1. efectuați un JOIN SQL între tabela WordPress Post Meta și tabela Posts WordPress
  2. adăugați o clauză SQL WHERE la WordPress Post Query pentru a căuta în tabela noastră WordPress Posts Meta

Efectuarea unui JOIN SQL

Să începem prin adăugarea posts_join filtrați constructul clasei noastre de plugin pentru a vă alătura WordPress:

/ ** * Constructor. Chemată când pluginul este inițializat * / funcția __construct () add_action ('init', array (& $ this, 'register_custom_post_type')); add_action ('plugins_loaded', array (& $ this, 'acf_fields')); add_filter ('manage_edit-contact_columns', array (& $ this, 'add_table_columns')); add_action ('manage_contact_posts_custom_column', array (& $ this, 'output_table_columns_data'), 10, 2); add_filter ('manage_edit-contact_sortable_columns', array (& $ this, 'define_sortable_table_columns')); dacă is_admin ()) add_filter ('request', array (& $ this, 'orderby_sortable_table_columns')); add_filter ('posts_join', array (& $ this, 'search_meta_data_join'));  

Trebuie să definim și noi search_meta_data_join () funcție, care spune WordPress care tabel dorim să se alăture la principalele tabele Posts WordPress:

/ ** * adaugă o conexiune la tabela meta WordPress pentru căutările cheii de licență în administrarea WordPress * * @param string $ join declarație JOIN * @ retur string declarație SQL JOIN * / funcția search_meta_data_join ($ join) global $ wpdb; // Numai să aderăm la tabela de meta post dacă executăm o căutare dacă (go_query_var ('s'))) return $ join;  // Alăturați-vă numai tabelului meta de post dacă suntem pe Tipul de postări personalizate de contact dacă ('contact'! = Get_query_var ('post_type')) return $ join;  // Alăturați-vă meta-tabelului postului $ join = = LEFT JOIN $ wpdb-> postmeta ON $ wpdb-> posts.ID = $ wpdb-> postmeta.post_id "; întoarcere $ join;  

get_query_var () este o funcție care returnează variabila de interogare corespunzătoare stocată în WP_Query clasă. WP_Query este o clasă WordPress care oferă:

... informații care definesc cererea curentă ... cu ce tip de interogare se ocupă (eventual o arhivă de categorie, arhivă datată, feed sau căutare) și se preia postările solicitate. Păstrează multe informații despre cerere, care pot fi trase la o dată ulterioară.

get_query_var () este magia care ne permite să "tragem" acele informații. În acest caz, verificăm variabila de interogare 'S', ne spune ce termen de căutare (dacă este cazul) a solicitat utilizatorul. De asemenea, folosim aceeași funcție pentru a verifica tipul de mesaje pe care utilizatorul o solicită - dorim doar să extindem căutarea dacă utilizatorul se uită la tipul de postare personalizată de contact.

Dacă aceste condiții sunt îndeplinite, ne alăturăm wp_postmeta la masă wp_posts masa.

$ wpdb este de asemenea folosit aici și este o clasă definită care:

... conține un set de funcții utilizate pentru a interacționa cu o bază de date. Scopul său principal este să furnizeze o interfață cu baza de date WordPress, dar poate fi folosit pentru a comunica cu orice altă bază de date adecvată.

Pe scurt, $ wpdb ne permite să accesăm baza de date MySQL, să obținem setările de configurare și să efectuăm interogări SQL.

În acest caz, folosim $ wpdb pentru a obține numele meselor Post și Post Meta, deoarece acestea pot fi modificate de fiecare instalare WordPress. De exemplu, o singură instalare poate seta prefixul de nume al tabelului wp_ (care este setarea implicită), în timp ce o altă instalație o poate seta my_awesome_site_. Nu putem codifica greu nume de tabele, deoarece nu putem garanta că vor fi întotdeauna wp_posts și wp_postmeta, așa că vom folosi $ Wpdb-> posturi și $ Wpdb-> postmeta, care conțin numele de tabel propriu-zis pentru instalarea WordPress.

Adăugarea la clauza SQL WHERE

Cu SQL JOIN complet, acum trebuie să spun WordPress pentru a căuta tabelul Post Meta alăturat.

Du-te înapoi la plug-in-uri __construi(), și adăugați o nouă funcție la posts_where filtru:

/ ** * Constructor. Chemată când pluginul este inițializat * / funcția __construct () add_action ('init', array (& $ this, 'register_custom_post_type')); add_action ('plugins_loaded', array (& $ this, 'acf_fields')); add_filter ('manage_edit-contact_columns', array (& $ this, 'add_table_columns')); add_action ('manage_contact_posts_custom_column', array (& $ this, 'output_table_columns_data'), 10, 2); add_filter ('manage_edit-contact_sortable_columns', array (& $ this, 'define_sortable_table_columns')); dacă is_admin ()) add_filter ('request', array (& $ this, 'orderby_sortable_table_columns')); add_filter ('posts_join', array (& $ this, 'search_meta_data_join')); add_filter ('posts_where', array (& $ this, 'search_meta_data_where'));  

Trebuie să definim și noi search_meta_data_where () funcție, care spune WordPress căutării datelor noastre postale Meta:

/ ** * adaugă o clauză în cazul tabelei meta WordPress pentru căutările cheie de licență în WordPress Administration * * @ param string $ unde clauza SQL WHERE * @return string SQL WHERE clauze * / functie search_meta_data_where ($ where)  global $ wpdb; // Numai să aderăm la tabela de meta după ce efectuăm o căutare dacă (go_query_var ('s'))) return $ where;  // Alăturați-vă numai tabelului meta post dacă suntem pe Tipul de postări personalizate de contact dacă ('contact'! = Get_query_var ('post_type')) return $ where;  // Începeți interogarea, care este 'AND ((' și restul interogării $ startOfQuery = substr ($ unde, 0, 7); $ restOfQuery = substr ($ unde, 7); Inserați clauza WHERE între începutul interogării și restul interogării $ where = $ startOfQuery. "(". $ Wpdb-> postmeta. ".Meta_value LIKE '%'. Get_query_var ('s) "OR" $ restOfQuery "GRUP BY". $ Wpdb-> posts. ".Id"; // Returnare revizuită clauză WHERE return $ where; 

În același mod ca și noi search_meta_data_join (), verificăm din nou că WordPress Query este o căutare în Tipul de postări personalizate pentru contacte. Dacă nu este, vom returna $ în timp ce clauză fără modificări.

Dacă trebuie să modificăm $ în timp ce clauză, facem acest lucru prin:

  • obținerea startului clauzei WHERE: ' ȘI(('
  • obținerea restului clauzei WHERE
  • injectând clauza noastră WHERE pentru a căuta tabelele Post Meta meta_value pentru orice caz al termenului nostru de căutare
  • adăugând o condiție OR la ​​sfârșitul clauzei WHERE, adăugând restul interogării la aceasta
  • gruparea rezultatelor prin Post ID

Trebuie să grupăm rezultatele deoarece, în mod tipic, vor fi mai multe intrări în tabelul Post Meta pentru un anumit Post ID. Pentru că am stabilit un JOIN între Posturi și posta Meta lor, dacă nu am grupa rezultatele, am fi primit același Post repetând în tabelul nostru.

Pentru a verifica dacă clauzele noastre JOIN și WHERE au funcționat, reîncărcați tabelul de contacte și încercați să căutați unul dintre persoanele dvs. de contact printr-o parte a numărului lor de telefon:

Dacă funcționează, felicitări! Acum puteți căuta după toate câmpurile personalizate avansate pe care le specificați în sistemul CRM.

Urmeaza…

În următorul articol, vom restrânge și ascunde funcționalitatea de administrare WordPress și elementele de meniu pe care nu le avem nevoie pentru CRM-ul nostru.

Cod