如何在 Timber 中设置自定义 post 类型和 ACF 字段

How to set up custom post types and ACF fields in Timber

我是 Timber/Twig/PHP 的新手,有一个相当具体的要求。 我有一个 page-home.php / page-home.twig,其中显示了几个 ACF 字段、作为自定义 post 类型的推荐,以及最新的 3 个博客 posts。

我对 Twig 前端部分基本没问题,但在设置 php 模板文件时遇到困难。

我已经阅读了 Timber 文档并得到了 ACF 的印象,因此可以直接在 Twig 中调用该字段。还检查了 Github 和 SO 是否存在类似问题,但没有找到答案。 youtube 上有一个涵盖自定义 post 类型的视频,但它只在 post 的循环中。

这是我的页面-home.php

echo 'page-home.php';

$context = Timber::get_context();
$context['page'] = new Timber\Post();

$templates = array('page.twig');
if (is_front_page()){

    $context['posts'] = Timber::get_posts('post_type=post&posts_per_page=3');
    $context['testimonials'] = Timber::get_posts('post_type=testimonials');

    // add your twig view to the front of the templates array
    array_unshift($templates, 'page-home.twig');
}

Timber::render( $templates, $context );


$image = get_field('hero_image');

echo '<pre>';
    var_dump( $image );
echo '</pre>';

page-home.php 按预期显示 3 个博客 post,但 ACF 字段 var_dump.

返回 NULL 值

如果我评论这一行 // $context['posts'] = new Timber\PostQuery($args); 我得到了我的图像数组的 var_dump,尽管它没有在 Twig 文件中呈现。

这是页面中的图片-home.twig <div class="image image-overlay" style="background-image:url({{ Image(post.meta('hero_image')).src }})"></div> 其中 returns 空白。

博客 post 被称为:

{% for post in posts %}
  {% include "blogpost-card.twig" %}
{% endfor %}

我也不确定如何在同一页面上调用单独的自定义 post 类型(推荐),因为文档没有提供该示例。

我正在使用通过 Composer 安装的入门主题。 如果主题或文档提供包含 posts、自定义 posts 和 ACF 字段的页面示例,那就太好了,因为我想这是一个非常常见的场景。至少对于像我这样在 PHP 方面需要一点额外帮助的人来说是这样。

至于 ACF 变量,您只需将它添加到您的 functions.php 中,您应该会摇摆它 - 如果我错了,请有人纠正我。

  class StarterSite extends Timber\Site {
        /** Add timber support. */
        public function __construct() {
            //maybe you already have this part in your functions file
            add_action( 'after_setup_theme', array( $this, 'theme_supports' ) );
            add_filter( 'timber_context', array( $this, 'add_to_context' ) );
            add_filter( 'get_twig', array( $this, 'add_to_twig' ) );
            add_action( 'init', array( $this, 'register_post_types' ) );
            add_action( 'init', array( $this, 'register_taxonomies' ) );
            parent::__construct();
        }

        public function add_to_context( $context ) {
            //left side: define how the variable is named to grab them in the TWIG files
            //right side: grabing the ACF variable-name
            $context['site'] = $this;
            $context['menu'] = new Timber\Menu("Main Menu");
            $context['something'] = new Timber\Menu("something_acf_name");
            $context['foo'] = new Timber\Menu("bar");
            $context['my_custom_button_name'] = new Timber\Menu("acf_custom_button_name");
            // Posts with the category name "featured" for the slideshow

            //
            return $context;
        }
    }

所以让我们假设我们在 index.twig 文件中(或任何其他文件,只要您在 functions.php 文件中定义了它),您可以像这样获取变量:

<div>
{{ foo }}
</div>

我希望这就是您要找的。例如,您也可以只在 index.php 文件中分配变量,这样它们就不会全局(在每个页面上)可用。这可能有助于控制您的可变混乱。真的取决于你在建造什么。

如果您的 Twig 文件中有 {{ Image(post.meta('hero_image')).src }},那么 Twig 将查找 post 变量。在您的例子中,当您循环遍历 post 以将它们显示为卡片时,您定义了一个 post 变量。

{% for post in posts %}
    {% include "blogpost-card.twig" %}
{% endfor %}

但是,您可能没有为 post 定义一个名为 hero_image 的自定义字段,而是在显示它们的页面上。因此,当您定义上下文并在上下文中的 page 下添加当前显示的 post 时,您稍后还需要通过 page 访问它,而不是通过 post.

$context = Timber::get_context();
$context['page'] = new Timber\Post();
<div
     class="image image-overlay"
     style="background-image:url({{ Image(page.meta('hero_image')).src }})"
></div>