Maak een eenvoudige CRM in WordPress WordPress Search uitbreiden

We hebben gekeken hoe een eenvoudig CRM-systeem kan worden gemaakt in WordPress. In het laatste deel van deze serie hebben we code aan onze plug-in toegevoegd, waardoor we onze geavanceerde aangepaste velden in de WordPress-lijst met tabellen (WP_List_Table) konden weergeven en onze gegevens alfabetisch op die nieuwe velden konden sorteren.

Vandaag bespreken we hoe u de zoekfunctionaliteit kunt uitbreiden met de gegevens die zijn opgeslagen in onze aangepaste velden.

Zoekfunctionaliteit

Elk berichttype met een beheerinterface wordt geleverd met een zoekvak:

Wanneer een gebruiker standaard naar berichten in de WordPress Administration-interface zoekt, doorzoekt WordPress standaard de wp_posts tabel om gedeeltelijke inhoudovereenkomsten te vinden in de volgende velden:

  • Titel
  • Inhoud
  • Uittreksel

Als we proberen een gedeeltelijk telefoonnummer te vinden, zien we dat er geen resultaten worden weergegeven:

Voor ons Contact Aangepast berichttype is dit niet erg handig als we een contact op telefoonnummer of e-mailadres willen vinden!

Geavanceerde aangepaste velden slaat zijn gegevens op in de wp_postmeta tabel, die WordPress standaard niet doorzoekt. We moeten twee van de aangeboden WordPress's gebruiken filters om de zoekfunctionaliteit van WordPress toe te staan ​​om ook te zoeken in Geavanceerde aangepaste velden. Deze filters zullen:

  1. voer een SQL-JOIN uit tussen de WordPress Post-metatabel en de WordPress Posts-tabel
  2. voeg een SQL WHERE-component toe aan de WordPress Post-query om te zoeken in onze WordPress Posts-metatabel

Een SQL JOIN uitvoeren

Laten we beginnen met het toevoegen van de posts_join filter naar de constructie van onze plugin-klasse om lid te worden van de WordPress:

/ ** * Constructor. Wordt aangeroepen wanneer de plugin wordt geïnitialiseerd * / function __construct () add_action ('init', array (& $ this, 'register_custom_post_type')); add_action ('plugins_loaded', array (& $ this, 'acf_fields')); add_filter ('manage_edit-contact_kolommen', 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'));  

We moeten ook onze search_meta_data_join () functie, die WordPress vertelt welke tabel we willen toevoegen aan de hoofd WordPress Posts tabel:

/ ** * Voegt een join toe aan de WordPress-metatabel voor zoeken naar licentiesleutel in het WordPress-beheer * * @param-tekenreeks $ join SQL JOIN-verklaring * @return-tekenreeks SQL JOIN-verklaring * / function search_meta_data_join ($ join) global $ wpdb; // Neem alleen deel aan de tabel met meta-tabellen als we een zoekopdracht uitvoeren als (empty (get_query_var ('s'))) return $ join;  // Sluit u alleen aan bij de tabel met meta-tabellen als we in het Aangepaste berichttype voor Contacten staan ​​('contact'! = Get_query_var ('post_type')) return $ join;  // Word lid van de tabel meta-tabellen $ join. = "LEFT JOIN $ wpdb-> postmeta ON $ wpdb-> posts.ID = $ wpdb-> postmeta.post_id"; return $ join;  

get_query_var () is een functie die de juiste queryvariabele retourneert die is opgeslagen in de WP_Query klasse. WP_Query is een WordPress-klasse die biedt:

... informatie die het huidige verzoek definieert ... met welk type query het zich bezighoudt (mogelijk een categoriearchief, een gedateerd archief, een feed of een zoekopdracht) en de gevraagde berichten ophaalt. Het bevat veel informatie over het verzoek, dat op een later tijdstip kan worden getrokken.

get_query_var () is de magie waarmee we die informatie kunnen 'trekken'. In dit geval controleren we de queryvariabele 'S', ons vertellen welke zoekterm (indien aanwezig) de gebruiker heeft aangevraagd. We gebruiken dezelfde functie ook om te controleren welk berichttype de gebruiker vraagt. We willen alleen onze zoekopdracht uitbreiden als de gebruiker kijkt naar het aangepaste berichttype.

Als aan deze voorwaarden is voldaan, sluiten we ons aan bij de wp_postmeta tafel naar de main wp_posts tafel.

$ wpdb wordt hier ook gebruikt, en het is een gedefinieerde klasse die:

... bevat een reeks functies die worden gebruikt om te communiceren met een database. Het primaire doel is om een ​​interface te bieden met de WordPress-database, maar kan worden gebruikt om te communiceren met elke andere geschikte database.

Kortom, $ wpdb geeft ons toegang tot de MySQL-database, krijgt configuratie-instellingen en voert SQL-query's uit.

In dit geval gebruiken we $ wpdb om de namen van de Post en Post Meta-tabellen te krijgen, omdat deze kunnen worden aangepast door elke WordPress-installatie. In een installatie kan bijvoorbeeld het voorvoegsel van de tabelnaam worden ingesteld wp_ (wat de standaard is), terwijl een andere installatie dit mogelijk zou instellen my_awesome_site_. We kunnen niet hard coderen voor tabelnamen, omdat we niet kunnen garanderen dat ze dat altijd zullen zijn wp_posts en wp_postmeta, dus gebruiken we $ Wpdb-> berichten en $ Wpdb-> postmeta, die de eigenlijke tabelnamen bevatten die specifiek zijn voor die WordPress-installatie.

Toevoegen aan de SQL WHERE-clausule

Met onze SQL JOIN voltooid, moeten we nu WordPress vertellen om de gekoppelde Post Meta-tabel te doorzoeken.

Ga terug naar de plug-ins __construct (), en voeg een nieuwe functie toe aan de posts_where filter:

/ ** * Constructor. Wordt aangeroepen wanneer de plugin wordt geïnitialiseerd * / function __construct () add_action ('init', array (& $ this, 'register_custom_post_type')); add_action ('plugins_loaded', array (& $ this, 'acf_fields')); add_filter ('manage_edit-contact_kolommen', 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'));  

We moeten ook onze search_meta_data_where () functie, die WordPress vertelt om onze Post Meta-gegevens te doorzoeken:

/ ** * Voegt een where-component toe aan de WordPress-metatabel voor licentiesleutelzoekopdrachten in de WordPress Administration * * @param-tekenreeks $ waarbij SQL WHERE-component (en) * @return-tekenreeks SQL WHERE-clausules * / function search_meta_data_where ($ where)  globale $ wpdb; // Neem alleen deel aan de tabel met meta-tabellen als we een zoekopdracht uitvoeren als (empty (get_query_var ('s'))) return $ where;  // Sluit u alleen aan bij de tabel met meta-tabellen als we op het Aangepaste berichttype voor Contacten staan ​​('contact'! = Get_query_var ('post_type')) return $ where;  // Haal het begin van de query op, dit is 'AND ((', en de rest van de query $ startOfQuery = substr ($ where, 0, 7); $ restOfQuery = substr ($ where, 7); // Injecteer onze WHERE-component tussen het begin van de query en de rest van de query $ where = $ startOfQuery. "(". $ Wpdb-> postmeta. ".Meta_value LIKE '%'. Get_query_var ('s')."% 'OF'. $ RestOfQuery. "GROUP BY". $ Wpdb-> posts. ".Id"; // Return gereviseerde WHERE-clausule return $ where; 

Op dezelfde manier als we deden in search_meta_data_join (), we controleren opnieuw of de WordPress Query een zoekopdracht is op het Aangepaste berichttype van de contactpersoon. Als dat niet het geval is, geven we het $ terwijl clausule zonder wijziging.

Als we het moeten wijzigen $ terwijl clausule, doen we dit door:

  • de start van de WHERE-clausule krijgen: 'EN (('
  • om de rest van de WHERE-clausule te krijgen
  • het injecteren van onze WHERE-component om te zoeken in de Post Meta-tabellen meta_value kolom voor elke instantie van onze zoekterm
  • het toevoegen van een OF-voorwaarde aan het einde van onze WHERE-component, waarbij de rest van de query eraan wordt toegevoegd
  • de resultaten groeperen per post-ID

We moeten de resultaten groeperen, omdat er meestal meer dan één item in de tabel Post Meta voor een bepaalde post-ID staat. Omdat we een JOIN tussen de berichten en hun bericht-meta hebben opgesteld, zouden we als we de resultaten niet groepeerden dezelfde post herhalen in onze tabel.

Om te controleren of onze JOIN- en WHERE-clausules hebben gewerkt, laadt u uw tabel met contactpersonen opnieuw en probeert u een deel van uw telefoonnummer te zoeken naar een van uw contactpersonen:

Als het werkt, gefeliciteerd! U kunt nu zoeken op alle geavanceerde aangepaste velden die u opgeeft in uw CRM-systeem.

Volgende…

In het volgende artikel gaan we de functionaliteit en menu-items van WordPress Administration beperken en verbergen die we niet nodig hebben voor onze CRM.