我看了一下get_context()
函数。
- 如果你调用
get_context()
,所有在上下文中设置的值都会被缓存。
- 每当您
get_context()
再次调用时,它只会返回缓存的上下文。
get_context()
这意味着,在您第一次调用后,您无法将新值添加到上下文中,例如通过timber/context
过滤器。
我认为Jared 的回答实际上非常中肯。由于他是 Timber 的创造者,我想他必须知道 ;)。
但是,既然您询问了如何在短代码和 Timber 的上下文中将值从外部传递给函数,我将尝试向您展示您拥有的一些选项:
使用匿名函数
在您的模板文件中,您可以添加带有匿名函数的短代码作为回调(第二个参数)。这样,您可以利用use
关键字,您可以使用该关键字传入$context
之前定义的内容。
<?php
use Timber\Timber;
$context = Timber::get_context();
$post = Timber::get_post();
$context['post'] = $post;
// Add shortcode with an anonymous function
add_shortcode( 'include', function( $atts ) use ( $context ) {
$name = sanitize_text_field( $atts['name'] );
return Timber::compile( 'partials/' . $name . '.twig', $context );
} );
Timber::render( 'shortcodes.twig', $context );
但是,如果您在多个模板文件中使用该短代码,您可能不想每次都添加该功能。让我们看看我们能做些什么:
创建过滤器以传递上下文
模板文件(例如post.php)
<?php
use Timber\Timber;
$context = Timber::get_context();
$post = Timber::get_post();
$context['post'] = $post;
set_context_for_shortcodes( $context );
Timber::render( 'shortcodes.twig', $context );
函数.php
/**
* Add a filter that simply returns the context passed to this function.
*
* @param $context
*/
function set_context_for_shortcodes( $context ) {
add_filter( 'get_context', function( $empty = array() ) use ( $context ) {
return $context;
} );
}
add_shortcode( 'include', function( $atts ) {
// Get the context trough the filter set before
$context = apply_filters( 'get_context', [] );
$name = sanitize_text_field( $atts['name'] );
return Timber::compile( 'partials/' . $name . '.twig', $context );
} );
但是,请注意,当您将匿名函数与操作和过滤器一起使用时,您以后无法使用remove_action()
或remove_filter()
删除它们。因此,当您开发要发布的插件或主题时,您可能会重新考虑这一点。否则,你可能很高兴。
使用类处理简码
您还有另一种选择,它不依赖于过滤器,而是依赖于处理您的简码的类。
模板文件(例如post.php)
<?php
use Timber\Timber;
$context = Timber::get_context();
$post = Timber::get_post();
$context['post'] = $post;
new Shortcode_Handler( $context );
Timber::render( 'shortcodes.twig', $context );
函数.php
<?php
class Shortcode_Handler {
public $context;
public function __construct( $context ) {
$this->context = $context;
add_shortcode( 'include', array( $this, 'timber_partial_shortcode' ) );
}
public function timber_partial_shortcode( $atts ) {
$context = $this->context;
$name = sanitize_text_field( $atts['name'] );
return Timber::compile( 'partials/' . $name . '.twig', $context );
}
}