Как получить значение ACF внутри блока Gutenberg из другой страницы или шаблона? Я также использую Timber.

Вопрос или проблема

Я пытаюсь отобразить на своей странице 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&#038;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. Этот подход обеспечивает четкость, модульность и гибкость кода, что гарантирует его дальнейшую поддержку и обновление.

Оцените материал
Добавить комментарий

Капча загружается...