木材上下文过滤器内部add_shortcode函数

时间:2018-02-06 11:20:51

标签: wordpress timber

我一直试图通过增加短码功能来获取木材背景,但它似乎没有用。

我的代码是        add_action(' init',数组($ this,' create_shortcodes'));

public function create_shortcodes() {
  add_shortcode( 'social_media', array($this, 'social_shortcode') );
}

public function social_shortcode($atts) {
  $params = shortcode_atts(array(
    'id' => 0
  ), $atts);


  $data = Helpers::create_social_media( $atts['id'], false, true );

  add_filter( 'timber_context', array($this, 'add_to_context_social_media'), 11 );

  return \Timber\Timber::compile('social-media.twig', array('data' => $data['content'] ));
}

public function add_to_context_social_media($context) {
    echo '<pre style="margin:200px">';
  print_r($context);
  echo '</pre>';

  return $context;
}

如果我在create_shortcodes函数中添加过滤器,它可以工作,但它不在add_shortcode函数中,它也在create_shortcodes函数中。

任何帮助将不胜感激。 感谢

2 个答案:

答案 0 :(得分:0)

渲染返回的输出而不是在短代码中渲染它会更好吗?

$returned_shortcode = do_shortcode('[your_shortcode]');

return \Timber\Timber::compile('social-media.twig', array('data' => $returned_shortcode ));

答案 1 :(得分:0)

使用此行

add_filter( 'timber_context', array($this, 'add_to_context_social_media'), 11 );

然后,您需要调用Timber::get_context()才能应用过滤器。但是,对Timber::get_context()的调用会被缓存。这意味着,如果您想使用timber_context过滤器,则必须在第一次调用Timber::get_context()之前添加它。如果您想在短代码中使用它,您可能已经在显示帖子内容的单个或归档PHP模板中调用了Timber::get_context()

我想您可以为您的 social-media.twig 模板建立数据上下文,如下所示:

public function social_shortcode($atts) {
    $params = shortcode_atts(array(
        'id' => 0
    ), $atts);

    // Get cached context.
    $context = Timber::get_context();

    // Add to context.
    $context['data'] = Helpers::create_social_media(
        $atts['id'],
        false,
        true
    );

    return \Timber\Timber::compile( 'social-media.twig', $context );
}

除了自定义data,您还将在Twig文件中使用全局上下文。