Php 如何处理复杂ACF灵活内容字段的上下文?
例如,我可能有一个灵活的内容字段,让您可以选择从帖子类型中自动提取内容或手动定义内容 假设一个滑块,它会询问您是否要在帖子类型中显示帖子的标题和缩略图,或者使用转发器手动为每张幻灯片定义标题和图像 幻灯片的上下文将根据所选选项进行更改。一方面,您必须获取帖子并显示想要的信息,另一方面,您只需使用手动定义的内容Php 如何处理复杂ACF灵活内容字段的上下文?,php,wordpress,twig,timber,Php,Wordpress,Twig,Timber,例如,我可能有一个灵活的内容字段,让您可以选择从帖子类型中自动提取内容或手动定义内容 假设一个滑块,它会询问您是否要在帖子类型中显示帖子的标题和缩略图,或者使用转发器手动为每张幻灯片定义标题和图像 幻灯片的上下文将根据所选选项进行更改。一方面,您必须获取帖子并显示想要的信息,另一方面,您只需使用手动定义的内容 到目前为止,我的文件(基本上)是这样的: index.php $context = Timber::get_context(); $context['post'] = ( is_fron
到目前为止,我的文件(基本上)是这样的: index.php
$context = Timber::get_context();
$context['post'] = ( is_front_page() ) ? new Timber\Post( get_option( 'page_on_front' ) ) : new Timber\Post();
Timber::render( 'page.twig', $context );
page.twig
{% extends 'base.twig' %}
{% block content %}
{% for bloc in post.meta('blocs') %}
{% include 'blocs/' ~ bloc.acf_fc_layout ~ '.twig' ignore missing %}
{% endfor %}
{% endblock %}
因此,每个灵活布局的细枝文件都会自动包含在内,我可以很好地访问这些字段。然而,在我的滑块示例中,幻灯片的上下文会根据所选的选项而变化,并且我正试图尽可能多地保留小树枝文件的逻辑
在twig模板中获取帖子和设置变量看起来很混乱,这与最初使用twig的目标背道而驰。有更好的方法来处理此问题吗?解决此任务的一种常见方法是使用扩展
Timber\Post
的自定义类。有关这方面的更多信息,请参阅
在您的情况下,该类可以如下所示:
class PostFlexible extends Timber\Post {
public function dynamic_context( $args ) {
return $something;
}
}
class PostFlexible extends Timber\Post {
public function blocks() {
$blocks = array();
foreach ( $this->meta( 'bloc' ) as $block ) {
switch ( $block['acf_fc_layout'] ) {
case 'slider':
// Fetch the data you need for each slider.
$block['my_slider_data'] = 'something';
break;
}
$blocks[ $block ];
}
return $blocks;
}
}
然后,不要在PHP模板中使用Timber\Post()
,而是使用新类:
$context = Timber::get_context();
$context['post'] = ( is_front_page() )
? new PostFlexible( get_option( 'page_on_front' ) )
: new PostFlexible();
Timber::render( 'page.twig', $context );
在您的细枝模板中,您可以调用执行以下操作的方法:
{{ post.dynamic_context }}
问题是,你到底想做什么?您可以在该方法中呈现或编译另一个细枝模板。您可以在PHP的新方法中获取该模板所需的数据,然后将这些数据传递给Twig模板。这是一种方法
另一种方法是使用此方法在灵活字段上循环,并扩展细枝模板中所需的数据:
{% for bloc in post.blocks %}
{% include 'blocs/' ~ bloc.acf_fc_layout ~ '.twig' ignore missing %}
{% endfor %}
现在,您可以这样定义post.blocks
:
class PostFlexible extends Timber\Post {
public function dynamic_context( $args ) {
return $something;
}
}
class PostFlexible extends Timber\Post {
public function blocks() {
$blocks = array();
foreach ( $this->meta( 'bloc' ) as $block ) {
switch ( $block['acf_fc_layout'] ) {
case 'slider':
// Fetch the data you need for each slider.
$block['my_slider_data'] = 'something';
break;
}
$blocks[ $block ];
}
return $blocks;
}
}
该方法获取元数据,在灵活的字段中循环,并根据布局名称添加所需的数据(
acf\u fc\u layout
)。这样,您仍然可以在PHP中定义大部分逻辑,而在Twig中,您将只显示数据。解决此任务的常见方法是使用扩展Timber\Post
的自定义类。有关这方面的更多信息,请参阅
在您的情况下,该类可以如下所示:
class PostFlexible extends Timber\Post {
public function dynamic_context( $args ) {
return $something;
}
}
class PostFlexible extends Timber\Post {
public function blocks() {
$blocks = array();
foreach ( $this->meta( 'bloc' ) as $block ) {
switch ( $block['acf_fc_layout'] ) {
case 'slider':
// Fetch the data you need for each slider.
$block['my_slider_data'] = 'something';
break;
}
$blocks[ $block ];
}
return $blocks;
}
}
然后,不要在PHP模板中使用Timber\Post()
,而是使用新类:
$context = Timber::get_context();
$context['post'] = ( is_front_page() )
? new PostFlexible( get_option( 'page_on_front' ) )
: new PostFlexible();
Timber::render( 'page.twig', $context );
在您的细枝模板中,您可以调用执行以下操作的方法:
{{ post.dynamic_context }}
问题是,你到底想做什么?您可以在该方法中呈现或编译另一个细枝模板。您可以在PHP的新方法中获取该模板所需的数据,然后将这些数据传递给Twig模板。这是一种方法
另一种方法是使用此方法在灵活字段上循环,并扩展细枝模板中所需的数据:
{% for bloc in post.blocks %}
{% include 'blocs/' ~ bloc.acf_fc_layout ~ '.twig' ignore missing %}
{% endfor %}
现在,您可以这样定义post.blocks
:
class PostFlexible extends Timber\Post {
public function dynamic_context( $args ) {
return $something;
}
}
class PostFlexible extends Timber\Post {
public function blocks() {
$blocks = array();
foreach ( $this->meta( 'bloc' ) as $block ) {
switch ( $block['acf_fc_layout'] ) {
case 'slider':
// Fetch the data you need for each slider.
$block['my_slider_data'] = 'something';
break;
}
$blocks[ $block ];
}
return $blocks;
}
}
该方法获取元数据,在灵活的字段中循环,并根据布局名称添加所需的数据(acf\u fc\u layout
)。这样,您仍然可以在PHP中定义大部分逻辑,而在Twig中,您将只显示数据