USM Notes
Plugin educațional pentru adăugarea de notițe cu priorități și dată de reamintire.
by Crudu Denis · github.com/cdenis7/ll_04-laboratory-work-4.-development-of-a-wordpress-plugin-
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/cdenis7/ll_04-laboratory-work-4.-development-of-a-wordpress-plugin-/archive/refs/heads/main.zipUSM Notes - Lucrarea de laborator nr. 4
Acesta este un plugin WordPress pe care l-am dezvoltat ca parte a lucrării de laborator nr. 4. Pluginul extinde funcționalitatea de bază a WordPress adăugând un Custom Post Type (CPT), o taxonomie personalizată și metadate pentru implementarea unui sistem de notițe (Notes).
1. Formularea sarcinii și Scopul lucrării
Scopul: Să învăț modelul extensibil de date al WordPress: crearea unui CPT (Custom Post Type), a unei taxonomii personalizate, a metadatelor cu metabox în panoul de administrare, precum și implementarea unui shortcode pentru afișarea datelor pe site.
Sarcina: Am creat un plugin educațional numit "USM Notes", care adaugă pe site o secțiune „Notițe” cu priorități (High, Medium, Low) și o dată de reamintire (Due Date).
2. Etapele principale ale lucrării (Partea practică)
Pentru a realiza acest proiect, am urmat o serie de pași progresivi de extindere a funcționalității platformei WordPress.
Pasul 1 & 2. Pregătirea mediului și crearea plugin-ului
Am creat un folder numit usm-notes în directorul wp-content/plugins/. În el, am inițializat fișierul principal usm-notes.php, adăugând metadatele standard necesare pentru ca WordPress să recunoască extensia. Am activat modul WP_DEBUG pentru dezvoltare și am activat pluginul din panoul de administrare.
Pasul 3. Înregistrarea Custom Post Type (CPT) - "Notițe"
Am utilizat funcția register_post_type() asociată hook-ului init pentru a crea entitatea de Notițe (usmn_note). I-am setat toți parametrii necesari: să fie public, să aibă pagină de arhivă, iconiță personalizată în meniu (dashicons-welcome-write-blog) și suport pentru titlu și editor. Pentru securitate, am verificat să nu poată fi accesat fișierul direct fără inițializarea mediului (ABSPATH).
Pasul 4. Înregistrarea taxonomiei personalizate - "Priorități"
Am adăugat funcționalitatea de a clasifica notițele prin funcția register_taxonomy(). Am creat o taxonomie ierarhică numită "Priorități" (usmn_priority), legată exclusiv de CPT-ul Notițe. Funcționează similar cu Categoriile clasice, permițând adăugarea structurată de termeni (ex. High, Medium, Low).

Pasul 5. Adăugarea metabox-ului pentru "Data de reamintire" (Due Date)
Cel mai complex pas din partea de backend a fost adăugarea câmpului custom pentru Dată.
- Afișarea: Am folosit
add_meta_box()pentru a afișa un panou de introducere a datei (<input type="date">) în sidebar-ul ecranului de editare a notiței. - Salvarea și Securitatea: În funcția agățată de hook-ul
save_post, am implementat validări stricte: verificarea nonce-ului pentru protecție CSRF, verificarea permisiunilor utilizatorului de a edita postarea și ignorarea autosalvărilor. - Validarea Datelor: Am adăugat logica de a face câmpul obligatoriu și de a nu permite selectarea unei date din trecut. Erorile sunt afișate prin panouri de avertisment (Admin Notices) folosind API-ul Transients pentru a "supraviețui" redirect-ului de după salvare.

- Afișarea în listă: Am modificat tabelul standard de listing din admin (
manage_usmn_note_posts_columns) pentru a afișa "Data Reamintire" ca o coloană proprie, formatată corespunzător.
Pasul 6 & 7. Crearea shortcode-ului și Testarea
Ultima etapă a fost expunerea datelor salvate pe frontend. Am creat un shortcode flexibil [usm_notes] prin add_shortcode().
Acesta extrage notițele folosind clasa WP_Query, care permite filtrare combinată prin atributele priority (prin tax_query) și before_date (prin meta_query). De asemenea, am integrat prin PHP un set minimal de stiluri CSS personalizate pentru o afișare prietenoasă sub formă de liste/carduri.
Pentru testare, am creat o pagină "All Notes" unde am plasat combinațiile de shortcode-uri solicitate, așa cum se vede în imaginea editorului de mai jos:

Iar aici este rezultatul final afișat pe site (frontend), care demonstrează funcționalitatea completă a sistemului de filtrare (după prioritate, sau mesajul corect în cazul inexistenței datelor înainte de anul selectat):

Instrucțiuni pentru rularea proiectului
- Copiați folderul
usm-notesîn directorulwp-content/plugins/al instalării dumneavoastră locale WordPress. - Accesați panoul de administrare WordPress -> Module (Plugins).
- Găsiți pluginul "USM Notes" în listă și faceți clic pe "Activează".
- În meniul principal din stânga va apărea o nouă secțiune numită "Notițe", de unde puteți începe să adăugați conținut.
- Pentru afișare pe site, creați o pagină nouă și introduceți shortcode-ul
[usm_notes].
Răspunsuri la întrebările de control
1. Care este diferența esențială dintre o taxonomie personalizată și un metacâmp? Oferă un exemplu când este mai potrivit să folosești taxonomie și când metadate.
Răspuns: Diferența esențială constă în scopul lor de grupare vs. stocare de informații detaliate. Taxonomiile sunt folosite pentru gruparea și clasificarea conținutului, permițând crearea ușoară de arhive (pagini cu postări care au același termen) și filtrarea acestora eficient în interogări sau frontend. Metacâmpurile (post meta) stochează informații specifice, unice sau detaliate despre o singură postare. Exemplu: Pentru un magazin online de haine:
- Taxonomie: "Mărime" (deoarece vrem o pagină
/marime/m/unde să vedem toate hainele M și să putem filtra după ea în catalog). - Metacâmp: "Cod EAN" (deoarece este o valoare specifică doar acelui produs, nu ne ajută să facem o "arhivă cu haine care au codul EAN X").
2. De ce este necesar nonce la salvarea metacâmpurilor și ce se întâmplă dacă nu este verificat?
Răspuns: Nonce (Number Used Once) este un token de securitate unic generat pentru a proteja site-ul împotriva atacurilor CSRF (Cross-Site Request Forgery - Falsificarea cererilor "cross-site"). La salvarea unui post, confirmă faptul că cererea a plecat intenționat din formularul vizitat în interfața de administrare WordPress de către persoana autorizată actuală. Dacă nu este verificat, un atacator poate forța (printr-un link malițios ascuns pe care îl accesează adminul) un administrator logat să modifice sau să șteargă metadatele fără ca acesta să își dea intenționat seama de acțiunea pe care o execută.
3. Care sunt cei mai importanți parametri ai register_post_type() și register_taxonomy() pentru frontend și UX (numește cel puțin trei și explică de ce)?
Răspuns:
public(ambele): Dacă estetrue, conținutul/tipul este vizibil pe parcursul site-ului și integrabil în admin. Este crucial pentru că dă voie CPT-ului/taxonomiei să aibă URL-uri proprii pe frontend și să fie inclus în query-uri, oferindu-le vizualizare.has_archive(register_post_type): Când estetrue, permite vizualizarea generală a tuturor postărilor din acel CPT pe o pagină proprie. Crește enorm UX-ul pentru că poți naviga la lista globală a elementelor.hierarchical(register_taxonomyși CPT): Pentru taxonomii, setează dacă acestea vor funcționa ca Tag-uri (non-ierarhice) sau ca Categorii (ierarhice, cu parent/child). Aceasta este importantă pentru UX fiindcă dictează felul în care utilizatorii interacționează cu organizarea datelor pe pagina de administrare (dropdown/chechbox vs. input text simplu).
Concluzie
Prin efectuarea acestei lucrări de laborator am învățat modul teoretic, practic dar și arhitectural cum sistemul de gestiune al conținutului WordPress poate fi escaladat peste ceea ce înseamnă ”blogging”. Folosind Hooks (Actions & Filters), Meta Box API și WP_Query, am putut adăuga structuri de date noi, validate securizat și afișate personalizat.