Databasemodel (WordPress): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
 
(40 tussenliggende versies door dezelfde gebruiker niet weergegeven)
Regel 18: Regel 18:
 
* Open tabel "wp_posts" in MySQL WorkBench en filter de output op "Merkzzz" - Klaar!
 
* Open tabel "wp_posts" in MySQL WorkBench en filter de output op "Merkzzz" - Klaar!
  
== Fields ==
+
== Velden ==
  
Meestal - maar niet altijd - hebben velden een ''globale naam''. Maw., veld ''blablah'' in de ene tabel, is hetzelfde veld ''blahblah'' in een andere tabel. Dit hoofdstuk gaat over deze globale velden.
+
Meestal - maar niet altijd - hebben velden een ''globale naam''. Maw., veld ''blablah'' in de ene tabel, is meestal hetzelfde veld ''blahblah'' in een andere tabel:
  
 
=== GUID's ===
 
=== GUID's ===
  
WordPress maintains GUID-fields, like in wp_posts. I think it's okay to update them [https://deliciousbrains.com/wordpress-post-guids-sometimes-update]
+
WordPress maintains GUID-fields, like in wp_posts. These are exactly that: ''Global Unique IDentifiers''. They were invented for feed-readers to keep track of what has been processed and what not. That they look like URLs, is completely irrelevant. You can update them after a migration, if you want, but frankly: Just ignore them [https://deliciousbrains.com/wordpress-post-guids-sometimes-update], [https://pods.io/2013/07/17/dont-use-the-guid-field-ever-ever-ever]
  
== Functies ==
+
=== ID ===
 +
 
 +
* De centrale entititeit in een WordPress-database, is een ''post'' (tabel <code>wp_posts</code>). Een post heeft een PK, genaamd <code>ID</code>
 +
* Deze naam is helaas niet globaal: In tabel <code>wp_term_relationships</code> heet dit veld namelijk <code>object_id</code> - Ik kan het echter verkeerd hebben: Misschien wordt met ''object'' iets anders (algemeners?) bedoeld dan een post-id.
 +
 
 +
== Objecten ==
 +
 
 +
Dit hoofdstuk benaderd het database vanuit ''objecten''. Bv.: Waar vind ik alle WooCommerce-producteninformatie? Hoe zit de Kenmerk-taxonomie in elkaar?
 +
 
 +
=== ACF-velden (inclusief buttonbar) ===
 +
 
 +
Zie [[ACF (Advanced Custom Fields, WordPress)#Database-model]]
 +
 
 +
=== Afbeeldingen ===
 +
 
 +
Zie [[Afbeeldingen & databasemodel (WordPress)]]
  
 
=== Menu-items ===
 
=== Menu-items ===
  
Menu-items zijn ''posts'' van het type ''nav_menu_item'':
+
Zie [[Menu's (WordPress)]].
 
 
<pre>
 
select * from wp_posts where post_type="nav_menu_item";
 
</pre>
 
  
 
=== Posting-URL ===
 
=== Posting-URL ===
Regel 125: Regel 136:
 
</pre>
 
</pre>
  
=== WooCommerce-producten - Korte variant ===
+
=== Taxonomieën ===
 
 
WooCommerce-productinformatie, vind je voornamelijk op twee plekken [https://stackoverflow.com/questions/36965352/woocommerce-finding-the-products-in-database]:
 
 
 
* wp_posts
 
* wp_postmeta
 
 
 
Voorbeeld: Selecteer de belangrijkste gegevens uit wp_posts en de SKU's uit wp_postmeta:
 
 
 
<pre>
 
select
 
    wp_posts.ID as post_id,
 
    wp_posts.post_title as post_title,
 
    wp_posts.post_name as slug,
 
    wp_posts.post_content      as content  # =product description
 
    wp_posts.guid as guid,
 
    wp_postmeta.meta_value as sku
 
from
 
    wp_posts
 
join
 
    wp_postmeta
 
    on
 
    wp_posts.ID = wp_postmeta.post_id
 
where
 
    post_type="product"
 
    and
 
    post_status="publish"
 
    and
 
    meta_key="_sku";
 
</pre>
 
 
 
=== WooCommerce-producten - Uitgebreide variant ===
 
 
 
* Inclusief primaire en secundaire afbeelding, prijs + uitleg, maar zonder taxonomische informatie
 
* MISSING: Korte productomschrijving van Yoast
 
 
 
<pre>
 
#
 
# Example: Retrieve all product data
 
################################################################################
 
#
 
use wp_tmp;
 
#
 
#
 
################################################################################
 
# Select
 
################################################################################
 
#
 
select
 
    wp_posts.id as post_id,
 
    wp_posts.post_title as post_title,
 
    wp_posts.post_name as slug,
 
    wp_posts.post_content as content,
 
    wp_posts.guid as guid,
 
    wp_postmeta.meta_value as sku,
 
    wp_postmeta_03.meta_value as thumbnail_path,
 
    wp_postmeta_05.meta_value as second_image_path,
 
    wp_postmeta_06.meta_value as price
 
from
 
    wp_posts
 
 
 
 
 
# First join to wp_postmeta to retrieve sku
 
############################################################
 
#
 
left join
 
    wp_postmeta
 
    on
 
    wp_posts.id = wp_postmeta.post_id
 
 
 
 
 
# Second join to wp_postmeta to retrieve "_thumbnail_id"
 
############################################################
 
#
 
# "_thumbnail_id" on its turn, is a wp_postmeta.product_id
 
#
 
left join
 
    wp_postmeta as wp_postmeta_02
 
    on
 
    wp_postmeta_02.post_id = wp_posts.id
 
    and
 
    wp_postmeta_02.meta_key = "_thumbnail_id"
 
 
 
 
 
# Third join to wp_postmeta to retrieve thumbnail-path
 
############################################################
 
#
 
# This join is different from the two below, as it is a
 
# double join: It retrieves the meta_id for the thumbnail-
 
# attachment
 
#
 
left join
 
    wp_postmeta as wp_postmeta_03
 
    on
 
    wp_postmeta_03.post_id = wp_postmeta_02.meta_value
 
    and
 
    wp_postmeta_03.meta_key = "_wp_attached_file"
 
 
 
 
 
# Fourth join to wp_postmeta: "_product_image_gallery"
 
############################################################
 
#
 
# Retrieve the meta_value for "_product_image_gallery":
 
# It is the post_id of everything related to the second
 
# image
 
#
 
left join
 
    wp_postmeta as wp_postmeta_04
 
    on
 
    wp_postmeta_04.post_id = wp_posts.id
 
    and
 
    wp_postmeta_04.meta_key = "_product_image_gallery"
 
 
 
 
 
# Fifth join to wp_postmeta: "_product_image_gallery"
 
############################################################
 
#
 
# Retrieve the meta_value for "_product_image_gallery":
 
# It is the post_id of everything related to the second
 
# image
 
#
 
left join
 
    wp_postmeta as wp_postmeta_05
 
    on
 
    wp_postmeta_05.post_id = wp_postmeta_04.meta_value
 
    and
 
    wp_postmeta_05.meta_key = "_wp_attached_file"
 
 
 
 
 
# Sixth join to wp_postmeta to retrieve "_price"
 
############################################################
 
#
 
# "_price" and "_regular_price" seem always identical → Only
 
# fetch the first one
 
#
 
left join
 
    wp_postmeta as wp_postmeta_06
 
    on
 
    wp_postmeta_06.post_id = wp_posts.id
 
    and
 
    wp_postmeta_06.meta_key = "_price"
 
  
 +
Zie [[Taxonomieën - Datamodel (WordPress)]]
  
# Where clause
+
=== WooCommerce ===
############################################################
 
#   
 
where
 
    post_type="product"
 
    and
 
    post_status="publish"
 
    and
 
    wp_postmeta.meta_key="_sku"
 
  
# Limit
+
Zie [[WooCommerce - Datamodel]]
############################################################
 
#
 
limit
 
    0, 10;
 
</pre>
 
  
=== WooCommerce Shop-page widgets ===
+
=== Yoast ===
  
De widgets/filters op de shop page, worden gecodeerd in tabel <code>wp_options</code> in een paar velden met ''serialised content'':
+
Zie [[Yoast - Databasemodel]]
 
 
<pre>
 
select option_value from wp_options where option_name = "widget_woocommerce_product_categories"  # Category-widget
 
select option_value from wp_options where option_name = "widget_woocommerce_layered_nav"          # Attribute-widgets
 
</pre>
 
 
 
=== ACF-velden (inclusief buttonbar) ===
 
 
 
Gegevens rondom ACF-velden lijken primair in tabel <code>wp_postmeta</code> te worden opgeslagen.
 
  
 
== Tabellen ==
 
== Tabellen ==
Regel 306: Regel 156:
 
* wp_options: Naast een eigen ID, zijn er twee velden: {option_name; option_value} - Dus label-waarde-paren
 
* wp_options: Naast een eigen ID, zijn er twee velden: {option_name; option_value} - Dus label-waarde-paren
 
* wp_postmeta: Naast een eigen ID, zijn er ''drie'' velden: {post_id; meta_key; meta_value} - Dus label-waarde-paren, ''gekoppeld'' aan een post_id. Zo'n post_id kan trouwens ook een meta_id zijn. Dat is bv. het geval bij WooCommerce-producten rondom afbeeldingen → attachments.
 
* wp_postmeta: Naast een eigen ID, zijn er ''drie'' velden: {post_id; meta_key; meta_value} - Dus label-waarde-paren, ''gekoppeld'' aan een post_id. Zo'n post_id kan trouwens ook een meta_id zijn. Dat is bv. het geval bij WooCommerce-producten rondom afbeeldingen → attachments.
 +
 +
=== wp_gf_entry ===
 +
 +
Heeft betrekking op ''Gravity Forms''
  
 
== Zie ook ==
 
== Zie ook ==
  
 +
* [[ACF (Advanced Custom Fields, WordPress)#Database-model]]
 
* [[Bulkimport (WordPress)]]
 
* [[Bulkimport (WordPress)]]
 
* [[Categorieën (WordPress)]]
 
* [[Categorieën (WordPress)]]
 
* [[Db-bulk (WordPress)]]
 
* [[Db-bulk (WordPress)]]
 
* [[Polylang (WordPress-plugin)]]
 
* [[Polylang (WordPress-plugin)]]
 +
* [[Yoast - Databasemodel]]
  
 
== Bronnen ==
 
== Bronnen ==
  
 
* https://wordpress.stackexchange.com/questions/58625/where-is-permalink-info-stored-in-database
 
* https://wordpress.stackexchange.com/questions/58625/where-is-permalink-info-stored-in-database
* http://knl.s1/product/koolborstelset-ca-00-002-voor-bosch-2/
+
* http://knl.s1/product/koolborstelset-ca-00-002-voor-bosch-2
 
* https://stackoverflow.com/questions/36965352/woocommerce-finding-the-products-in-database
 
* https://stackoverflow.com/questions/36965352/woocommerce-finding-the-products-in-database
 +
* https://deliciousbrains.com/wordpress-post-guids-sometimes-update
 +
* https://pods.io/2013/07/17/dont-use-the-guid-field-ever-ever-ever

Huidige versie van 10 sep 2022 om 10:46

Dit is het hoofdartikel rondom het databasemodel van WordPress. Dit it artikel is slechts een beginnetje. Zie sectie Zie ook voor meer.

Hoe vind je iets terug in de database?

Soms is het een uitermate lastig kunstje om te achterhalen waar iets in de database staat. In okt. 2020 had ik een casus die laat zien dat het niet altijd zo moeilijk hoeft te zijn.

Het probleem

  • Waar staan menu-items in de database?
  • Ik had ergens opgepikt dat dat via taxonomieën gaat, maar daar kan ik zo snel niets vinden.

Aanpak

  • Verander een menu-items in iets unieks. Bv. "Merk" → "Merkzzz"
  • Maak een db-dump
  • Selecteer regels uit de db-dump met de string "Merkzzz": less fr_fr_s1 | grep Merkzzz > merkzzz.txt
  • Open merkzzz.txt in een editor. Schakel wordwrap uit. Het was nog steeds onleesbaar, maar het was wel duidelijk dat het ging om de tabellen "wp_posts" en "wp_yoast_indexable", en dat was genoeg
  • Open tabel "wp_posts" in MySQL WorkBench en filter de output op "Merkzzz" - Klaar!

Velden

Meestal - maar niet altijd - hebben velden een globale naam. Maw., veld blablah in de ene tabel, is meestal hetzelfde veld blahblah in een andere tabel:

GUID's

WordPress maintains GUID-fields, like in wp_posts. These are exactly that: Global Unique IDentifiers. They were invented for feed-readers to keep track of what has been processed and what not. That they look like URLs, is completely irrelevant. You can update them after a migration, if you want, but frankly: Just ignore them [1], [2]

ID

  • De centrale entititeit in een WordPress-database, is een post (tabel wp_posts). Een post heeft een PK, genaamd ID
  • Deze naam is helaas niet globaal: In tabel wp_term_relationships heet dit veld namelijk object_id - Ik kan het echter verkeerd hebben: Misschien wordt met object iets anders (algemeners?) bedoeld dan een post-id.

Objecten

Dit hoofdstuk benaderd het database vanuit objecten. Bv.: Waar vind ik alle WooCommerce-producteninformatie? Hoe zit de Kenmerk-taxonomie in elkaar?

ACF-velden (inclusief buttonbar)

Zie ACF (Advanced Custom Fields, WordPress)#Database-model

Afbeeldingen

Zie Afbeeldingen & databasemodel (WordPress)

Menu-items

Zie Menu's (WordPress).

Posting-URL

De URL van een posting (vanaf de root van de site) vind je in wp_posts in de kolom post_name [3].

Screen Options

[4]:

WordPress Screen Options are displayed in a hanging tab in the upper right of the WordPress dashboard. Screen Options are user specific based on your login name. They're stored in table wp_usermeta

Voorbeeld

#
# Change the number of products that is being displayed at 'all products'
############################################################################
#
# * Change the number of products for a specific user: The page doesn't load
#   anymore to do this manually
# * Select user through "user_login", so it works equally well on development
#   environment and production environment
# * Jeroen Strompf - Okt. 2020
#
#
############################################################################
# Use the production database
############################################################################
#
use example_com;


############################################################################
# Read out the old value
############################################################################
#
select
   wp_users.user_login,
   wp_users.ID,
   wp_usermeta.*
from
   wp_users
join
   wp_usermeta
   on
      wp_usermeta.user_id = wp_users.ID
where
   user_login like "Jeroen"
   and
   meta_key like "edit_shop_order_per_page";


############################################################################
# Change value
############################################################################
#
update
   wp_usermeta
join
   wp_users
   on
      wp_usermeta.user_id = wp_users.ID
set
   meta_value=25
where
   wp_users.user_login = "Jeroen"
   and
   wp_usermeta.meta_key = "edit_shop_order_per_page";


############################################################################    
# Read out the new value
############################################################################
#
select
   wp_users.user_login,
   wp_users.ID,
   wp_usermeta.*
from
   wp_users
join
   wp_usermeta
   on
      wp_usermeta.user_id = wp_users.ID
where
   user_login like "Jeroen"
   and
   meta_key like "edit_shop_order_per_page";    

Taxonomieën

Zie Taxonomieën - Datamodel (WordPress)

WooCommerce

Zie WooCommerce - Datamodel

Yoast

Zie Yoast - Databasemodel

Tabellen

wp_options & wp_postmeta

Beide tabellen dienen voor 'extra' informatie die niet in een primaire tabel pastte, maar met een interessant verschil:

  • wp_options: Naast een eigen ID, zijn er twee velden: {option_name; option_value} - Dus label-waarde-paren
  • wp_postmeta: Naast een eigen ID, zijn er drie velden: {post_id; meta_key; meta_value} - Dus label-waarde-paren, gekoppeld aan een post_id. Zo'n post_id kan trouwens ook een meta_id zijn. Dat is bv. het geval bij WooCommerce-producten rondom afbeeldingen → attachments.

wp_gf_entry

Heeft betrekking op Gravity Forms

Zie ook

Bronnen