In deel 1 van deze serie heb ik laten zien hoe je WordPress lokaal installeert en hoe je een WordPress-database importeert in Vertabelo. In dit artikel gaan we dieper in op de tabellen in de WordPress-database.
Een snelle blik op het WordPress-databasemodel en het dashboard
In het vorige deel heb ik de WordPress-database geïmporteerd in onze online tool voor databasemodellering. Voor de goede orde, de structuur van de database is als volgt:
Er zijn een aantal belangrijke feiten over het WordPress-databasemodel die u moet begrijpen voordat we beginnen:
- Elke WordPress-site gebruikt exact dezelfde databasestructuur. Het bevat 11 tabellen en elke WordPress-site gebruikt ze op de achtergrond. De meeste WordPress-plug-ins gebruiken de database ook zonder wijzigingen in het databasemodel. Het model moet flexibel genoeg zijn om alle verschillende plug-ins te kunnen bevatten. Natuurlijk kunnen makers van plug-ins aangepaste tabellen toevoegen voor specifieke plug-ins als de gegevensstructuur aanzienlijk verschilt of als hun plug-in grote hoeveelheden gegevens opslaat.
- De WordPress-database heeft geen beperkingen voor externe sleutels . Dit komt doordat WordPress de MyISAM-opslagengine gebruikt, die geen externe sleutels ondersteunt. Tabellen omzeilen dit door attributen te hebben die niet-verbonden "buitenlandse sleutel"-achtige waarden opslaan, zodat de externe sleutelbeperking niet door de database wordt gecontroleerd. Bijvoorbeeld de
post_author
attribuut in dewp_posts
tabel is een “referentie” naar het “ID” attribuut in dewp_users
tafel. - De meeste tabellen gebruiken een primaire sleutel met één kolom. Ze worden ofwel gewoon "ID" genoemd (in de
wp_users
en dewp_posts
tabel), ofmeta_id
/umeta_id
(in de metatabellen:wp_postmeta
,wp_commentmeta
enwp_usermeta
), of een combinatie van de tabelnaam en het achtervoegsel "_id" (alle andere tabellen). De enige uitzondering op deze regels zijn dewp_term_relationships
tabel, waar de primaire sleutel uit de twee attributen bestaat:object_id
enterm_taxonomy_id
. Attributen die een primaire sleutel zijn of deel uitmaken van een primaire sleutel, zijn van het type bigint(20). Primaire sleutels met één kenmerk hebben ook de eigenschap auto-increment ingesteld op "Ja".
Berichten en pagina's
De belangrijkste reden om WordPress te gebruiken, is om inhoud te maken en te manipuleren en deze aan het publiek te presenteren. Daartoe biedt WordPress ons twee soorten inhoud:Pagina's en Berichten .
Pagina's worden gebruikt om statische inhoud weer te geven . Ze gebruiken geen tags of categorieën en worden niet op datum weergegeven. Ook staan ze geen opmerkingen of delen op sociale media toe. Pagina's kunnen subpagina's hebben. Over ons pagina's zijn goede voorbeelden van dit type.
Aan de andere kant, Berichten zijn gerangschikt op datum en kunnen worden georganiseerd met behulp van categorieën en tags . Berichten kunnen dankzij hun chronologische volgorde worden gebruikt in RSS-feeds. Berichten kunnen geen "subposts" hebben, maar reacties en delen op sociale media zijn mogelijk. Berichten zijn in wezen blogberichten. Dit is begrijpelijk, aangezien WordPress is voortgekomen uit een blogplatform.
De primaire tabel achter de inhoud op een WordPress-pagina heet wp_posts
:
WordPress gebruikt de wp_posts
tabel om pagina's, berichten en bijlagen op te slaan. We kunnen deze tabel zien als de kern van onze pagina, de plaats waar de meeste inhoud is opgeslagen. Het is belangrijk om erop te wijzen dat bijlagen daadwerkelijk op schijf worden opgeslagen en dat het record in de wp_posts
tabel houdt er meer informatie over bij (wie heeft het geüpload en wanneer, enz.).
De velden in de wp_posts
tafel zijn:
post_author
– een verwijzing naar dewp_users
tabel, die de auteur van het bericht aangeeft.post_date
– de datum en tijd waarop het record in de tabel is ingevoegd.post_date_gmt
– de GMT/UTC-datum en -tijd waarop een record in de tabel is ingevoegd.post_content
– de daadwerkelijke inhoud van het bericht.post_title
– de titel van het bericht.post_excerpt
– een samenvatting van de inhoud.post_status
– de huidige poststatus. WordPress gebruikt 8 standaardstatussen:"Publiceren", "Toekomst", "Concept", "In behandeling", "Privé", "Prullenbak", "Automatisch opstellen" en "Overnemen".comment_status
- schakelt opmerkingen in en uit op een enkele post of op een hele pagina. Er zijn twee mogelijke waarden:"open" en "gesloten".ping_status
- geeft aan of een bericht pingbacks en trackbacks toestaat. Likecomment_status
, het kan alleen de waarden "open" en "gesloten" bevatten.post_password
– het wachtwoord dat wordt gebruikt om het bericht te bekijken (optioneel).post_name
– de voor mensen leesbare url van eenpost_title
.to_ping
– een lijst met URL's waarnaar WordPress pingbacks moet sturen, gescheiden door "\n".pinged
– een lijst met URL's waarnaar WordPress pingbacks heeft gestuurd, gescheiden door "\n".post_modified
– de meest recente datum en tijd waarop een bericht is gewijzigd.post_modified_gmt
– de GMT/UTC-datum voorpost_modified
.post_content_filtered
– gebruikt door plug-ins om dure transformaties van post-inhoud in de cache op te slaan.post_parent
– verwijst naar de bovenliggende post.guid
– Global Unique Identifier voor een post; zijn permanente URL.menu_order
- gebruikt voor het bestellen van inhoud.post_type
– het type record. Het kan de waarden "post", "page", "attachment" of door de gebruiker gedefinieerde aangepaste typen bevatten.post_mime_type
– het type geüploade bestanden dat alleen is gedefinieerd voor berichten metpost_type = attachment
. Het kan waarden bevatten zoals "image", "application/pdf" en "application/msword".comment_count
– het aantal reacties, pingbacks en trackbacks van het bericht.
Hier is een momentopname van de wp_posts
tabel nadat ik de pagina "Over Nikola Tesla" heb toegevoegd:
Als we kijken naar de wp_posts
tabel, kunnen we een paar versies van onze pagina zien. Het record met de ID = 1
heeft post_status = publish
, wat betekent dat het bericht voor iedereen zichtbaar is. De comment_status = closed
en ping_status = closed
geeft aan dat opmerkingen en pings zijn uitgeschakeld voor dit bericht.
Alle aanvullende informatie over berichten en pagina's wordt bewaard in de wp_postmeta
tafel:
De kolommen in deze tabel zijn als volgt:
meta_id
– de primaire sleutel van de tabel.post_id
– een verwijzing naar dewp_posts
tafel.meta_key
– een beschrijving van eenmeta_value
attribuut.meta_value
– de werkelijk opgeslagen waarde.
De wp_postmeta
tabel is waar alle informatie die niet kan worden opgeslagen in de wp_posts
tafel is opgeslagen. Het wordt opgeslagen als sleutel-waardeparen, een techniek die vaak entity-attribute-value wordt genoemd (EV). De tabel kan worden gebruikt door plug-ins voor aangepaste behoeften.
WordPress-taxonomieën
Taxonomie is een mooi woord dat in feite verwijst naar het samenvoegen van dingen. WordPress heeft een aantal ingebouwde taxonomieën voor het groeperen van berichten. Bijvoorbeeld categorieën en tags zijn ingebouwde WordPress-taxonomieën. U kunt ook uw eigen aangepaste taxonomieën toevoegen aan WordPress.
De taxonomieën en hun termen worden bewaard in tabellen met de naam wp_terms
, wp_term_taxonomy
, en wp_term_relationships
.
De wp_terms
tabel slaat een lijst op met termen die worden gebruikt om objecten op uw WordPress-site te classificeren:
Deze tabel bevat alle tag- en categorienamen, evenals termen uit onze aangepaste taxonomieën. De attributen zijn als volgt:
term_id
– de primaire sleutel van de tabel.name
– de naam van de term.slug
– de URL vanname
.term_group
– gebruikt om termen te groeperen.
Hier is de inhoud van de wp_terms
tafel:
De termen worden toegewezen aan taxonomieën met behulp van de wp_term_taxonomy
tafel:
De attributen in de tabel zijn:
term_taxonomy_id
– de primaire sleutel van de tabel.term_id
– de verwijzing naar dewp_terms
tafel.taxonomy
– de taxonomienaam.description
– een beschrijving van een term in die specifieke taxonomie.parent
– een verwijzing naar de bovenliggende term in dewp_terms
tafel.count
– het aantal objecten in dewp_posts
tabel die deze term in deze taxonomie gebruiken.
De wp_term_taxonomy
tabel stelt ons in staat om dezelfde term te hergebruiken in verschillende taxonomieën. Merk op dat de record waar term_id = 1
heeft taxonomy = category
, terwijl de andere records taxonomy = post_tag
. hebben .
Om objecten te relateren die zijn opgeslagen in de wp_posts
en de wp_term_taxonomy
tabellen, gebruikt WordPress de wp_term_relationships
tafel:
Merk op dat dit de enige tabel in het model is met een sleutel die uit meer dan één attribuut bestaat.
De wp_term_relationships
tabel heeft de volgende kenmerken:
object_id
– een verwijzing naar dewp_posts
tafel.term_taxonomy_id
– een verwijzing naar dewp_term_taxonomy
tafel.term_order
– de term bestelling voor een specifiek object.
We hebben hier zes records die zes records verbinden uit de wp_term_taxonomy
tabel met de post (object_id = 6
).
Opmerkingen en WordPress-gegevensmodellering
We zijn erin geslaagd om wat inhoud op onze WordPress-pagina te plaatsen. Dat is leuk, maar in de meeste gevallen willen we feedback krijgen van het publiek. En dat is de rol van de commentaarfunctie.
Om reacties op posts te bekijken, kunnen we simpelweg "Laat een reactie achter" gebruiken of klikken op "X Comment" (waarbij X staat voor het aantal reacties op de post).
Onze eerste post heeft al één opmerking. Wanneer we erop klikken, zien we dat het een automatische opmerking is die wordt veroorzaakt door pingback. We voegen nog een opmerking toe aan dat bericht:
We zien nu twee opmerkingen voor onze post, maar wat zit er allemaal achter in de database?
Aan de tabelnaam kun je raden dat de wp_comments
tabel wordt gebruikt om opmerkingen op onze WordPress-pagina op te slaan:
De kenmerken spreken meestal voor zich, maar we zullen er toch een aantal nader bekijken.
De comment_post_ID
is een verwijzing naar de wp_posts
tafel; het geeft aan welke post reacties heeft ontvangen. Voor de eerste opmerking kunnen we zien dat het eigenlijk een pingback was en dat de "auteur" een ander bericht is. Voor de tweede opmerking kunnen we zien dat ik de auteur ben. Let ook op de comment_agent
bevat wat basisinformatie over het systeem en de computer die zijn gebruikt om een opmerking te plaatsen.
Het belangrijkste idee achter alle drie de metatabellen in het model is om gegevens op te slaan die we niet in onze primaire tabel willen opslaan. De wp_commentmeta
is gerelateerd aan de wp_comments
tabel op dezelfde manier als de wp_postmeta
tabel is gerelateerd aan de wp_posts
tafel.
WordPress-gebruikers zien
Nadat onze pagina online is, kan iedereen hem zien. WordPress-gebruikers zijn degenen die, op basis van hun toestemmingsstatus, wijzigingen kunnen aanbrengen in onze site en de inhoud ervan.
Nu zullen we een kijkje nemen in de wp_users
en de wp_usermeta
tabellen in de MySQL-database.
Zoals verwacht, de wp_users
bovenstaande tabel bevat basisgegevens voor alle gebruikers die zijn geregistreerd op onze WordPress-site. Merk op dat de user_pass
is gecodeerd en dat NewUser de user_activation_key
. heeft attribuut gevuld terwijl edrkusic dat veld leeg heeft.
While-kenmerken vermeld in de wp_users
tabel zijn wat we zouden verwachten in elke WordPress-site, de wp_usermeta
tabel wordt gebruikt om waarden op te slaan die specifiek kunnen zijn voor een bepaald project:
Merk bijvoorbeeld op dat de record met umeta_id = 25
bevat de waarde “sommige biografische info” , dezelfde tekst die we in het dashboard hebben getypt tijdens het bewerken van NewUser. De user_id
attribuut in die record heeft waarde 2 , wat overeenkomt met de NewUser's ID in de wp_users
tafel. Het is duidelijk dat de user_id
is een verwijzing naar de wp_users
tafel.
Links en opties in WordPress
Het idee achter de wp_links
tabel is om links naar andere sites op te slaan:
Het hebben van links naar andere sites was erg populair in het begin van het blogtijdperk; tegenwoordig wordt het steeds minder gebruikt. Vanaf WordPress versie 3.5 werd linkbeheer zelfs verwijderd uit de admin-interface. Toch wordt deze tabel bewaard om compatibiliteit met oudere versies te bieden.
De wp_options
tabel slaat gegevens op over WordPress-installatie, siteconfiguratie, thema, plug-ins en widgets:
Het wordt ook gebruikt om tijdelijke gegevens in de cache op te slaan. De EAV-logica is ook aanwezig in deze tabel, net als in wp_usermeta
, wp_postmeta
en wp_commentmeta
. Het attribuut option_name
speelt de rol van de sleutel, terwijl het attribuut option_value
is de overeenkomstige waarde. De andere twee attributen in de tabel zijn het primaire sleutelattribuut option_id
en autoload
, die bepaalt of een optie automatisch uit de database wordt geladen.
Het databasemodel van WordPress evalueren
Het databasemodel achter WordPress volgt verschillende goede regels en conventies voor databaseontwerp niet. Wanneer we een database ontwerpen voor een specifiek doel, waarbij we vooraf alle gewenste functionaliteiten kennen, kunnen we al die regels volgen. Maar WordPress moet alles dekken wat iedereen in gedachten zou kunnen hebben, dus het opofferen van externe sleutels en het gebruik van EAV is iets dat moet worden gedaan. Ik zou het ID-kenmerk in alle tabellen hetzelfde noemen en hetzelfde doen met de "buitenlandse sleutels". Ik zou bijvoorbeeld post_author
. niet gebruiken in de wp_posts
tabel, maar ik blijf bij users_id
. Afgezien hiervan moet ik het ermee eens zijn dat de WordPress-database echt een geweldig model is voor zijn doel.
Wat denk je? Laat het ons weten in het opmerkingengedeelte.