Вопрос или проблема
Я пытаюсь отобразить на своей странице WORK значение поля ACF, которое находится внутри блока в пользовательском типе записи project.
Если я получаю все посты, используя функцию Timber следующим образом:
$posts = Timber::get_posts('post_type=work');
Я получаю следующий результат:
array (size=1)
0 =>
object(Timber\Post)[1669]
public 'ImageClass' => string 'Timber\Image' (length=12)
public 'PostClass' => string 'Timber\Post' (length=11)
public 'TermClass' => string 'Timber\Term' (length=11)
public 'object_type' => string 'post' (length=4)
public 'custom' =>
array (size=3)
'_edit_lock' => string '1565259680:1' (length=12)
'_thumbnail_id' => string '30' (length=2)
'_wp_old_slug' => string 'harrods-interior' (length=16)
protected '_content' => null
protected '_permalink' => null
protected '_next' =>
array (size=0)
empty
protected '_prev' =>
array (size=0)
empty
protected '_css_class' => null
public 'id' => int 29
public 'ID' => int 29
public 'post_author' => string '1' (length=1)
public 'post_content' => string '<!-- wp:acf/hero-case-study {
"id": "block_5d4ac446baf60",
"name": "acf\/hero-case-study",
"data": {
"hero_cs_headline": "Lorem ipsum dolor sit amet consectetur adipisicing elit.",
"_hero_cs_headline": "field_5d4aa12b9cf8b",
"headline_cs_text_color": "#ffffff",
"_headline_cs_text_color": "field_5d4ab40954b40",
"category_cs_text_color": "#3c304c",
"_category_cs_text_color": "field_5d4ab5205ffa8",
"hero_cs_bg_image": 42,
"_hero_cs_bg_'... (length=6122)
public 'post_date' => string '2019-08-06 16:41:36' (length=19)
public 'post_excerpt' => string '' (length=0)
public 'post_parent' => int 0
public 'post_status' => string 'publish' (length=7)
public 'post_title' => string 'KTURE' (length=5)
public 'post_type' => string 'work' (length=4)
public 'slug' => string 'kture' (length=5)
protected '__type' => null
public '_edit_lock' => string '1565259680:1' (length=12)
public '_thumbnail_id' => string '30' (length=2)
public '_wp_old_slug' => string 'harrods-interior' (length=16)
public 'post_date_gmt' => string '2019-08-06 16:41:36' (length=19)
public 'comment_status' => string 'closed' (length=6)
public 'ping_status' => string 'closed' (length=6)
public 'post_password' => string '' (length=0)
public 'post_name' => string 'kture' (length=5)
public 'to_ping' => string '' (length=0)
public 'pinged' => string '' (length=0)
public 'post_modified' => string '2019-08-08 08:06:38' (length=19)
public 'post_modified_gmt' => string '2019-08-08 08:06:38' (length=19)
public 'post_content_filtered' => string '' (length=0)
public 'guid' => string 'http://simplicitypartners2019.test/?post_type=work&p=29' (length=60)
public 'menu_order' => int 0
public 'post_mime_type' => string '' (length=0)
public 'comment_count' => string '0' (length=1)
public 'filter' => string 'raw' (length=3)
public 'status' => string 'publish' (length=7)
Как вы можете видеть, мне нужно значение “hero_cs_headline”, которое находится внутри post_content. Может ли кто-то помочь мне получить это значение?
Если есть другое решение непосредственно в файле twig, было бы замечательно тоже.
Спасибо!
Вам нужно установить обратный вызов рендеринга, когда вы создаете свой блок ACF:
acf_register_block_type( array(
'name' => 'example-block',
'title' => __( 'Example Block', 'your-text-domain' ),
'description' => __( 'Пользовательский пример блока.', 'your-text-domain' ),
'render_callback' => 'my_acf_block_render_callback',
'category' => 'formatting',
'icon' => 'admin-comments',
'keywords' => array( 'example' ),
) );
Затем в этой функции вы вызываете функции Timber, как в шаблоне страницы:
function my_acf_block_render_callback( $block, $content="", $is_preview = false ) {
$context = Timber::context();
// Храним значения блока.
$context['block'] = $block;
// Храним значения полей.
$context['fields'] = get_fields();
// Храним значение $is_preview.
$context['is_preview'] = $is_preview;
// Отображаем блок.
Timber::render( 'block/example-block.twig', $context );
}
После этого блок будет правильно отображаться, когда выводится с помощью {{ post.content }}
или любого другого метода, который использует стандартные фильтры WordPress для отображения the_content()
.
Дополнительная информация доступна в документации Timber, откуда я взял эти фрагменты.
Ответ или решение
Для извлечения значения поля Advanced Custom Fields (ACF) внутри блока Gutenberg с другой страницы или шаблона, особенно при использовании Timber, вам необходимо следовать нескольким этапам. В данной инструкции мы подробно разберем этот процесс.
Шаг 1: Получить посты с помощью Timber
В первую очередь, вы получите посты своего произвольного типа (в вашем случае — work
) с использованием функции Timber:
$posts = Timber::get_posts('post_type=work');
Это вернет массив объектов постов, где каждый объект будет содержать все доступные поля поста, включая post_content
, который хранит ваш блок ACF.
Шаг 2: Использование рендеринга блока
Чтобы извлечь значение ACF, вам нужно настроить рендеринг вашего блока, включая callback функцию, которая будет извлекать данные поля. Вы можете зарегистрировать ваш блок, например, так:
acf_register_block_type( array(
'name' => 'example-block',
'title' => __( 'Пример блока', 'your-text-domain' ),
'render_callback' => 'my_acf_block_render_callback',
'category' => 'formatting',
'icon' => 'admin-comments',
'keywords' => array( 'example' ),
) );
Шаг 3: Callback функция
Следующим шагом вам нужно создать callback функцию, которая будет извлекать данные ACF и передавать их в шаблон Timber:
function my_acf_block_render_callback( $block, $content="", $is_preview = false ) {
$context = Timber::context();
// Получите значения полей ACF
$context['fields'] = get_fields();
// Передайте контекст в шаблон
Timber::render( 'block/example-block.twig', $context );
}
Шаг 4: Доступ к значению поля ACF в шаблоне Twig
Теперь, когда вы уже имеете значение поля ACF в контексте рендеринга, вам просто нужно получить доступ к этому значению в файле шаблона Twig:
{{ fields.hero_cs_headline }}
Шаг 5: Извлечение данных на другой странице
Если вы хотите получить значение поля ACF с другой страницы (например, из поста другого типа), вы можете использовать get_post
или Timber::get_post()
для извлечения нужного поста перед его передачей в контекст:
$post = Timber::get_post( $post_id ); // замените $post_id на ID нужного поста
$context['hero_cs_headline'] = $post->fields['hero_cs_headline'];
Заключение
Следуя этим шагам, вы сможете извлекать значения полей ACF из блоков Gutenberg, размещённых в произвольных типах постов, и использовать их на своих страницах или в блочных шаблонах Timber. Этот подход обеспечивает четкость, модульность и гибкость кода, что гарантирует его дальнейшую поддержку и обновление.