Creare un semplice CRM in WordPress estendere la ricerca di WordPress

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.

Funzionalità di ricerca

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:

  • Titolo
  • Soddisfare
  • Estratto

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:

  1. eseguire un JOIN SQL tra la tabella Meta Post Post di WordPress e la tabella Post WordPress
  2. aggiungi una clausola SQL WHERE alla Query di WordPress per cercare nella nostra tabella Meta dei post di WordPress

Esecuzione di un JOIN SQL

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.

Aggiungendo alla clausola WHERE SQL

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:

  • ottenere l'inizio della clausola WHERE: ' E(('
  • ottenere il resto della clausola WHERE
  • iniettando la nostra clausola WHERE per cercare le tabelle di Meta Meta meta_value colonna per qualsiasi istanza del nostro termine di ricerca
  • aggiungendo una condizione OR alla fine della nostra clausola WHERE, aggiungendo il resto della query ad essa
  • raggruppare i risultati per l'ID postale

Abbiamo 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.

Avanti il ​​prossimo…

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.