ACF (Advanced Custom Fields, WordPress)
Advanced Custom Fields (ACF) lijkt zo'n beetje de standaard-plugin voor WordPress te zijn, om eigen velden en objecten te defineren. Zie deze inleiding. Voorbeeld: Je wilt op je home page een hero shot. Met custom fields kun je die configureren. Dat kan ook met standaard-WordPress, maar met ACF gaat dat gemakkelijker [1].
Field groups
- Binnen ACF zijn velden ondergebracht in field groups. Vervolgens kun je Field groups associëren met objecten (pagina's, post, etc.). Je kunt gemakkelijk achterhalen wat de field group van een pagina is, door (in de backend, uiteraard), te klikken op het tandwieltje naast de titel van een field group.
- Field groups lijken in verschillende soorten en maten te komen, waaronder page, clone, detail, etc.
Databasemodel
- Definities van ACF-velden worden opgeslagen in tabel
wp_posts
- Instanties van ACF-velden die geassociëerd zijn met posts (bv. de eerder genoemde hero shot), worden opgeslagen in tabel
wp_postmeta
- Instanties van ACF-velden die niet geassociëerd zijn met specifieke posts, worden opgeslagen in tabel
wp_options
Velddefinities uitlezen
# * Lees de definitie van veld hero_shop # * Output hieronder is handmatig aangepast: Normaal komt het er niet zo mooi wrapped uit # select post_content, post_title, post_excerpt, post_name from wp_posts where post_type like "acf-field" and post_title like "Hero text"; +------------------------------------------------------------------------------------+------------+--------------+---------------------+ | post_content | post_title | post_excerpt | post_name | +------------------------------------------------------------------------------------+------------+--------------+---------------------+ | a:10:{s:4:"type";s:7:"wysiwyg";s:12:"instructions";s:0:"";s:8:"required";i:0;s:17: | | | | | "conditional_logic";i:0;s:7:"wrapper";a:3:{s:5:"width";s:0:"";s:5:"class";s:0:"";s:| Hero text | hero_text | field_5d4d3c8f72ecd | | 2:"id";s:0:"";}s:13:"default_value";s:0:"";s:4:"tabs";s:3:"all";s:7:"toolbar";s:4: | | | | | "full";s:12:"media_upload";i:1;s:5:"delay";i:0;} | | | | +------------------------------------------------------------------------------------+------------+--------------+---------------------+
Waardes uitlezen
Uitlezen van de waarde van een veld dat in wp_postmeta
is opgeslagen middels WP-CLI:
$ wp post meta list 7 --keys=hero_text +---------+-----------+-----------------+ | post_id | meta_key | meta_value | +---------+-----------+-----------------+ | 7 | hero_text | Eat more chips! | +---------+-----------+-----------------+
In SQL:
select * from wp_postmeta where meta_key like "hero_text"; +---------+---------+-----------+-----------------+ | meta_id | post_id | meta_key | meta_value | +---------+---------+-----------+-----------------+ | 3825 | 7 | hero_text | Eat more chips! | +---------+---------+-----------+-----------------+
WP-CLI & automatisering ACF
ACF lijkt geen eigen WP-CLI-commando's te kennen en er lijken geen commando's te zijn om ACF-velden te automatiseren (toevoegen, verwijderen, bijwerken).
Het enige dat ik vond, is een open-source snippet van Hoppinger: https://github.com/hoppinger/advanced-custom-fields-wpcli. Hiermee lijk je ACF field groups te kunnen im- en exporteren. Verdere functies heeft het niet.
PHP-API & automatisering ACF
ACF komt met een set PHP-commando's om dingen te automatiseren. Zie ACF & PHP-API (WordPress voor details.
PHP-API & automatisering: have_rows loops
(deze paragraaf heeft betrekking op een opvoltooid project uit 2020)
Als een ACF-object repeaters (velden die meerdere records kunnen bevatten) of flexibele content bevat (je weet bv. niet vantevoren wat je zult aantreffen), dan kun je over de inhoud van zo'n object itereren mbv. have_rows() + the_row(). Hierbij is the_row() een WordPress Core-functie om een volgende rij te selecteren en te actualiseren. Het houdt dus een teller bij voor have_rows().
Gebruik bv. get_fields
of get_field_objects
om alle ACF-objecten van een post te achterhalen. Dan weet je wat de top-level-entiteit is
Casus: Automatische plugin-activatie (2021)
Ik kloon regelmatig sites op een headless manier, dus in code. Kan ik ACF Pro dan ook via code activeren? Gewoon klonen lijkt niet te werken
- [2]: ACF Pro key needs reapplied any time the
wp option get home
orwp option get siteurl
changes - De code in de database (
wp option get acf_pro_license
) is uitgebreider dan alleen de licensie-code: Het is een serialised field met daarin zowel de licentiecode als de URL in base64 vercijferd.
Voorbeeld ontcijferen (code is licht aangepast):
$ echo "YToyOntzOjM6ImtleSI7czo3MjoiTm1NNU16VTJOVFl3WVdetc.tIjtz12345678989CI7czoyN" | base64 -d a:2:{s:3:"key";s:72:"123456etc.3NDRm";s:3:"url";s:19:"https://example.com";}
Op dit moment (2021.12.01) is het niet nodig voor mij om dit te automatiseren. In PHP is dit in ieder geval goed te doen, en met een wrapper-functie om vanuit Bash bepaalde PHP-functies aan te roepen, is dit ook prima vanuit Bash te doen. Voor meer: https://anchor.host/preloading-advanced-custom-fields-pro-license-key/
Zie ook
- ACF & PHP-API (WordPress
- Buttonbar (WordPress)
- PHP-API (WordPress) » get_field()
- PHP-API (WordPress) » update_field()
- Serialised data (WordPress)
Bronnen
- https://www.advancedcustomfields.com/
- https://www.advancedcustomfields.com/resources/
- https://www.advancedcustomfields.com/resources/code-examples/
- https://www.advancedcustomfields.com/resources/working-with-nested-repeaters/
- https://support.advancedcustomfields.com/forums/topic/acf-activation-using-wp-cli/
- https://anchor.host/preloading-advanced-custom-fields-pro-license-key/
- https://deliciousbrains.com/advanced-custom-fields-wordpress/