Databasemodel (WordPress)
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!
Fields
GUID's
WordPress maintains GUID-fields, like in wp_posts. I think it's okay to update them [1]
Functies
Menu-items
Menu-items zijn posts van het type nav_menu_item:
select * from wp_posts where post_type="nav_menu_item";
Posting-URL
De URL van een posting (vanaf de root van de site) vind je in wp_posts
in de kolom post_name
[2].
Screen Options
[3]:
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";
WooCommerce-producten - Korte variant
WooCommerce-productinformatie, vind je voornamelijk op twee plekken [4]:
- wp_posts
- wp_postmeta
Voorbeeld: Selecteer de belangrijkste gegevens uit wp_posts en de SKU's uit wp_postmeta:
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";
WooCommerce-producten - Uitgebreide variant
- Inclusief primaire en secundaire afbeelding, prijs + uitleg, maar zonder taxonomische informatie
- MISSING: Korte productomschrijving van Yoast
# # 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" # Where clause ############################################################ # where post_type="product" and post_status="publish" and wp_postmeta.meta_key="_sku" # Limit ############################################################ # limit 0, 10;
WooCommerce Shop-page widgets
De widgets/filters op de shop page, worden gecodeerd in tabel wp_options
in een paar velden met serialised content:
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
ACF-velden (inclusief buttonbar)
Gegevens rondom ACF-velden lijken primair in tabel wp_postmeta
te worden opgeslagen.
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.