如何在 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>
我是 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>