如何在gutenberg块中访问高级自定义字段值?

时间:2019-05-07 19:42:51

标签: wordpress advanced-custom-fields wordpress-gutenberg gutenberg-blocks

我有一个自定义帖子类型,其中包含一些高级自定义字段。我正在尝试从Gutenberg块中访问这些自定义字段值。

我已将以下内容添加到我的register_post_type函数中

    'show_in_rest' => true,
    'supports' => array( 'title', 'editor', 'custom-fields' ),

我可以使用以下方法从我的古腾堡区中成功检索自定义帖子:

select('core').getEntityRecords('postType', 'customType')

但是我没有看到自定义字段或其值。

这是我区块的JavaScript:

const { __ } = wp.i18n;
const { registerBlockType } = wp.blocks;
const { withSelect } = wp.data;

registerBlockType('cgb/block-press-block', {
  title: __('Press Block'),
  icon: 'awards',
  category: 'common',
  keywords: [
    __('press-block'),
  ],
  edit: withSelect((select) => {
    return {
      posts: select('core').getEntityRecords('postType', 'press')
    };
  })(({posts}) => {
    return <p>Content</p>;
  }),
});

是否可以在编辑器端访问自定义帖子的高级字段值,还是可以将数据传递到块?

1 个答案:

答案 0 :(得分:1)

当您已经在使用“高级自定义字段”时,您是否可以使用acf_register_block而不是独立注册自己的块?这样,您可以在基于PHP的模板中从ACF访问字段。

以下是一些有用的链接:

此代码摘自上面的ACF博客文章,并在此处发布,以确保完整性,以防上述链接发生更改。

注册ACF块:

add_action('acf/init', 'my_acf_init');
function my_acf_init() {

    // check function exists
    if( function_exists('acf_register_block') ) {

        // register a testimonial block
        acf_register_block(array(
            'name'              => 'testimonial',
            'title'             => __('Testimonial'),
            'description'       => __('A custom testimonial block.'),
            'render_callback'   => 'my_acf_block_render_callback',
            'category'          => 'formatting',
            'icon'              => 'admin-comments',
            'keywords'          => array( 'testimonial', 'quote' ),
        ));
    }
}

包含您的阻止模板的回调函数:

function my_acf_block_render_callback( $block ) {

    // convert name ("acf/testimonial") into path friendly slug ("testimonial")
    $slug = str_replace('acf/', '', $block['name']);

    // include a template part from within the "template-parts/block" folder
    if( file_exists( get_theme_file_path("/template-parts/block/content-{$slug}.php") ) ) {
        include( get_theme_file_path("/template-parts/block/content-{$slug}.php") );
    }
}

您的区块的HTML:

<?php
/**
 * Block Name: Testimonial
 *
 * This is the template that displays the testimonial block.
 */

// get image field (array)
$avatar = get_field('avatar');

// create id attribute for specific styling
$id = 'testimonial-' . $block['id'];

// create align class ("alignwide") from block setting ("wide")
$align_class = $block['align'] ? 'align' . $block['align'] : '';

?>
<blockquote id="<?php echo $id; ?>" class="testimonial <?php echo $align_class; ?>">
    <p><?php the_field('testimonial'); ?></p>
    <cite>
        <img src="<?php echo $avatar['url']; ?>" alt="<?php echo $avatar['alt']; ?>" />
        <span><?php the_field('author'); ?></span>
    </cite>
</blockquote>
<style type="text/css">
    #<?php echo $id; ?> {
        background: <?php the_field('background_color'); ?>;
        color: <?php the_field('text_color'); ?>;
    }
</style>

这将创建一个基本的推荐块作为简单的起点。 ACF在Gutenberg中处理JavaScript处理,因此您所要做的就是担心PHP方面的问题。

这意味着您可以像我们( ACF粉丝)那样使用get_field()the_field()函数。不使用本机方式混合ACF和古腾堡可能会引起头痛,并且可能需要插件才能通过WordPress REST API访问字段。

注意:对Gutenberg块的ACF支持需要ACF 5.8或更高版本。