Afbeeldingen & databasemodel (WordPress)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

Hoe het werkt

Als je een afbeelding upload, worden er direct records aangemaakt in tabellen wp_posts en wp_postmeta, ook als je de afbeelding verder nergens toepast (als bv. een WooCommerce-productafbeelding of WooCommerce-gallery-afbeelding):

  • Primair: Er wordt een post toegevoegd aan tabel wp_posts van het type attachment en in dit geval subtype image/jpeg
  • Secundair: Voor allerlei aanvullende gegevens worden er zo'n 5 records aangemaakt in tabel wp_postmeta.

wp_posts

select
   *
from
   wp_posts
where
   post_type = "attachment";

wp_postmeta

select
   # wp_posts.*,
   wp_postmeta.*
from
   wp_posts
join
   wp_postmeta
   on
   wp_posts.ID = wp_postmeta.post_id
where
   wp_posts.post_type = "attachment";

Voorbeeld: Uploaden van een afbeelding

Databasemodel rondom een afbeelding (die verder nergens mee is geassociëerd) in volle glorie

Als voorbeeld heb ik een afbeelding riverbug.jpeg geüpload.

Om in één keer alle data te zien (dit geeft een Cartesiaans product, want 1 record in wp_posts en 5 records in wp_postmeta):

select
   *
from
   wp_posts
join
   wp_postmeta
   on
   wp_posts.ID = wp_postmeta.post_id
where
   wp_posts.post_title 
   like 
   "River Bug%";

wp_posts

select * from wp_posts where post_type = "attachment" and post_title like "River Bug%";

De belangrijkste velden (denk ik, voor mij, op dit moment):

Veld Opmerkingen
ID Gebruikelijke post-id. Dit is de meest algemene PK in een WordPress-database
post_content Description - Beschrijving
post_title Post-title - Ingewikkelder is het niet
post_excerpt Caption - Zie schermafdruk
post_name Slug. De afbeelding is op minimaal drie manieren te bereiken:
guid Global Unique IDentifier for feed-readers. Gewoon negeren. Echt waar
post_type attachment
post_mime_type Can be handy when searching for an object. In this case: image/jpeg
Media library » View: Velden post_content, post_name en post_title
Media library » Edit: Velden post_excerpt, post_content en wp_postmeta » _wp_attachment_image_alt

wp_postmeta

Nogmaals: Direct bij uploaden van een afbeelding, worden er al records aangemaakt in tabel wp_postmeta. Ik vermoed dat dit met backwards compatibility heeft te maken: Tegenwoordig zijn er meer velden relevant dan in de tijd dat dit onderdeel van WordPress was ontworpen. Die nieuwe velden zijn daarom ondergebracht in deze tabel.

Om de relevante zaken boven water te toveren:

select
   wp_postmeta.*
from
   wp_posts
join
   wp_postmeta
   on
   wp_posts.ID = wp_postmeta.post_id
where
   wp_posts.post_title like "River Bug%";

of als je het post_id weet:

select * from wp_postmeta where post_id = 59303;

Belangrijkste velden:

meta_key Opmerkingen
_wp_attached_file
  • Filepath van het bestand. Je moet hier alleen baseurl/wp-content/uploads aan vooraf laten gaan
  • Alternatief voor de slug
  • Waarschijnlijk de primaire bron om de bestandsnaam te achterhalen: Je kunt 'm op andere manieren achterhalen, maar dit is hoogstwaarschijnlijk de enige juiste manier
_wp_attachment_image_alt Alt-tekst
wp_postmeta: Alle records voor het geüploade bestand
wp_postmeta: De serialised content by _wp_attachment_metadata lijkt onschuldig, maar God behoedde dat ik dit ooit moet gaan parsen

Voorbeeld: Bestandsnaam aanpassen

Bestandsnamen worden écht bijgehouden in tabel wp_postmeta met meta_key = _wp_attached_file:

Oude situatie: Bestand wordt niet gevonden
SQL-code
Nieuwe situatie: Bestand werd gelijk gevonden

Zie ook