Поместите переменную в шорткод WordPress с помощью Timber - PullRequest
0 голосов
/ 07 июня 2019

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

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

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

Я создал свой запрос в шаблоне фильма: 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 }}"]

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

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

У вас есть идеи? Заранее спасибо.

1 Ответ

0 голосов
/ 12 июня 2019

Ответ, предоставленный Джошуа Т в комментариях выше, должен работать, он использует оператор конкатенации строк ветки ~ для подачи правильной строки в функцию 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) и вы получите пользовательские классы сообщений, соответствующие вашему типу сообщений ... это волшебство, как только вы начнете его использовать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...