Inzicht in en werken met relaties tussen gegevens in WordPress

In het eerste deel van deze serie over gegevens in WordPress gaf ik een overzicht van de WordPress-databasetabellen en welke tabellen worden gebruikt om wat voor soort gegevens op te slaan. In dit tweede deel zal ik beschrijven hoe WordPress de relaties tussen die gegevens beheert.

Zoals u zult zien, gebruikt WordPress drie soorten gegevensrelaties: één-op-één, één-op-veel en veel-op-veel. Ik zal kijken naar elk van deze en wat ze betekenen voor uw WordPress-site.

Een-op-een relaties

Een één-op-één relatie is de eenvoudigste relatie van allemaal - het betekent simpelweg dat het ene record gerelateerd is aan het andere. Gegevens zoals deze worden over het algemeen in één tabel opgeslagen (hoewel niet altijd, zoals we verderop in deze tutorial zullen zien).

Voorbeelden van een-op-eenrelaties in WordPress zijn onder andere:

  • post ID en plaats inhoud
  • post titel en post inhoud
  • post ID en post slug
  • commentaar ID en commentaarinhoud
  • gebruikersnaam en gebruikersnaam

De lijst kan doorgaan, maar het belangrijkste punt is dat twee records die zijn opgeslagen in verschillende velden in één rij van een tabel een één-op-één relatie hebben.

Een-op-eenrelaties vormen echter de minst interessante vorm van een databaserelatie. Dus zonder verder oponthoud gaan we naar een relatietype dat veel wordt gebruikt door WordPress - one-to-many.

Een-op-veel relaties

Een tot veel relaties zijn heel gebruikelijk in databases en maken een database krachtiger dan een 'platte' tabel zoals een spreadsheet. Dit gebeurt wanneer een record een relatie heeft met meer dan één ander record. 

In WordPress worden de meeste relaties één-op-veel gemaakt door een koppeling tussen twee databasetabellen, waarbij een unieke ID wordt gebruikt om de twee samen te voegen. Dus bijvoorbeeld de post_id record zal uniek zijn voor elke post die is opgeslagen in de wp_posts tabel, maar zal ook worden gebruikt in de wp_comments tabel om te bepalen naar welk bericht elke reactie is gepost. Dit betekent dat elk post_id waarde verschijnt maar één keer in de wp_posts tabel, maar kan meerdere keren voorkomen - of helemaal niet - in de wp_comments tafel.

Enkele andere voorbeelden in WordPress zijn:

  • berichten plaatsen en metadata plaatsen
  • berichten en gebruikers
  • gebruikers en gebruikersmetadata
  • taxonomieën en taxonomie termen

Nogmaals, de lijst gaat maar door. Omdat dit een belangrijk onderwerp is in WordPress, laten we eens kijken naar de één-op-veel relaties in meer detail.

Een-op-veel relaties met betrekking tot berichten

De tabel die is verbonden met de meeste andere tabellen is de wp_posts tabel en de meeste relaties die deze verbindingen maken, zijn een-op-veel relaties.

Zoals u in het onderstaande schema kunt zien, is de wp_posts tabel is gekoppeld aan vier andere tabellen:

Daarnaast kunnen berichten ook een een-op-veel relatie hebben met andere berichten, in de vorm van bijlagen of bovenliggende pagina's.

Laten we deze relaties eens nader bekijken.

Berichten-to-berichten

Zoals hierboven uitgelegd, gegevens opgeslagen in de wp_posts tabel kan een één-op-veel relatie hebben met andere gegevens in dezelfde tabel; deze relatie staat echter niet tussen wat u zou denken als berichten, maar in plaats daarvan tussen berichten en bijlagen of pagina's en andere pagina's. Bijlagen en pagina's zijn immers berichttypen.

Een bijlage opgeslagen in de wp_posts tabel zal een record hebben in de post_parent veld, dat het ID is van het bericht waaraan de bijlage is gehecht (met excuses voor de herhaling!). Dit is een één-op-veel relatie omdat elke bijlage slechts één ouder heeft, terwijl elke post veel bijlagen kan hebben. Dit is ook van toepassing als je Media Manager hebt gebruikt om een ​​bijlage aan een ander bericht toe te voegen - alleen het bericht waaraan het oorspronkelijk is toegevoegd, wordt als ouder in de database opgeslagen.

Berichten kunnen ook een één-op-veel relatie hebben met andere berichten wanneer de ene pagina wordt opgegeven als de bovenliggende pagina van een andere. Het record wordt opgeslagen tegen de onderliggende pagina in de post_parent veld - opnieuw zal dit het zijn post_id van de bovenliggende pagina. Dit is een één-op-veelrelatie omdat bovenliggende pagina's veel onderliggende pagina's kunnen hebben, maar onderliggende pagina's hebben slechts één bovenliggende pagina.

Wanneer u nadenkt over relaties tussen berichten zoals deze, is het belangrijk om te onthouden dat wanneer u de verwerking van WordPress-gegevens overweegt, posts niet zijn wat u normaal gesproken naar berichten verwijst. Ze omvatten pagina's, bijlagen en andere berichttypen, die allemaal zijn opgeslagen in de wp_posts tafel.

Posts-to-Post-metadata

Post-metagegevens worden opgeslagen in een eigen tabel wp_postmeta. Deze tabel bevat slechts vier velden - voor de post_id, de meta_id, de sleutel en de waarde. In een bericht kunnen veel post-metagegevensitems zijn gekoppeld, maar elke postmetagegevensrecord is alleen aan één bericht gekoppeld.

Berichten-to-Comments

Reacties hebben ook een eigen tabel, wp_comments. Elke opmerking heeft betrekking op slechts één bericht, terwijl voor elk bericht meerdere opmerkingen kunnen worden opgeslagen. Zoals met alle andere gekoppelde tabellen wp_posts, de post_id veld wordt gebruikt voor de link (in de comment_post_id veld in wp_comments).

De wp_comments tabel heeft standaard 15 velden, om gegevens over de auteur, het e-mailadres van de auteur, de opmerking zelf en de goedkeuringsstatus op te slaan. Het is ook gekoppeld aan de wp_users tabel, zoals we in het volgende gedeelte zullen zien.

Reacties hebben ook hun eigen metadata, opgeslagen in een andere tabel, die ik binnenkort zal bespreken.

Berichten-to-gebruikers

Elk bericht is gekoppeld aan de wp_users tafel via de gebruikersnaam record, dat is opgeslagen in de post_author veld in wp_posts. Dit is een één-op-veel-relatie omdat elk bericht maar één auteur heeft maar elke gebruiker de auteur van meerdere berichten kan zijn.

De relatie tussen berichten en gebruikers is anders dan die tussen berichten en opmerkingen of metagegevens, omdat deze van één gebruiker is, meerdere berichten, niet één die meerdere reacties of meteogegevensrecords plaatst. Dit is waarom het gebruikersnaam veld geeft de link in plaats van de post_id veld-.

Een-op-veel relaties waarbij geen berichten worden gebruikt

Er zijn ook drie relaties die één-op-veel zijn en geen betrekking hebben op berichten. Twee daarvan hebben betrekking op metadata - de relatie tussen commentaren en hun metadata, en gebruikers en hun metadata.

Gebruikers-naar-gebruiker-metadata

WordPress slaat extra metadata op over gebruikers in de wp_usermeta tafel. Dit wordt over het algemeen gebruikt voor niet-standaard gegevens over gebruikers, zoals metadata over superadmins in een installatie op meerdere locaties en metadata over de beheerkleuren die een gebruiker heeft geselecteerd als dit niet de standaardkleur is. 

De meeste gegevens van gebruikers bevinden zich in de wp_users tafel. De twee tabellen zijn gekoppeld via de gebruikersnaam veld en één gebruikersrecord hebben meerdere items met metagegevens eraan gekoppeld, terwijl elk item metagegevens alleen op één gebruiker van toepassing is.

Opmerkingen met betrekking tot metagegevens

Nogmaals, de meeste gegevens over opmerkingen worden opgeslagen in de wp_comments tabel samen met de opmerking zelf, maar de wp_commentmeta tabel wordt gebruikt om extra metadata op te slaan, zoals gegevens die zijn gemaakt door plug-ins zoals Akismet. De relatie is hetzelfde als tussen gebruikers en usermeta.

Reacties-to-gebruikers

De laatste een-op-veel-relatie is tussen opmerkingen en gebruikers. De wp_comments tabel bevat de gebruikersnaam veld, dat kan worden gebruikt om de gebruikers-ID op te slaan wanneer een ingelogde gebruiker een opmerking heeft gepost. Houd er rekening mee dat dit veld niet verplicht is voor die sites waar gebruikers niet hoeven te worden aangemeld voor commentaar.

Veel-naar-veel relaties

De laatste soort databaserelatie is de één-op-veel-relatie, waarbij de vele koppelingen beide kanten op gaan. Dit wordt maar één keer gebruikt in WordPress, voor taxonomietermen (inclusief categorieën en tags omdat dit eenvoudigweg taxonomieën zijn). Aan een bericht kunnen veel termen zijn toegewezen en een term kan aan meerdere berichten worden toegewezen.

WordPress maakt deze relatie op dezelfde manier als elke andere database met manay-to-many-database: door een tussentabel te gebruiken die de twee tabellen verbindt met de kerngegevens. Dit is de wp_term_relationships tabel, die de wp_posts tafel voor de wp_term_taxonomy tafel. 

Opmerking: deze tabel koppelt ook de wp_links tafel voor de wp_term_taxonomy tabel, aangezien koppelingen zich op ongeveer dezelfde manier gedragen als berichten - ik kom binnenkort naar links.

Dit wordt het gemakkelijkst uitgelegd door eerst naar de twee afgelegen tafels te kijken. De wp_posts tabel bevat gegevens over elk bericht, terwijl de wp_term_taxonomy tabel bevat gegevens over elke term, inclusief de taxonomie en de ID. 

Een koppeling maken tussen een term in de wp_term_taxonomy tafel en een bericht in de wp_posts tabel, WordPress maakt een record in de wp_term_relationships tabel, waarin de post_id en de term_id (opgeslagen als object_id en term_taxonomy_id respectievelijk in de wp_term_relationships tafel). Dit betekent dat de wp_term_relationships tabel kan meerdere records voor elk bericht bevatten en meerdere records voor elke term, waardoor de veel-op-veel-relatie ontstaat.

Het onderstaande diagram laat zien hoe dit werkt:

In het bovenstaande voorbeeld hebben de berichten de volgende voorwaarden:
  • post 1 heeft termen 1 en 3
  • post 2 heeft termijn 2
  • post 3 heeft termijn 4
  • post 4 heeft termen 1 en 3

Je kunt het ook op de andere manier bekijken. Term 3 heeft bijvoorbeeld betrekking op berichten 1 en 4.

Maar daar stopt het niet. Er is een vierde tafel, de wp_terms tafel. Dit bevat gegevens over elke term, namelijk de naam, slak en beschrijving voor elke term. Elke term heeft slechts één record in de wp_terms tabel, dus de relatie tussen die en de wp_term_taxonomy tabel is eigenlijk één-op-één. Theoretisch gesproken is er geen reden waarom deze gegevens niet konden worden bewaard in de wp_term_taxonomy tafel, maar dat is het niet.

Een opmerking over links

Links, of de blogroll, is een kenmerk van WordPress dat veel minder prominent is dan het ooit was. In feite zijn links van versie 3.5 standaard uitgeschakeld in de admin; ze hebben echter hun eigen tabel: de wp_links tafel. 

Dit lijkt erg op de wp_posts tafel. Verbindingen zijn immers een inhoudstype dat sterk lijkt op berichten) en hebben dezelfde veel-op-veel-relatie met taxonomietermen.

Samenvatting

Zoals we hebben gezien, gebruikt WordPress verschillende relaties om gegevens te koppelen in 10 van de 11 databasetabellen. De enige tafel die ik hier niet heb genoemd, is wp_options, omdat dat niet aan andere tabellen is gekoppeld, omdat het eenvoudig gegevens over de site opslaat, in plaats van over inhoud. Ik zal dat later in deze serie in meer detail bespreken.

Door de één-op-één, één-op-veel en veel-op-veel relaties in WordPress te begrijpen, kan dit u helpen manieren te vinden om uw gegevens te manipuleren en aangepaste query's in uw thema en / of plug-ins te schrijven.

In het volgende deel van deze serie zal ik inhoudstypen in meer detail behandelen, kijkend naar de soorten inhoud die zijn opgeslagen in de WordPress-database en de overeenkomsten en verschillen daartussen.