ACF (Advanced Custom Fields, WordPress)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

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:

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 or wp 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

Bronnen