Ответ, предоставленный Джошуа Т в комментариях выше, должен работать, он использует оператор конкатенации строк twig ~
для подачи правильной строки в функцию do_shortcode
.
Если вы хотите углубиться и узнать больше о Timber, то у вас есть пара методов.
У 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)
и вы получите обратно пользовательские классы сообщений, соответствующие вашему типу сообщений.. это волшебство, как только вы начнете его использовать!
person
aj-adl
schedule
12.06.2019
<li>{{ item.title }} - Vote : {{ function('do_shortcode', '[yasr_overall_rating postid=' ~ item.ID ~ ']') }}</li>
- person Joshua T   schedule 08.06.2019