Updated 25.03. : Some function names changed in the latest beta version.
IN BETA
ACF 5.8 Beta introduced an easy way to create your custom Gutenberg blocks. I am already using it heavily for a current project, to easily organize content and media assets.
Really powerful, when combined with Timber as well, which has been the foundation of many of my themes for years now ;)
ORGANIZE YOURSELF
Organizing data using ACF is nice, but sometimes you seek access to that saved block data directly. I hate it when I am confined to boundaries and the data flow is restricted or hidden. I need things to be accessible to choose the creative flow myself.
SIMPLE EXAMPLE
// Parse blocks from post content
$blocks = parse_blocks($your_post_content);
$collect = array();
// Loop through the blocks
foreach($blocks as $block){
//Setup global block post data context
// before: acf_setup_postdata
acf_setup_meta( $block['attrs']['data'], $block['attrs']['id'], true );
// Get ACF fields
$fields = get_fields();
// I am using this to organize my assets.
// Each block of mine has a unique identifier as its first field:
// $uid = $block['attrs']['data'][array_keys($block['attrs']['data'])[0]]
// I would do:
// $collect[$uid] = $fields;
// Collection of fields using the block id.
$collect[$block['attrs']['id']] = $fields;
// Restore global context
// before: acf_reset_postdata
acf_reset_meta( $block['attrs']['id'] );
}
There you go, enjoy some free block data :)
I was a big skeptic, when it comes to WordPress and the new Gutenberg editor, but combined with ACF + Timber its pure magic :) Looking forward to things to come!
Cheers
Alex
Enjoy coding …
Extended example:
$collect = [];
$blocks = parse_blocks($your->post_content);
foreach($blocks as $block){
if( isset($block['attrs']['data']) && !empty($block['attrs']['data'][array_keys($block['attrs']['data'])[0]])){
acf_setup_meta( $block['attrs']['data'], $block['attrs']['id'], true );
$fields = get_fields();
acf_reset_meta( $block['attrs']['id'] );
$collect[$block['attrs']['data'][array_keys($block['attrs']['data'])[0]]] = array('render' => render_block( $block ),
'field' => $fields,
'block' => $block
);
}else{
$collect['main'] .= render_block( $block );
}
}
The $collect array will hold all data, including all ACF fields. You will have full access to any field, including repeater fields. The $collect[‘main’] will just collect the standard post content.
