Abbiamo cercato come creare un semplice sistema CRM in WordPress. Nell'ultima parte di questa serie, abbiamo aggiunto del codice al nostro plug-in che ci ha permesso di visualizzare i nostri campi personalizzati avanzati nella tabella dell'elenco di WordPress (WP_List_Table) e di ordinare i nostri dati in ordine alfabetico in base ai nuovi campi.
Oggi parleremo di come estendere la funzionalità di ricerca per includere i dati memorizzati nei nostri campi personalizzati.
Ogni Post Type che ha un'interfaccia di amministrazione viene fornito con una casella di ricerca:
Per impostazione predefinita, quando un utente cerca Post (s) nell'interfaccia di amministrazione di WordPress, WordPress cercherà il file wp_posts
tabella per trovare corrispondenze di contenuto parziale nei seguenti campi:
Se proviamo a cercare un numero di telefono parziale, vedremo che non appare alcun risultato:
Per il nostro contatto Post Type personalizzato, questo non è molto utile se vogliamo trovare un contatto per numero di telefono o indirizzo e-mail!
Campi personalizzati avanzati memorizza i suoi dati nel wp_postmeta
tabella, che WordPress non ricerca per impostazione predefinita. Abbiamo bisogno di utilizzare due di WordPress forniti filtri per consentire alla funzionalità di ricerca di WordPress di cercare anche i dati dei campi personalizzati avanzati. Questi filtri:
Iniziamo aggiungendo il posts_join
filtra il costrutto della nostra classe plugin per aderire a WordPress:
/ ** * Costruttore. Chiamato quando il plugin è inizializzato * / function __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')); if (is_admin ()) add_filter ('request', array (& $ this, 'orderby_sortable_table_columns')); add_filter ('posts_join', array (& $ this, 'search_meta_data_join'));
Abbiamo anche bisogno di definire il nostro search_meta_data_join ()
funzione, che indica a WordPress quale tabella vogliamo unire alla tabella principale dei Post di WordPress:
/ ** * Aggiunge un join alla tabella meta di WordPress per le ricerche delle chiavi di licenza nell'amministrazione di WordPress * * @param stringa $ join Istruzione SQL JOIN * @return string Istruzione SQL JOIN * / function search_meta_data_join ($ join) global $ wpdb; // Unire solo la metage del post se eseguiamo una ricerca if (vuoto (get_query_var ('s'))) return $ join; // Unire solo la metatag del post se ci si trova nel tipo di post personalizzato Contatti se ('contact'! = Get_query_var ('post_type')) return $ join; // Join the meta table $ join. = "LEFT JOIN $ wpdb-> postmeta ON $ wpdb-> posts.ID = $ wpdb-> postmeta.post_id"; return $ join;
get_query_var ()
è una funzione che restituisce la variabile di query appropriata memorizzata in WP_Query
classe. WP_Query
è una classe WordPress che fornisce:
... informazioni che definiscono la richiesta corrente ... che tipo di query sta trattando (possibilmente un archivio di categorie, archivio datato, feed o ricerca) e recupera i post richiesti. Conserva molte informazioni sulla richiesta, che possono essere estratte in un secondo momento.
get_query_var ()
è la magia che ci permette di "tirare" quell'informazione. In questo caso, controlliamo la variabile di query 'S'
, dicendoci quale termine di ricerca (se esiste) richiesto dall'utente. Usiamo anche questa stessa funzione per verificare quali tipi di post l'utente sta richiedendo: vogliamo solo estendere la nostra ricerca se l'utente sta guardando il tipo di messaggio personalizzato del contatto.
Se queste condizioni sono soddisfatte, ci uniamo al wp_postmeta
tavolo al principale wp_posts
tavolo.
$ wpdb
è anche usato qui, ed è una classe definita che:
... contiene un insieme di funzioni utilizzate per interagire con un database. Il suo scopo principale è quello di fornire un'interfaccia con il database di WordPress, ma può essere utilizzato per comunicare con qualsiasi altro database appropriato.
In breve, $ wpdb
ci consente di accedere al database MySQL, ottenere le impostazioni di configurazione ed eseguire query SQL.
In questo caso, usiamo $ wpdb
per ottenere i nomi delle tabelle Post e Post Meta, perché queste possono essere modificate da ogni installazione di WordPress. Ad esempio, un'installazione potrebbe impostare il prefisso del nome della tabella su wp_
(che è l'impostazione predefinita), mentre un'altra installazione potrebbe impostarlo my_awesome_site_
. Non possiamo assegnare nomi di tabelle hard, poiché non possiamo garantire che lo saranno sempre wp_posts
e wp_postmeta
, quindi usiamo $ Wpdb-> messaggi
e $ Wpdb-> postmeta
, che contengono i nomi delle tabelle reali specifici per l'installazione di WordPress.
Con il nostro SQL JOIN completo, ora dobbiamo dire a WordPress di cercare nella tabella Post Meta unita.
Torna ai plug-in __costruire()
, e aggiungere una nuova funzione al posts_where
filtro:
/ ** * Costruttore. Chiamato quando il plugin è inizializzato * / function __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')); if (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'));
Abbiamo anche bisogno di definire il nostro search_meta_data_where ()
funzione, che dice a WordPress di cercare i nostri dati Meta:
/ ** * Aggiunge una clausola where alla tabella meta di WordPress per le ricerche delle chiavi di licenza nell'amministrazione di WordPress * * @param stringa $ dove clausole WHERE SQL * @return stringhe SQL WHERE clausole * / function search_meta_data_where ($ where) globale $ wpdb; // Unire la tabella dei metadati solo se stiamo eseguendo una ricerca se (vuoto (get_query_var ('s'))) return $ where; // Unire la meta tabella del post solo se siamo nel tipo di post personalizzato Contatti se ('contact'! = Get_query_var ('post_type')) return $ where; // Ottieni l'inizio della query, che è 'AND ((', e il resto della query $ startOfQuery = substr ($ dove, 0, 7); $ restOfQuery = substr ($ where, 7); // Inietta la nostra clausola WHERE tra l'inizio della query e il resto della query $ where = $ startOfQuery. "(". $ Wpdb-> postmeta. ".Meta_value LIKE '%". Get_query_var (' s '). "% 'OR ". $ RestOfQuery." GROUP BY ". $ Wpdb-> post." .Id "; // Restituito clausola WHERE restituita $ where;
Nello stesso modo in cui lo abbiamo fatto search_meta_data_join ()
, controlliamo nuovamente che la query WordPress è una ricerca sul tipo di post personalizzato Contatti. Se non lo è, restituiamo il $ mentre
clausola senza modifiche.
Se abbiamo bisogno di modificare il $ mentre
clausola, lo facciamo da:
' E(('
meta_value
colonna per qualsiasi istanza del nostro termine di ricercaAbbiamo bisogno di raggruppare i risultati perché in genere ci sarà più di una voce nella tabella Post Meta per un determinato Post ID. Poiché abbiamo impostato un JOIN tra i Post e il loro Post Meta, se non avessimo raggruppato i risultati, avremmo ripetuto lo stesso Post nella nostra tabella.
Per verificare che le nostre clausole JOIN e WHERE abbiano funzionato, ricarica la tabella dei contatti e prova a cercare uno dei tuoi contatti per parte del loro numero di telefono:
Se funziona, congratulazioni! Ora puoi cercare in base a qualsiasi campo personalizzato avanzato specificato nel tuo sistema CRM.
Nel prossimo articolo, limiteremo e nasconderemo le funzionalità di amministrazione di WordPress e le voci di menu che non sono necessarie per il nostro CRM.