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].

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