Деревянный контекстный фильтр внутри функции 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.