使用Timber

时间:2019-06-07 16:43:00

标签: wordpress twig shortcode rating timber

我将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 :(得分:0)

Joshua T在上面的评论中提供的答案应该起作用,它使用细枝的字符串连接运算符~将正确的字符串输入do_shortcode函数中。

如果您有兴趣进一步学习并了解更多有关Timber的信息,那么这里有几种方法。

木材对此有一些指导,您可以在the official documentation.上查看

首先,所有简码都是输出函数的包装器-注册简码时,您告诉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模板中,通过将类名作为第二个参数传递给get_posts(),告诉Timber使用该类而不是默认类。

$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),您就会获得与您的帖子类型相匹配的自定义帖子类。.一旦开始使用它,那就太神奇了!