Ответ, предоставленный Джошуа Т в комментариях выше, должен работать, он использует оператор конкатенации строк ветки ~
для подачи правильной строки в функцию do_shortcode
.
Если вам интересно углубиться и узнать больше о Timber, у вас есть пара методов.
У лесоматериалов есть некоторые рекомендации по этому вопросу, которые вы можете проверить в официальной документации.
Во-первых, все шорткоды являются оберткой для функции вывода - когда вы регистрируете шорткод, вы сообщаете WordPress, что это за функция вывода.
Для этого сценария это shortcode_overall_rating_callback()
, и он ожидает массив $atts
, как и все шорткоды.
чтобы ты мог сделать что-то подобное ...
{# call the function directly from the twig template #}
{% for item in movies %}
<ul class="movies__list">
<li>{{ item.title }} - Vote : {{ function('shortcode_overall_rating_callback', { postid: item.id }) }}</li>
</ul>
{% endfor %}
Если у каждого фильма есть рейтинг, то вы можете посмотреть на расширение его «модели» для охвата этой функциональности.
Концептуально, это хорошо, так как каждый фильм может выводить свой собственный рейтинг в любом месте, где вы их выбираете, а не привязывать его только к одному шаблону, который вы пишете.
Чтобы сделать это, вы продлили бы Timber\Post
и получили бы фильмы в качестве этой пользовательской модели Post вместо обычной Timber\Post
.
/* Somewhere in your theme, ensure it gets loaded, inc/models/Movie.php as an example */
<?php
namespace YourName\YourProject;
use \Timber\Post;
class Movie extends Post {
public function get_rating_html(){
if ( ! function_exists( 'shortcode_overall_rating_callback' ) ) return '';
/* Can add other attributes to the array provided here */
return shortcode_overall_rating_callback( [ 'postid' => $this->id, ] );
}
}
Затем в своем PHP-шаблоне для построения контекста вы указываете Timber использовать этот класс вместо стандартного, передавая имя класса в качестве второго аргумента get_posts()
.
$queryArgs = [
'post_type' => 'movies',
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'rand',
'order' => 'ASC'
];
$context['movies'] = Timber::get_posts( $queryArgs, \YourName\YourProject\Movie::class );
Наконец, в нашем шаблоне ветки мы можем получить доступ к пользовательскому методу ..
{% for item in movies %}
<ul class="movies__list">
<li>{{ item.title }} - Vote : {{ item.get_rating_html }}</li>
</ul>
{% endfor %}
В этих примерах действительно используются некоторые вещи, такие как пространства имен и современный синтаксис PHP, но если вы используете Timber, вы уже используете версию PHP, которая поддерживает это.
Наконец, если вы часто используете пользовательские объекты Post, у Timber есть отличный фильтр под названием Timber\PostClassMap
, где вы можете добавлять свои собственные сопоставления для каждого типа записи, поэтому вам не нужно каждый раз указывать имя пользовательского класса записи и можете просто new PostQuery( $args );
или Timber::get_posts($args)
и вы получите пользовательские классы сообщений, соответствующие вашему типу сообщений ... это волшебство, как только вы начнете его использовать!