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.
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:
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:
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.
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:
'EN (('
meta_value
kolom voor elke instantie van onze zoektermWe 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.
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.