Förstå och arbeta med relationer mellan data i WordPress

I den första delen av denna serie om data i WordPress gav jag en översikt över WordPress databas tabeller, och vilka tabeller används för att lagra vilken typ av data. I den här andra delen ska jag beskriva hur WordPress hanterar relationerna mellan dessa data.

Som du ser, använder WordPress tre typer av datarelationer - en-till-en, en till många och många till många. Jag ska titta på var och en av dessa och vad de betyder för din WordPress-webbplats.

En-till-en-förhållanden

Ett ett-till-ett-förhållande är det enklaste förhållandet för alla - det betyder helt enkelt att en post är relaterad till bara en annan. Data som detta lagras vanligtvis i ett bord (men inte alltid, som vi kommer se senare i denna handledning).

Exempel på en-till-ett-relationer i WordPress är:

  • post-ID och inläggsinnehåll
  • post titel och inlägg innehåll
  • post-ID och post slug
  • kommentar ID och kommentarinnehåll
  • användar-ID och användarnamn

Listan kan fortsätta, men huvuddelen är att alla två poster som lagras i olika fält i en rad i ett bord har ett ett-till-ett-förhållande.

En-till-en-relationer är dock den minst intressanta typen av databasförhållande. Så utan vidare, låt oss gå vidare till en relationstyp som används mycket av WordPress - en till många.

En-till-många relationer

Ett till många förhållanden är mycket vanliga i databaser, och det gör en databas kraftigare än ett "platt" bord, som ett kalkylblad. Dessa uppstår när en post har ett förhållande med mer än en annan post. 

I WordPress skapas de flesta ett till många relationer med en länk mellan två databastabeller, med hjälp av en unik identifierare för att ansluta sig till de två. Så till exempel, post_id posten kommer att vara unik för varje post som är lagrad i wp_posts bord, men kommer också att användas i wp_comments tabell för att identifiera vilken post varje kommentar var postad till. Detta innebär att varje post_id värdet kommer bara att visas en gång i wp_posts bord men kan visas flera gånger - eller inte alls - i wp_comments tabell.

Några andra exempel i WordPress inkluderar:

  • inlägg och posta metadata
  • inlägg och användare
  • användar- och användarmetadata
  • taxonomier och taxonomi villkor

Återigen fortsätter listan. Eftersom detta är ett viktigt ämne i WordPress, låt oss ta en titt på en-till-många relationer mer detaljerat.

En till många relationer som involverar inlägg

Tabellen som är kopplad till de flesta andra tabeller är wp_posts bord och de flesta av de förhållanden som dessa kopplingar skapar är ett till många relationer.

Som du kan se i diagrammet nedan, wp_posts bordet är kopplat till fyra andra tabeller:

Dessutom kan inlägg också ha ett ett till många förhållande med andra inlägg, i form av bilagor eller föräldersidor.

Låt oss ta en titt på dessa relationer mer detaljerat.

Inlägg till inlägg

Som förklarats ovan lagras data som lagras i wp_posts Tabellen kan ha ett till många förhållande med andra data i samma tabell. Detta förhållande ligger dock inte mellan vad du skulle tänka på som inlägg, men istället ligger mellan inlägg och bilagor eller sidor och andra sidor. Tillsammans är bilagor och sidor posttyper.

En bilaga som är lagrad i wp_posts bordet kommer att ha en post i post_parent fält, vilket kommer att vara ID för posten som bilagan är bifogad (med ursäkta för repetitionen!). Detta är ett till många förhållande eftersom varje bilaga bara har en förälder, medan varje inlägg kan ha många bilagor. Detta gäller även om du har använt Media Manager för att lägga till en bilaga till ett annat inlägg - bara det inlägg som det ursprungligen lagts till lagras i databasen som förälder.

Inlägg kan också ha ett ett till många förhållande med andra inlägg när en sida anges som förälder till en annan. Posten lagras mot barnsidan, i post_parent fält - igen blir det här post_id på modersidan. Detta är ett till många förhållande eftersom föräldersidor kan ha många barnsidor, men barnsidor har bara en föräldersida.

När man tänker på relationer mellan inlägg som detta, är det viktigt att komma ihåg att när man överväger WordPress-datahantering, är inlägg inte vad du normalt hänvisar till som inlägg. De innehåller sidor, bilagor och andra posttyper, som alla lagras i wp_posts tabell.

Inlägg-till-post-metadata

Inläggets metadata lagras i sitt eget bord wp_postmeta. Denna tabell innehåller bara fyra fält - för post_id, de meta_id, nyckeln och värdet. Ett inlägg kan ha många poster av metadata som är kopplade till det, men varje postmätadata kommer endast att kopplas till ett inlägg.

Inlägg till Kommentarer

Kommentarer har också sitt eget bord, wp_comments. Varje kommentar kommer att relatera till endast ett inlägg medan varje inlägg kan ha flera kommentarer lagrade mot den. Som med alla andra tabeller kopplade till wp_posts, de post_id fält används för länken (i comment_post_id fält i wp_comments).

De wp_comments Tabellen har som standard 15 fält, för att lagra data om författaren, författarens e-postadress, själva kommentaren och dess godkännandestatus. Det är också kopplat till wp_users bord, som vi ser i nästa avsnitt.

Kommentarer har också egna metadata, lagrade i ett annat bord, som jag kommer till kort tid.

Inlägg till Användare

Varje post är bifogad till wp_users bord via användar ID post som lagras i post_author fält i wp_posts. Detta är ett till många förhållande eftersom varje inlägg bara har en författare men varje användare kan vara författare till flera inlägg.

Förhållandet mellan inlägg och användare är annorlunda som mellan inlägg och kommentarer eller metadata eftersom dess natur är av en användare, flera inlägg, inte en inlägg flera kommentarer eller mete data poster. Det är därför användar ID fältet ger länken i stället för post_id fält.

En-till-många relationer som inte involverar inlägg

Det finns också tre relationer som är en till många och inte involverar inlägg. Två av dessa involverar metadata - förhållandet mellan kommentarer och deras metadata, och användare och deras metadata.

Metadata för användare till användare

WordPress lagrar ytterligare metadata om användare i wp_usermeta tabell. Detta används vanligtvis för icke-standardiserade data om användare, t.ex. metadata om superadminer i en multisite-installation och metadata om de adminfärger som en användare har valt om dessa inte är standard. 

De flesta uppgifter om användare kommer att finnas i wp_users tabell. De två tabellerna är länkade via användar ID fält och en användarrekord kommer att ha flera objekt av metadata som är associerade med det, medan varje metadata endast gäller för en användare.

Kommentarer-till-kommentar Metadata

Återigen lagras de flesta uppgifterna om kommentarer i wp_comments bord tillsammans med kommentaren själv, men wp_commentmeta Tabellen används för att lagra ytterligare metadata, t.ex. data som skapats av plugins som Akismet. Relationen är densamma som mellan användare och usermeta.

Kommentarer till Användare

Det slutliga ett till många förhållandet är mellan kommentarer och användare. De wp_comments bordet innehåller användar ID fält som kan användas för att lagra användarnamnet när en inloggad användare har lagt fram en kommentar. Observera att det här fältet inte är obligatoriskt för de webbplatser där användare inte behöver logga in för att kunna kommentera.

Många till många relationer

Den slutliga typen av databasförhållande är ett till många förhållande, där den många länken går båda vägarna. Detta används bara en gång i WordPress, för taxonomi termer (inklusive kategorier och taggar eftersom dessa bara är taxonomier). Ett inlägg kan ha många villkor tilldelade det och en term kan tilldelas flera inlägg.

WordPress skapar detta förhållande på samma sätt som alla andra databaser med manag-till-många databaser: genom att använda en mellanliggande tabell som länkar de två tabellerna med nyckeldata. Det här är wp_term_relationships bord som länkar till wp_posts bord till wp_term_taxonomy tabell. 

Obs! Den här tabellen länkar också till wp_links bord till wp_term_taxonomy bord, som länkar beter sig på ungefär samma sätt som inlägg - jag kommer snart till länkar.

Detta förklaras lättast genom att titta först på de två avvikande tabellerna. De wp_posts Tabellen innehåller data på varje post, medan wp_term_taxonomy Tabellen innehåller data på varje term, inklusive den taxonomi den finns i och dess ID. 

För att skapa en länk mellan en term i wp_term_taxonomy bord och ett inlägg i wp_posts tabell skapar WordPress en post i wp_term_relationships bord, som inkluderar post_id och den term_id (lagrad som object_id och term_taxonomy_id respektive i wp_term_relationships tabell). Detta innebär att wp_term_relationships Tabellen kan innehålla flera poster för varje post och flera poster för varje term, vilket skapar det många till många förhållandet.

Diagrammet nedan visar hur det här fungerar:

I exemplet ovan har posterna följande villkor:
  • Inlägg 1 har villkor 1 och 3
  • inlägg 2 har termen 2
  • Inlägg 3 har termen 4
  • inlägg 4 har villkor 1 och 3

Du kan också titta på det motsatt sätt - till exempel gäller term 3 för inlägg 1 och 4.

Men det slutar inte saker där. Det finns ett fjärde bord, wp_terms tabell. Detta innehåller data om varje term, nämligen namn, slug och beskrivning för varje term. Varje term har bara en post i wp_terms bord, så förhållandet mellan det och wp_term_taxonomy bordet är faktiskt ett till ett. Teoretiskt sett finns det ingen anledning att dessa data inte kunde hållas i wp_term_taxonomy bord, men det är det inte.

En anteckning om länkar

Länkar, eller bloggrollen, är en funktion i WordPress vilket är betydligt mindre framträdande än det en gång var. I själva verket, eftersom version 3.5 länkar har stängts av i admin som standard; De har dock sitt eget bord: wp_links tabell. 

Detta liknar mycket wp_posts tabell. Trots allt är länkar en innehållstyp som mycket liknar inlägg) och har samma många till många relationer med taxonomi.

Sammanfattning

Som vi har sett använder WordPress en mängd olika relationer för att länka data i 10 av sina 11 databas tabeller. Det enda tabellen jag inte har nämnt här är wp_options, eftersom det inte är kopplat till några andra tabeller, eftersom det bara lagrar data om webbplatsen, snarare än om innehåll. Jag kommer att täcka det mer detaljerat senare i denna serie.

Genom att förstå en-till-ett, ett till många och många till många relationer i WordPress, kan det hjälpa dig att identifiera sätt att manipulera dina data och skriva egna frågor i ditt tema och / eller plugins.

I nästa del av denna serie kommer jag att beskriva innehållstyperna mer detaljerat, titta på de typer av innehåll som finns lagrade i WordPress-databasen och likheterna och skillnaderna mellan dem.