Деревянный контекстный фильтр внутри функции add_shortcode

Я пытался получить доступ к контексту древесины в функцию добавления шорткода, но это не похоже на работу.

Мой код add_action( 'init', array($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.

Любая помощь будет оценена. Спасибо

1 ответ

Будет ли лучше сделать возвращенный результат вместо того, чтобы отображать его внутри шорткода?

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

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

Когда вы используете эту строку

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

Тогда вам нужно будет позвонить Timber::get_context() для фильтра, который будет применен. Тем не менее, звонки Timber::get_context() кэшируются Это означает, что если вы хотите использовать timber_context фильтр, вам нужно будет добавить его до вашего первого вызова Timber::get_context(), Если вы хотите использовать это в шорткоде, вы, вероятно, уже звоните Timber::get_context() в единственном или архивном шаблоне PHP, который отображает содержание сообщения.

Я думаю, вы могли бы создать контекст данных для вашего шаблона 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.

Другие вопросы по тегам