Erstellen Sie ein einfaches CRM in WordPress Erweitern der WordPress-Suche

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.

Suchfunktion

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:

  • Titel
  • Inhalt
  • Auszug

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:

  1. Führen Sie einen SQL JOIN zwischen der WordPress Post Meta-Tabelle und der WordPress Posts-Tabelle aus
  2. Fügen Sie eine SQL-WHERE-Klausel an die WordPress-Post-Abfrage an, um unsere WordPress-Posts-Metatabelle zu durchsuchen

SQL JOIN durchführen

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.

Anhängen an die SQL-WHERE-Klausel

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:

  • Den Beginn der WHERE-Klausel erhalten: ' UND(('
  • den Rest der WHERE-Klausel erhalten
  • Injizieren Sie unsere WHERE-Klausel, um die Post-Meta-Tabelle zu durchsuchen meta_value Spalte für jede Instanz unseres Suchbegriffs
  • Fügen Sie eine ODER-Bedingung am Ende unserer WHERE-Klausel hinzu, und fügen Sie den Rest der Abfrage an diese an
  • Gruppieren der Ergebnisse nach der Post-ID

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

Als nächstes…

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.