Поместите переменную в шорткод WordPress с Timber

Я использую Timber для WordPress и установил рейтинговый плагин (Yet Another Stars Rating plugin). Пользователи могут голосовать за фильмы.

Этот плагин использует шорткод для отображения результатов голосования и системы голосования.

У меня есть список фильмов, и я хотел бы отобразить систему голосования для каждого фильма.

Я создал свой запрос в шаблоне фильма: tpl_movies.php

$context['movies'] = Timber::get_posts(array(
    'post_type' => 'movies',
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'orderby' => 'rand',
    'order' => 'ASC'
));

И цикл в моем файле ветки: tpl_movies.twig

{% for item in movies %}
  <ul class="movies__list">
    <li>{{ item.title }} - Vote : {% filter shortcodes %} [yasr_overall_rating postid="{{ item.ID }}"] {% endfilter %}</li>
  </ul>
{% endfor %}

Я попытался поместить {{ item.ID }} в свой шорткод:

[yasr_overall_rating postid="{{ item.ID }}"]

Но это не работает.

Я могу голосовать за текущую страницу (у которой отображается список фильмов), но не за каждый фильм.

Есть ли у вас какие-либо идеи ? Заранее спасибо.


person Jandon    schedule 07.06.2019    source источник
comment
Вы пробовали этот синтаксис? Я думаю, что с таким синтаксисом это будет <li>{{ item.title }} - Vote : {{ function('do_shortcode', '[yasr_overall_rating postid=' ~ item.ID ~ ']') }}</li>   -  person Joshua T    schedule 08.06.2019
comment
Спасибо за ваш ответ @JoshuaT. Я попробую сегодня, и я дам вам обратную связь   -  person Jandon    schedule 11.06.2019


Ответы (1)


Ответ, предоставленный Джошуа Т в комментариях выше, должен работать, он использует оператор конкатенации строк 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