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].
Dit artikel behandelt automatisering van ACF-objecten.
Database-model
Definities van ACF-velden worden opgeslagen in tabel wp_posts
terwijl instanties worden opgeslagen in tabel wp_postmeta
.
Voorbeeld: Hero-tekst voor op de home page van een bepaalde site:
Veld-definitie
# veld-definitie: wp_posts # (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;} | | | | +------------------------------------------------------------------------------------+------------+--------------+---------------------+
Instantiatie
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! | +---------+---------+-----------+-----------------+
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.
have_rows loops (PHP-API)
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
WP-CLI
ACF lijkt geen eigen WP-CLI-commando's te kennen. Desalniettemin:
wp post meta
komt precies van pas, alsof het voor ACF gemaakt is- Hoppinger heeft third-party-ondersteuning gebouwd: https://github.com/hoppinger/advanced-custom-fields-wpcli. Hiermee lijk je ACF field groups te kunnen im- en exporteren. Verdere functies heeft het niet.
Automatische activatie
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
- 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/