Wir haben untersucht, wie Sie ein einfaches CRM-System in WordPress erstellen können. Im letzten Teil dieser Serie haben wir unserem Plugin Code hinzugefügt, mit dem wir unsere erweiterten benutzerdefinierten Felder in der WordPress-Listentabelle (WP_List_Table) anzeigen und unsere Daten alphabetisch nach diesen neuen Feldern sortieren können.
Heute erfahren Sie, wie Sie die Suchfunktion um die in unseren benutzerdefinierten Feldern gespeicherten Daten erweitern können.
Jeder Beitragstyp, der über eine Administrationsoberfläche verfügt, wird mit einem Suchfeld geliefert:
Wenn ein Benutzer in der Benutzeroberfläche von WordPress Administration nach Beiträgen sucht, durchsucht WordPress standardmäßig die wp_posts
Tabelle, um mögliche Übereinstimmungen des Inhalts in den folgenden Feldern zu finden:
Wenn wir versuchen, nach einer teilweisen Telefonnummer zu suchen, werden keine Ergebnisse angezeigt:
Für unseren Kontaktpostart ist dies nicht sehr nützlich, wenn wir einen Kontakt nach Telefonnummer oder E-Mail-Adresse suchen möchten!
Advanced Custom Fields speichert seine Daten in der wp_postmeta
Tabelle, die WordPress standardmäßig nicht durchsucht. Wir müssen zwei von WordPress zur Verfügung stellen Filter um zu ermöglichen, dass die Suchfunktion von WordPress auch nach erweiterten benutzerdefinierten Felddaten sucht. Diese Filter werden:
Beginnen wir mit dem Hinzufügen der posts_join
filtern Sie das Konstrukt unserer Plugin-Klasse, um an WordPress teilzunehmen:
/** * Konstrukteur. Wird aufgerufen, wenn das Plugin initialisiert wird * / 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'));
Wir müssen auch unsere definieren search_meta_data_join ()
Funktion, die WordPress mitteilt, welche Tabelle wir mit der Haupttabelle von WordPress Posts verbinden möchten:
/ ** * Fügt der WordPress-Metatabelle eine Verknüpfung für die Suche nach Lizenzschlüsseln in der WordPress-Administration hinzu. // Join die Post-Metatabelle nur, wenn wir eine Suche durchführen, wenn (empty (get_query_var ('s'))) return $ join; // Join die post-Metatabelle nur, wenn wir uns im benutzerdefinierten Kontakttyp für Kontakte befinden if ('contact'! = Get_query_var ('post_type')) return $ join; // Join die Post-Metatabelle $ join. = "LEFT JOIN $ wpdb-> postmeta ON $ wpdb-> posts.ID = $ wpdb-> postmeta.post_id"; return $ join;
get_query_var ()
ist eine Funktion, die die entsprechende Abfragevariable zurückgibt WP_Query
Klasse. WP_Query
ist eine WordPress-Klasse, die Folgendes bietet:
… Informationen, die die aktuelle Anfrage definieren… mit welcher Art von Abfrage sie sich befasst (möglicherweise ein Kategorienarchiv, ein datiertes Archiv, ein Feed oder eine Suche) und die angeforderten Beiträge abruft. Es enthält viele Informationen zu der Anforderung, die zu einem späteren Zeitpunkt abgerufen werden können.
get_query_var ()
ist die Magie, die uns diese Informationen "ziehen" lässt. In diesem Fall prüfen wir die Abfragevariable 's'
, uns mitzuteilen, welchen Suchbegriff (falls vorhanden) der Benutzer angefragt hat. Dieselbe Funktion verwenden wir auch, um zu überprüfen, welche Beitragstypen der Benutzer anfordert. Wir möchten unsere Suche nur erweitern, wenn der Benutzer den benutzerdefinierten Beitragstyp "Kontakt" betrachtet.
Wenn diese Bedingungen erfüllt sind, schließen wir uns dem an wp_postmeta
Tisch zum Haupt wp_posts
Tabelle.
$ wpdb
wird auch hier verwendet, und es ist eine definierte Klasse, die:
… Enthält eine Reihe von Funktionen zur Interaktion mit einer Datenbank. Sein Hauptzweck besteht darin, eine Schnittstelle mit der WordPress-Datenbank bereitzustellen, sie kann jedoch zur Kommunikation mit jeder anderen geeigneten Datenbank verwendet werden.
Zusamenfassend, $ wpdb
Damit können wir auf die MySQL-Datenbank zugreifen, Konfigurationseinstellungen abrufen und SQL-Abfragen durchführen.
In diesem Fall verwenden wir $ wpdb
um die Namen der Post- und Post-Metatabellen zu erhalten, da diese von jeder WordPress-Installation geändert werden können. Bei einer Installation kann beispielsweise das Tabellennamenpräfix auf festgelegt werden wp_
(Dies ist die Standardeinstellung), während eine andere Installation dies möglicherweise festlegen kann my_awesome_site_
. Wir können keine harten Tabellennamen kodieren, da wir nicht garantieren können, dass dies immer der Fall ist wp_posts
und wp_postmeta
, also benutzen wir $ wpdb-> Beiträge
und $ wpdb-> postmeta
, Diese enthalten die tatsächlichen Tabellennamen, die für diese WordPress-Installation spezifisch sind.
Nachdem unser SQL JOIN abgeschlossen ist, müssen wir WordPress jetzt mitteilen, dass es die verknüpfte Post-Meta-Tabelle durchsuchen soll.
Gehe zurück zum Plugin __konstruieren()
, und fügen Sie eine neue Funktion hinzu posts_where
Filter:
/** * Konstrukteur. Wird aufgerufen, wenn das Plugin initialisiert wird * / 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'));
Wir müssen auch unsere definieren search_meta_data_where ()
Funktion, die WordPress anweist, unsere Post-Meta-Daten zu durchsuchen:
/ ** * Fügt der WordPress-Metatabelle eine where-Klausel für die Suche nach Lizenzschlüsseln in der WordPress-Administration hinzu. * * @Param-Zeichenfolge $ wobei SQL-WHERE-Klausel * @return-Zeichenfolge global $ wpdb; // Join die Post-Metatabelle nur, wenn wir eine Suche durchführen, wenn (empty (get_query_var ('s'))) return $ where; // Join die post-Metatabelle nur, wenn wir uns im benutzerdefinierten Kontakttyp für Kontakte befinden if ('contact'! = Get_query_var ('post_type')) return $ where; // Den Anfang der Abfrage erhalten, der 'AND ((') und der Rest der Abfrage $ startOfQuery = substr ($ where, 0, 7); $ restOfQuery = substr ($ where, 7); // Fügen Sie unsere WHERE-Klausel zwischen dem Start der Abfrage und dem Rest der Abfrage ein. 'ODER ". $ RestOfQuery." GROUP BY ". $ Wpdb-> posts." .Id "; // // Überarbeitete WHERE-Klausel zurückgeben return $ where;
Auf die gleiche Weise wie in search_meta_data_join ()
, Wir überprüfen erneut, dass die WordPress-Abfrage eine Suche nach dem benutzerdefinierten Kontakttyp "Kontakte" ist. Wenn nicht, geben wir das zurück $ während
Klausel ohne Änderung.
Wenn wir das ändern müssen $ während
Klausel, wir tun dies durch:
' UND(('
meta_value
Spalte für jede Instanz unseres SuchbegriffsWir müssen die Ergebnisse gruppieren, da in der Tabelle "Post-Meta" normalerweise mehr als ein Eintrag für eine bestimmte Beitrags-ID vorhanden ist. Da wir ein JOIN zwischen den Posts und ihrem Post-Meta einrichten, würden wir, wenn wir die Ergebnisse nicht gruppieren, denselben Post in unserer Tabelle wiederholen.
Um zu überprüfen, ob unsere JOIN- und WHERE-Klauseln funktioniert haben, laden Sie Ihre Kontakttabelle neu und versuchen Sie, einen Ihrer Kontakte anhand eines Teils ihrer Telefonnummer zu suchen:
Wenn es funktioniert, herzlichen Glückwunsch! Sie können jetzt nach beliebigen benutzerdefinierten Feldern suchen, die Sie in Ihrem CRM-System angeben.
Im nächsten Artikel werden wir die WordPress-Verwaltungsfunktionen und Menüelemente einschränken und ausblenden, die wir für unser CRM nicht benötigen.