0

我在帖子 [shortcode] 中有一个简码。我希望能够在短代码中访问当前帖子的标题,但$context为空白有没有办法post从通过短代码呈现的树枝中访问?

这是示例代码:

add_shortcode('include', 'timber_partial_shortcode');

function timber_partial_shortcode($atts){
    $post = new TimberPost()
    $context['post'] = $post
    $name = sanitize_text_field($atts['name']);
    return Timber::compile('partials/' . $name . '.twig', $context);
}

这暂时有效,但我想知道是否有一种方法可以访问已设置的树枝文件中的 TimberPost 而不是重置它。如果我想要 $context 中的变量,则会Timber::getContext()引发未定义的函数错误在短代码中。

4

2 回答 2

3

@damon 试试Timber::get_context();:)

于 2016-09-06T22:36:03.680 回答
2

我看了一下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 );
    }
}
于 2016-09-07T18:49:56.013 回答