标签: timber

Twig_Error_Syntax for "Unknown filter" 与 Timber 中的 Twig 过滤器

这必须很简单,但我看不出有什么问题。我正在使用https://twig.symfony.com/doc/1.x/advanced.html#filters上的简单过滤器示例和 Twig 1.34 in Timber,一个 WordPress 插件。

我加了

// an anonymous function
$filter = new Twig_SimpleFilter('rot13', function ($string) {
    return str_rot13($string);
});
Run Code Online (Sandbox Code Playgroud)

$twig = new Twig_Environment($loader);
$twig->addFilter($filter);
Run Code Online (Sandbox Code Playgroud)

到我的主题的functions.php 文件。

但是{{ 'Twig'|rot13 }}在我的 view.twig 文件中使用会出现致命错误

PHP Fatal error:  Uncaught exception 'Twig_Error_Syntax'
with message 'Unknown "rot13" filter' in view.twig
Run Code Online (Sandbox Code Playgroud)

和通知

Undefined variable: loader in functions.php
Run Code Online (Sandbox Code Playgroud)

使用类似的过滤器{{ 'Twig'|lower }}可以正常工作。

我是否需要以不同的方式将函数添加到 functions.php?

php wordpress twig timber

5
推荐指数
1
解决办法
3880
查看次数

在WordPress中逃避Twig/Timber的要求

我正在使用Twig模板系统以及WordPress中的Timber插件,Timber页面关于转义的一件事就是:

默认情况下,Timber不会转义标准标记的输出(即{{post.field}}).如果要启用autoescape行为,只需将这些行添加到functions.php:

https://timber.github.io/docs/guides/escapers/

这是否意味着如果我打开它我不需要做任何逃避?不适用于html正文,属性,网址等?

另外,如果我打开它,这是否意味着建议做这样的事情:

<nav role="navigation">
    <ul class="main-nav">
        {% for item in menu.get_items %}
            <li class="{{ fn('esc_attr', (item.classes | join(' '))) }}">
                <a href="{{ item.get_link|e('esc_url') }}">{{ item.title|e }}</a>

                {% if item.children %}

                    <ul class="sub-menu">

                        {% for child in item.children %}

                            <li class="sub-menu-item">
                                <a href="{{ child.get_link|e('esc_url') }}">{{ child.title|e }}</a>
                            </li>

                        {% endfor %}

                    </ul>

                {% endif %}

            </li>
        {% endfor %}
    </ul>
</nav>
Run Code Online (Sandbox Code Playgroud)

我以前习惯fn('esc_attr', item.classes)使用WordPress escaper,esc_attr因为看起来Timber没有属性的转义,Twig版本没有添加到1.9,但看起来Timber在1.35.2上.

自动转义有什么缺点吗?在我看来,除非你计划不逃避一切,否则我不会这样做?... |raw如果你不想要逃脱的话,你可以随时使用我会假设的吗?

php wordpress sanitization twig timber

5
推荐指数
1
解决办法
339
查看次数

木材分页

我正在使用 Timber,目前正在尝试按照Timber 文档进行分页,但到目前为止,没有成功。以下是我的自定义存档 php 文件:

global $paged;
if (!isset($paged) || !$paged){
    $paged = 1;
}
$context = Timber::get_context();
$args = array(
    'post_type' => 'product',
    'posts_per_page' => 2,
    'paged' => $paged,
);
$context['subCatItems'] = new Timber\PostQuery($args);

Timber::render('archive-product.twig', $context);
Run Code Online (Sandbox Code Playgroud)

以及我对应的 Twig 文件:

<div class="l-container vert-push--small vert-push--adult--medium">
    {% for post in posts %}
        <div class="c-std">{{ post.title }}</div>
    {% endfor %}
</div>

<div class="tool-pagination c-std">
    {% if posts.pagination.prev %}
        <a href="{{posts.pagination.prev.link}}" class="prev {{posts.pagination.prev.link|length ? '' : 'invisible'}}">Prev</a>
    {% endif %}
    <ul class="pages"> …
Run Code Online (Sandbox Code Playgroud)

wordpress twig timber

4
推荐指数
1
解决办法
6612
查看次数

WordPress +具有自定义主题+路由的木材-404页面未呈现

我正在使用TimberTwig创建自定义WordPress主题,并且很难呈现我的自定义404页面。

最初,我网站上的每个页面都在中定义了自定义路由,functions.php而我的404逻辑在中index.php。这可能不是实现此目的的最佳方法,但这是我可以使其正常工作的唯一方法-我在Timber文档中找不到有关创建具有自定义主题的404页的很多信息。

index.php

<?php
$context = Timber::get_context();
$post = new TimberPost();
$context['page'] = $post;
global $wp;
$url = home_url($wp->request);
$context['url'] = preg_replace('#^https?://#', '', rtrim($url, '/'));

Timber::render('views/pages/404.twig', $context);
Run Code Online (Sandbox Code Playgroud)

在我需要添加通配符路由之前,这种方法非常有效,以便客户端可以自己添加新页面而无需要求我们添加新路由。我为页面添加了此通配符路由至functions.php

Routes::map('/:page', function($params) {
Routes::load('routes/page.php', $params, null, 200);
});
Run Code Online (Sandbox Code Playgroud)

通配符路由按预期工作,但是现在我上面的404逻辑不再起作用。当我访问的URL不是在WordPress管理员中创建的页面时,它会将我发送到其中包含随机帖子内容的页面。我对如何使其正常工作有些困惑,很可能我最初的404逻辑不是正确的处理方式。任何建议都很好。

我尝试404.php使用以下代码将添加到主题文件夹:

<?php
$context = Timber::get_context();

Timber::render( array(
'views/pages/404.twig'
), $context );
Run Code Online (Sandbox Code Playgroud)

不幸的是,这没有用-我的网站使用随机URL呈现随机帖子的内容而不是404.twig文件。

php wordpress routing timber

4
推荐指数
1
解决办法
525
查看次数

木材:从另一个页面访问高级自定义字段

我正在尝试从另一个页面访问 ACF 数据,以便使用 Timber (Twig) 在另一个页面上显示。

ACF 名称the_unstrung_hero位于“关于”页面(id = 7)中。

页面-home.php:

<?php
$context = Timber::get_context();
$post = new TimberPost();
$about_page_id = 7;
$about = new TimberPost($about_page_id);
$about->acf = get_field_objects($about->ID);
$context['post'] = $post;
Timber::render( array( 'page-' . $post->post_name . '.twig', 'page.twig' ), $context );
Run Code Online (Sandbox Code Playgroud)

在 page-home.twig 中:

<p>{{ acf.the_unstrung_hero|print_r }}</p>
Run Code Online (Sandbox Code Playgroud)

这只是许多人的最后一次组合尝试。坦率地说,我只是没有得到一些东西(PHP 不是我的强项)...您的帮助将不胜感激。

php wordpress twig timber

3
推荐指数
1
解决办法
2833
查看次数

Timber(Twig)如何调用wordpress函数

在Timber中就是这个功能

{{post}}
Run Code Online (Sandbox Code Playgroud)

你得到的东西

{{post.post_title}}
Run Code Online (Sandbox Code Playgroud)

但是WordPress中还有其他功能

get_the_permalink();
Run Code Online (Sandbox Code Playgroud)

无法从post.get_the_permalink或post.get_permalink访问

这些是我可以访问的变量

  • ID
  • post_author
  • 发布日期
  • post_date_gmt
  • POST_CONTENT
  • 帖子标题
  • post_excerpt
  • post_status
  • comment_status
  • ping_status
  • post_password
  • POST_NAME
  • to_ping
  • ping通
  • post_modified
  • post_modified_gmt
  • post_content_filtered
  • post_parent
  • GUID
  • menu_order
  • post_type
  • post_mime_type
  • COMMENT_COUNT
  • 过滤

正如这个Timber文档描述的那样有行动[Timber Doc],但你必须在functions.php文件中定义每个函数...这意味着我必须从php创建每个已经存在的函数并将其"重定向"到wordpress功能.然后将其绑定到Twig.

还有一种方法,你可以在这里看到现在弃用

php wordpress twig twig-extension timber

3
推荐指数
2
解决办法
6825
查看次数

木材 - 列出类别及其帖子

我有一个带有自定义分类法(“vehicles_category”)的 CPT(“车辆”)

我有 4 个类别(建筑、道路、废物、其他),每个类别都分配了许多职位。

我试图列出每个类别,并在下面分配给它们的帖子,所以..

Construction
     Post 1    
     Post 2     
     etc
Road
     Post 6
     Post 9
     etc
Run Code Online (Sandbox Code Playgroud)

一直在与这个作斗争。

我有这个来获取帖子...

$context['vehicles'] = Timber::get_posts([
    'order'     => 'ASC',
    'post_type' => 'vehicles',
    'posts_per_page' => -1,
    'paged' => $paged,
]);
Run Code Online (Sandbox Code Playgroud)

这是为了获取类别......

$context['categories'] = Timber::get_terms('vehicle_category');
$context['posts'] = $context['vehicles'];
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的树枝文件中有这个......

{% for category in categories %}
    {% if category.count >= 1 %}
        <li>
            <a href="{{site.url}}/vehicles/{{ category.slug }}">{{ category.title }}</a>
        </li>
    {% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

但它只输出类别,因为我缺少输出帖子的位,但我尝试的一切都不起作用。

有任何想法吗?谢谢

wordpress categories timber

3
推荐指数
1
解决办法
9798
查看次数

Timber Twig和ACF从分类页面的自定义字段中获取图像

就像标题一样,我试图从附加到分类法的自定义字段中获取图像.我目前有一个名为city的分类,这个术语可能就像新墨西哥州的Albuquerque.我用ACF创建了一个图像自定义字段('city_hero_image'),并选择了ID作为返回值.查看源代码,在src标记中它表示"未知",并且在执行print_r时它基本上返回一个空对象数组.

我的分类 - city.php是

$context['posts'] = Timber::get_posts();
$context['categories'] = Timber::get_terms('city');

$cover_image_id = get_field('city_hero_image');
$context['cover_image'] = new TimberImage($cover_image_id);
Timber::render( $templates, $context );
Run Code Online (Sandbox Code Playgroud)

在我的分类学-city.twig中我有

<img src="{{cover_image.get_url}}" class="img-responsive" alt="">
Run Code Online (Sandbox Code Playgroud)

timber

2
推荐指数
1
解决办法
4824
查看次数

调用finish()并重新启动应用程序后的木材重复日志

我的TextView上有一个onTouchListener。触摸时,我与登录,Timber.i()然后致电finish()。如果在finish()之后,我再次启动我的应用程序,然后再次单击TextView,它将记录两次,然后记录3次,依此类推...

(如果我将Timber.i()替换为普通的Log.i(),则没有问题)

// first time
Clicked

// second time
Clicked
Clicked

// etc...
Clicked
Clicked
Clicked
Run Code Online (Sandbox Code Playgroud)

木材版本:

compile 'com.jakewharton.timber:timber:4.5.1'
Run Code Online (Sandbox Code Playgroud)

工作代码:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Timber.plant(new Timber.DebugTree());

    TextView tv = (TextView) findViewById(R.id.mytextview);
    tv.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Timber.i("Clicked");
            finish();
            return false;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

版面:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.caca.test.MainActivity">

    <TextView
        android:id="@+id/mytextview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" …
Run Code Online (Sandbox Code Playgroud)

android timber

2
推荐指数
1
解决办法
660
查看次数

我应该在单个 wordpress 模板中使用 $post = Timber::query_post() 还是 $post = new TimberPost() ?

我在官方的 Timber 存储库中读到过关于使用的一般问题应该在这里发布。

我是 Timber/Twig 的新手,我有一个非常“基本”的问题。

在入门主题上,我看到在single.php传递给 $context 的 $post 变量中设置了

$post = Timber::query_post()
Run Code Online (Sandbox Code Playgroud)

page.php它设置为

$post = new TimberPost();
Run Code Online (Sandbox Code Playgroud)

那么,当我需要设置single-cpt.php 时,我应该使用什么方法呢?Timber::query_post()或者new TimberPost()

我已经尝试了它们并且它们都在工作,但是正确的方法是什么?

谢谢!

PS:我已经看到,在index.php$context['post']用的是设置new Timber\PostQuery()。这是否基本上重现了模板层次结构的标准循环?

wordpress-theming timber

2
推荐指数
1
解决办法
2080
查看次数