This code snippet, which you could add to your theme functions.php
file or a plugin, will allow you to add a paragraph block to a post and use this to output a custom field.
If you make sure it has a class of meta-value--{meta_key}
where {meta_key}
is replaced with the key of the meta data you want to retrieve, the block will output the value.
If no value is present, nothing is output.
<?php
/**
* Re-renders any paragraph block which contains a custom class including "meta-value--"
*
* @param string $block_content The block content.
* @param array $block The full block, including name and attributes.
* @param WP_Block $instance The block instance.
*
* @return string $block_content The block content.
*/
function hd_render_post_meta_block( $block_content, $block, $instance ) {
// if this block doesn't contain a custom class.
if ( empty( $block['attrs']['className'] ) ) {
return $block_content;
}
if ( ! str_contains( $block['attrs']['className'], 'meta-value--' ) ) {
return $block_content;
}
// create an array of classes from the classes added to the block.
$classes = explode( ' ', $block['attrs']['className'] );
// remove the classname at our special class.
$meta_key = str_replace( 'meta-value--', '', $classes[0] );
// remove the first class, which is our special class - we don't want this output on the front end.
unset( $classes[0] );
global $post;
// get the registered meta data for this post.
$registered_meta = get_registered_metadata( 'post', $post->ID );
// if our meta key is not in the registered meta list for this post.
if ( empty( $registered_meta[ $meta_key ] ) ) {
return '';
}
// get the meta value.
$meta_value = get_post_meta( $post->ID, $meta_key, true );
// if we have no meta value.
if ( empty( $meta_value ) ) {
return '';
}
// add a base class at the start of the classes array.
$base_class = ['hd-meta-block'];
$classes = array_merge( $base_class, $classes );
// start output buffering.
ob_start();
?>
<div class="<?php echo esc_attr( implode( ' ', $classes ) ); ?>"><?php echo esc_html( $meta_value ); ?></div>
<?php
// return the cleaned output buffer.
return ob_get_clean();
}
add_filter( 'render_block_core/paragraph', 'hd_render_post_meta_block', 10, 3 );