Creați un CRM simplu în WordPress Adăugarea coloanelor la WP_List_Table

Ne-am uitat la modul de a crea un simplu sistem CRM în WordPress. În ultima parte a acestei serii, am utilizat câmpurile personalizate avansate pentru a adăuga câmpuri personalizate în tipul de postare particularizat pentru persoanele de contact. Am învățat cum să folosim câmpurile personalizate avansate și să-l configuram pentru a funcționa programabil.

Astăzi, vom examina modul de afișare a datelor stocate în câmpurile personalizate, chiar în tabelul cu contacte.

Totul despre WP_List_Table

Fiecare tip de post care are un tablou de bord utilizează WP_List_Table clasa pentru a face tabelul familiar și acțiunile asociate acestuia:

Implicit, WordPress va afișa următoarele coloane:

  • (utilizate pentru a selecta / deselecta posturile, care pot avea apoi aplicate acțiuni)
  • titlu
  • autor
  • comentarii
  • Data

Pentru noi a lua legatura tipul postului personalizat, acest lucru nu este foarte util dacă dorim să vedem rapid detaliile cheie dintr-o singură privire, cum ar fi numărul de telefon al persoanei de contact sau fotografia.

WordPress oferă un filtru și o acțiune care poate fi utilizată pentru a adăuga coloane noi la WP_List_Table și să determine rezultatul pentru fiecare post.

Să începem prin adăugarea manage_edit- POST_TYPE _columns filtrați constructul plugin-ului nostru. POST_TYPE va fi numele tipului de post, care este în acest caz a lua legatura:

/ ** * Constructor. Chemată când pluginul este inițializat * / funcția __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')); 

Trebuie să definim și noi add_table_columns () care îi spune WordPress numele coloanelor noastre suplimentare pe care dorim să le afișăm în tabelul de contacte. Această funcție acceptă o serie de coloane existente, pe care le putem extinde prin adăugarea coloanelor noastre de tabel personalizate.

/ ** * adaugă coloane de tabelă în Contacte WP_List_Table * * @param array $ coloane Coloane existente * @return array Coloane noi * / funcție add_table_columns ($ columns) $ columns ['email_address'] = __ (' "tuts-crm"); $ coloane ['phone_number'] = __ ("Număr de telefon", "tuts-crm"); $ coloane ['foto'] = __ ('Photo', 'tuts-crm'); returnează coloane $; 

Ne asigurăm că cheile matricei se potrivesc cu numele câmpurilor personalizate ale ACF. Dacă aveți câmpuri diferite, asigurați-vă că numele cheilor dvs. de coloană se potrivesc cu câmpurile "f"numele deținut cadru.

Vizualizați-vă Contacte tabel făcând clic pe Contacte în meniul de bord din WordPress și veți vedea noile coloane:

Cu toate acestea, nu există date afișate pentru fiecare persoană de contact din tabel. Trebuie să adăugăm manage_ POST_TYPE _posts_custom_column acțiune pentru constructorul nostru de clasă plugin. POST_TYPE va fi din nou numele postului nostru de tip, care este în acest caz a lua legatura:

/ ** * Constructor. Chemată când pluginul este inițializat * / funcția __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); 

Trebuie să definim și noi output_table_columns_data () care spune WordPress ce trebuie afișat pentru fiecare combinație de contacte și coloane. Pentru că ne-am asigurat că numele cheilor din coloană se potrivesc cu ACF-ul nostru Nume de câmp, acest lucru face codificarea noastră mai ușoară. Câmpurile personalizate avansate au o funcție a get_field () care acceptă ambele Numele domeniului și parametrii Post ID pentru a prelua valoarea stocată:

/ ** * Rezultatele datelor de contact ale câmpului nostru personalizat, bazate pe coloana solicitată * * @param string $ columnName Numele cheii de coloană * @param int $ post_id Post ID * / funcția output_table_columns_data ($ columnName, $ post_id) echo get_field ($ columnName, $ post_id); 

Reîncărcați tabelul de contacte și veți vedea câmpurile personalizate:

În funcție de configurația dvs. PHP, Fotografie coloana va fi fie necompletată, fie trimite o notificare PHP:

Câmpul de imagine din câmpurile personalizate avansate returnează o matrice atunci când se utilizează get_field (), cuprinzând detaliile imaginii și dimensiunea, dimensiunea și înălțimea fiecărei dimensiuni a imaginii înregistrate (dimensiunea imaginii înregistrate se bazează în general pe temele și pluginurile instalate).

Să modificăm funcția noastră pentru a scoate datele potrivite pentru a afișa o imagine:

/ ** * Rezultatele datelor de contact ale câmpului nostru personalizat, bazate pe coloana solicitată * * @ param string $ columnName Numele cheii de coloană * @param int $ post_id Post ID * / funcția output_table_columns_data ($ columnName, $ post_id) // Field $ field = get_field ($ columnName, $ post_id); dacă ('photo' == $ columnName) echo '„;  altceva // Câmp de ieșire echo $ field; 

Reîncărcați tabelul de contacte și ar trebui să vedeți fotografia fiecărui contact:

Coloane scalabile

Dacă trebuie să sortăm rapid contactele noastre după nume, număr de telefon sau adresa de e-mail? Putem deja sorta pe coloana nume (sau, mai degrabă, titlul), dar acum nu există nici o funcționalitate pentru a spune WordPress cum să sortați pe coloanele noastre de număr de telefon și adresa de e-mail.

Înapoi la constructorul pluginului nostru. Trebuie să adăugăm manage_ POST_TYPE _posts_custom_column filtrați pluginul construit în pluginul nostru, pentru a spune WordPress că dorim să activam anumite coloane. POST_TYPE va fi din nou numele postului nostru de tip, care este în acest caz a lua legatura:

/ ** * Constructor. Chemată când pluginul este inițializat * / funcția __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')); 

Ca și în acțiunile și filtrele anterioare, trebuie să definim și noi define_sortable_table_columns () funcție, care spune WordPress care coloane pot fi grupate:

/ ** Defines care sunt contactele columsn * * @ @ param array $ columns Codurile existentă în ordine descrescătoare * @return array Noi coloane de destinație * / function define_sortable_table_columns ($ columns) $ columns ['email_address'] = 'email_address'; $ coloane ['phone_number'] = 'numărul de telefon'; returnează coloane $; 

Plasați cursorul mouse-ului peste Adresa de email și Numar de telefon coloane și veți vedea o săgeată care arată că putem sorta datele din coloana respectivă:

În acest moment, făcând clic pe antetul coloanei pentru a sorta după datele sale nu va face nimic, cum ar fi orderby parametrul setat în URL nu este unul pe care WordPress îl va recunoaște.

În constructorul pluginului nostru, să adăugăm un filtru pe cerere și apoi definiți funcția noastră pentru a verifica dacă încercăm să sortarem printr-o coloană personalizată (și dacă este așa, modificați interogarea posturilor astfel încât WordPress să o înțeleagă):

/ ** * Constructor. Chemată când pluginul este inițializat * / funcția __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')); dacă (is_admin ()) add_filter ('request', array ($ this, 'orderby_sortable_table_columns')); 

Deoarece cerere filtrul rulează pe încărcarea fiecărei pagini a WordPress (fie că este vorba de site-ul Web frontend sau de interfața de bord WordPress), vrem să minimalizăm cât de des se numește. Facem acest lucru adăugând doar filtrul dacă suntem în Administrația WordPress (is_admin ()).

Apoi, să definim noi orderby_sortable_table_columns () funcţie:

/ ** * Inspectați cererea pentru a vedea dacă suntem în Contacte WP_List_Table și încercați * să sortați după adresa de e-mail sau numărul de telefon. Dacă este așa, modificați interogarea Posts pentru a sorta după * acea cheie meta custom * * @param array $ vars Request Variables * @return array New Request Variables * / function orderby_sortable_table_columns ($ vars) // Nu face nimic dacă suntem nu pe tipul de mesaj personalizat de contact dacă ('contact'! = $ vars ['post_type']) returnează $ vars; // Nu face nimic dacă nici un parametru de ordonare nu este setat dacă (! Isset ($ vars ['orderby'])) returnează $ vars; // Verificați dacă parametrul de comandă se potrivește cu una din coloanele noastre dacă ($ vars ['orderby'] == 'email_address' sau OR $ vars ['orderby'] == 'numărul_fonului') // Add parametersby meta_value și meta_key parameters la interogarea $ vars = array_merge ($ vars, array ('meta_key' => $ vars ['orderby'], 'orderby' => 'meta_value',));  return $ vars;  

Această funcție verifică dacă ne vizionăm Contacte Tipul de postare personalizat, și dacă este așa orderby parametrul a fost setat corespunzător fie adresa de email sau numar de telefon. Acestea sunt setate dacă utilizatorul a făcut clic pe o coloană din tabela de contacte pentru a comanda după numărul de telefon sau adresa de e-mail.

Să faceți clic pe coloana Adresa de e-mail și vom vedea că rezultatele sunt ordonate corect:

Dacă îl faceți din nou, veți inversa ordinea rezultatelor:

Urmeaza…

În următorul articol, vom extinde funcția de filtrare și de căutare, permițându-ne să căutăm datele stocate în câmpurile personalizate avansate.

Cod