Opprett en enkel CRM i WordPress Legge til kolonner til WP_List_Table

Vi har sett på hvordan du lager et enkelt CRM-system i WordPress. I den siste delen av denne serien brukte vi Avanserte egendefinerte felt til å legge til egendefinerte felt i vår Kontakter tilpasset posttype. Vi lærte hvordan du bruker Avanserte egendefinerte felt og konfigurerer det til å fungere programmert.

I dag skal vi dekke hvordan du viser dataene som er lagret i våre egendefinerte felt rett innenfor kontakttabellen.

Alt om WP_List_Table

Hver posttype som har et dashbord bruker WP_List_Table klasse for å gjengi det kjente bordet og tilhørende handlinger:

Som standard vil WordPress vise følgende kolonner:

  • avkrysningsboks (brukes til å velge / avvelge innlegg, som da kan ha handlinger som er brukt til dem)
  • tittel
  • forfatter
  • kommentarer
  • Dato

For vår Ta kontakt med egendefinert innleggstype, er dette ikke veldig nyttig hvis vi raskt vil se viktige detaljer på et øyeblikk, for eksempel kontaktens telefonnummer eller bilde.

WordPress gir et filter og en handling som kan brukes til å legge til nye kolonner i WP_List_Table og bestem utdataene for hvert innlegg.

La oss begynne med å legge til manage_edit- POST_TYPE _columns filtrer til vår plugin class 'konstruksjon. POST_TYPE vil bli navnet på vår posttype, som i dette tilfellet er ta kontakt med:

/ ** * Constructor. Kalt når plugin er initialisert * / funksjon __construct () add_action ('init', array ($ this, 'register_custom_post_type')); add_action ('plugins_loaded', array ($ dette, 'acf_fields')); add_filter ('manage_edit-contact_columns', array ($ dette, 'add_table_columns')); 

Vi må også definere vår add_table_columns () funksjon, som forteller WordPress navnene på våre ekstra kolonner som vi vil gjerne vise på vårt Kontakter bord. Denne funksjonen aksepterer en rekke eksisterende kolonner, som vi kan utvide ved å legge til våre tilpassede tabellkolonner.

/ ** * Legger til tabell kolonner i Kontakter WP_List_Table * * @param array $ kolonner Eksisterende kolonner * @return array Nye kolonner * / funksjon add_table_columns ($ kolonner) $ kolonner ['email_address'] = __ ('Email Address' 'tuts-crm'); $ kolonner ['phone_number'] = __ ('Telefonnummer', 'tuts-crm'); $ kolonner ['photo'] = __ ('Foto', 'tuts-crm'); returnere $ kolonner; 

Vi sørger for at gruppetastene stemmer overens med ACFs egendefinerte feltnavn. Hvis du har forskjellige felt, må du være sikker på at kolonneknappnavnene samsvarer med feltene field navn innstilling.

Se din Kontakt bord ved å klikke på Kontakt i WordPress dashbordmenyen, og du får se våre nye kolonner:

Det vises imidlertid ingen data for hver kontakt i tabellen. Vi må legge til manage_ POST_TYPE _posts_custom_column handling til vår plugin class 'constructor. POST_TYPE Vil igjen være navnet på vår posttype, som i dette tilfellet er ta kontakt med:

/ ** * Constructor. Kalt når plugin er initialisert * / funksjon __construct () add_action ('init', array ($ this, 'register_custom_post_type')); add_action ('plugins_loaded', array ($ dette, 'acf_fields')); add_filter ('manage_edit-contact_columns', array ($ dette, 'add_table_columns')); add_action ('manage_contact_posts_custom_column', array ($ dette, 'output_table_columns_data'), 10, 2); 

Vi må også definere vår output_table_columns_data () funksjon, som forteller WordPress hva som skal vises for hver kontakt- og kolonnekombinasjon. Fordi vi sørget for at våre kolonne nøkkelnavn samsvarer med vår ACF Feltnavn, Dette gjør kodingen enklere. Avanserte egendefinerte felt har a get_field () funksjon, som aksepterer begge deler Feltnavn og Post ID parametere for å hente verdien som er lagret:

/ ** * Outputs våre Kontakt tilpassede feltdata, basert på kolonnen forespurt * * @param string $ columnName Kolonne Nøkkelnavn * @param int $ post_id Post ID * / funksjon output_table_columns_data ($ columnName, $ post_id) echo get_field ($ kolonneavn, $ post_id); 

Oppdater ditt Kontakter-tabell, og du får se dine egendefinerte felt:

Avhengig av PHP-konfigurasjonen din, vil Bilde kolonnen vil enten være tom eller skrive ut en PHP-varsel:

Bildefeltet i Avanserte egendefinerte felt returnerer en matrise når du bruker get_field (), bestående av bildedetaljer og hver registrert bildestørrelses nettadresse, bredde og høyde (en registrert bildestørrelse er vanligvis basert på de installerte temaene og pluginene).

La oss endre vår funksjon for å sende ut riktig array data for å vise et bilde:

/ ** * Outputs våre Kontakt tilpassede feltdata, basert på kolonnen forespurt * * @param string $ columnName Kolonne Nøkkelnavn * @param int $ post_id Post ID * / funksjon output_table_columns_data ($ columnName, $ post_id) // Field $ field = get_field ($ columnName, $ post_id); hvis ('foto' == $ kolonnenavn) echo '';  else // Utgang felt ekko $ feltet; 

Oppdater ditt Kontakter Tabell, og du bør se hvert kontaktpersons bilde:

Sorterbare kolonner

Hva om vi raskt må sortere kontaktene våre etter navn, telefonnummer eller e-postadresse? Vi kan allerede sortere på kolonnen navn (eller snarere tittelen), men akkurat nå er det ingen funksjonalitet for å fortelle WordPress hvordan du sorterer på kolonnene våre på telefonnummer og e-postadresser.

Tilbake til pluginets konstruktør. Vi må legge til manage_ POST_TYPE _posts_custom_column filtrer til plugin class-konstruksjonen, for å fortelle WordPress at vi vil aktivere bestemte kolonner å kunne sorteres. POST_TYPE Vil igjen være navnet på vår posttype, som i dette tilfellet er ta kontakt med:

/ ** * Constructor. Kalt når plugin er initialisert * / funksjon __construct () add_action ('init', array ($ this, 'register_custom_post_type')); add_action ('plugins_loaded', array ($ dette, 'acf_fields')); add_filter ('manage_edit-contact_columns', array ($ dette, 'add_table_columns')); add_action ('manage_contact_posts_custom_column', array ($ dette, 'output_table_columns_data'), 10, 2); add_filter ('manage_edit-contact_sortable_columns', array ($ dette, 'define_sortable_table_columns')); 

Som med våre tidligere handlinger og filtre, må vi også definere vår define_sortable_table_columns () funksjon, som forteller WordPress hvilke kolonner som kan sorteres:

/ ** * Definerer hvilken kontakt columsn som kan sorteres * * @param array $ kolonner Eksisterende sorterbare kolonner * @return array Nye sorterbare kolonner * / funksjon define_sortable_table_columns ($ kolonner) $ kolonner ['email_address'] = 'email_address'; $ kolonner ['phone_number'] = 'phone_number'; returnere $ kolonner; 

Hold musepekeren over Epostadresse og Telefonnummer kolonner, og du får se en pil vises, som viser oss at vi kan sortere etter dataene i den aktuelle kolonnen:

For øyeblikket vil ikke klikke på kolonneoverskriften for å sortere etter dataene gjøre noe, som rekkefølge etter parameteren som er angitt i nettadressen er ikke en som WordPress vil gjenkjenne.

I vår plugin konstruktør, la oss legge til et filter på be om metode, og definer deretter vår funksjon for å sjekke om vi prøver å sortere etter en egendefinert kolonne (og i så fall endre innleggsprosessen slik at WordPress kan forstå det):

/ ** * Constructor. Kalt når plugin er initialisert * / funksjon __construct () add_action ('init', array ($ this, 'register_custom_post_type')); add_action ('plugins_loaded', array ($ dette, 'acf_fields')); add_filter ('manage_edit-contact_columns', array ($ dette, 'add_table_columns')); add_action ('manage_contact_posts_custom_column', array ($ dette, 'output_table_columns_data'), 10, 2); add_filter ('manage_edit-contact_sortable_columns', array ($ dette, 'define_sortable_table_columns')); hvis (is_admin ()) add_filter ('request', array ($ this, 'orderby_sortable_table_columns')); 

Fordi det be om Filter kjører på hver side belastning av WordPress (enten frontend webside eller WordPress dashboard grensesnitt), vi vil minimere hvor ofte det kalles. Vi gjør dette ved å bare legge til filteret hvis vi er i WordPress-administrasjonen (is_admin ()).

Neste, la oss definere vår orderby_sortable_table_columns () funksjon:

/ ** * Kontroller forespørselen for å se om vi er i kontaktene WP_List_Table og forsøker å * sortere etter e-postadresse eller telefonnummer. Hvis det er tilfelle, endre innleggsprosessen for å sortere etter * den tilpassede metatasten * * @param array $ vars Forespørselsvariabler * @return array Nye forespørselsvariabler * / funksjon orderby_sortable_table_columns ($ vars) // Ikke gjør noe hvis vi er ikke på kontakten Tilpasset posttype hvis ('kontakt'! = $ vars ['post_type']) returnerer $ vars; // Ikke gjør noe hvis ingen orderby parameter er satt hvis (! Isset ($ vars ['orderby'])) returnerer $ vars; // Sjekk om parameteren for orderby matcher en av våre sorterbare kolonner hvis ($ vars ['orderby'] == 'email_address' ELLER $ vars ['orderby'] == 'phone_number') // Legg til rekkefølgen med meta_value og meta_key parametere til spørringen $ vars = array_merge ($ vars, array ('meta_key' => $ vars ['orderby'], 'orderby' => 'meta_value',)));  returner $ vars;  

Denne funksjonen kontrollerer at vi ser på vår Kontakt Tilpasset innleggstype, og i så fall at en rekkefølge etter Parameteren er satt til å passe enten epostadresse eller telefonnummer. Disse angis hvis brukeren har klikket en kolonne i Kontakter tabellen for å bestille etter telefonnummer eller e-postadresse.

La oss klikke på kolonnen E-postadresse, og vi får se resultatene er bestilt riktig:

Hvis du klikker på det igjen, vil du reversere rekkefølgen av resultatene:

Neste…

I neste artikkel skal vi forlenge filteret og søkefunksjonaliteten, slik at vi kan søke i dataene som er lagret i våre avanserte egendefinerte felt.