将 post ID 传递给 Twig/Timber 函数

Passing a post ID to a Twig/Timber function

如何将 post ID 传递给像 edit_post_link 这样的 Twig/Timber 函数?

正在 https://timber.github.io/docs/guides/functions/#function-with-arguments

阅读文档

A function like edit_post_link will try to guess the ID of the post you want to edit from the current post in The Loop. the same function requires some modification in a file like archive.twig or index.twig. There, you will need to explicitly pass the post ID.

事情就是这样;当我使用这个

{{ function('edit_post_link', 'Edit', '<span class="edit-link">', '</span>', post.ID) }}

index.twig 中,所有编辑链接都具有显示自定义 post 类型循环的页面的 post ID,而不是每个链接的 post ID循环中的自定义 post 类型。

我在 functions.php 中使用下面的函数,它也会在编辑链接上强制使用 target="_blank"

add_filter( 'edit_post_link', 'newwindow_edit_post_link', 10, 3 );

global $post;
$post_id = $post->ID;

    function newwindow_edit_post_link( $link, $post_id, $text ) {
        if( !is_admin() )
            $link = str_replace( '<a ', '<a target="_blank" ', $link );
        return $link;
    }

这是 index.twig 上的基本循环。 "people" 是标准的 WordPress 自定义 post 类型:

 {% if people %}

            {% for person in people %}

                    <a href="{{ person.link }}">{{ person.name }}</a>

                        {{ function('edit_post_link', 'Edit', '<span class="edit-link">', '</span>', post.ID) }}

            {% endfor %}

    {% else %}

 {% endif %}

这导致所有编辑链接都指向该页面,而不是每个自定义 post 类型 "person."

那么如何调用 post ID?我需要在自定义 Post 类型函数中调用 post ID 吗?

主 index.php 文件具有标准的 Twig 函数:

$context = Timber::get_context();
$context['posts'] = Timber::get_posts();
$templates = array( 'index.twig' );
Timber::render( $templates, $context );

查看 Twig 2.x documentation 默认情况下没有 {{ function }} Twig 函数。在我使用 Symfony 的这些年里,我当然从未见过这种情况,所以我怀疑这是习俗?

我刚刚用 Google 搜索了 "timber/twig",这实际上是一个 WordPress 插件,可以在您的主题模板上提供 Twig 功能,因此我相信您已经在上面添加了 Symfony 标签你的问题是错误的。我建议删除它并添加 wordpress,这样你就可以吸引比我更有用的答案。


我们需要查看您的自定义 edit_post_link Twig 函数的 PHP 源代码以确保安全。然而,看起来您只需要在 PHP 端和 Twig 端以相同的顺序映射您的参数。例如,如果您的函数是:

function edit_post_link(string $label, string $openingHtml, string $closingHtml, int $postId) {
    // blah blah blah
}

在你用 Twig 注册这个函数之后(尽管 Timber 似乎声称你可能不需要这样做,请检查)你真的会完全按照你写的那样使用它:

{{ function('edit_post_link', 'Edit', '<span class="edit-link">', '</span>', post.ID) }}

我感觉这可能不是您想要的,您可能想知道您最初是如何抓住 post.ID 的。如果是这种情况,那么您的问题与 {{ function }} 无关,我们需要查看更多您的 Twig 模板源以及您从 PHP.[=18 中暴露给它的变量=]

So how do I call the post ID?

如果 index.twig 模板循环中的 people 是一个 post 数组(即每个 post 是一个 WP_Post / Timber\Post 实例),那么您可以(或者 应该 能够)通过 person.ID 或 [=48] 检索 post ID =] person.id(是的,两者实际上都是set)。所以这些对我来说效果很好:

{{ function('edit_post_link', 'Edit', '<span class="edit-link">', '</span>', person.id) }}
{{ function('edit_post_link', 'Edit', '<span class="edit-link">', '</span>', person.ID) }}

我是如何确认以上内容的

  1. 我安装并激活了official Timber starter theme

  2. 我创建了front-page.php:

    <?php
    $context = Timber::get_context();
    
    // Here, I defined the `people`.
    $context['people'] = Timber::get_posts( [
        'post_type'      => 'post', // yours would be 'person' and not 'post'
        'posts_per_page' => 3,
    ] );
    
    // This I used for testing only.
    $context['post'] = new Timber\Post();
    
    $templates = array( 'front-page.twig' );
    Timber::render( $templates, $context );
    
  3. 然后我创建了templates/front-page.twig:

    {% extends "base.twig" %}
    
    {% block content %}
        <h2>The queried page's title: {{ post.title }}</h2>
        <p>The queried page's ID: <b>{{ post.id }}</b></p>
        {% if people %}
    
            {% for person in people %}
    
            <a href="{{ person.link }}">{{ person.name }}</a>
    
            {{ function('edit_post_link', 'Edit', '<span class="edit-link">', '</span>', person.id) }}<br>
    
            {% endfor %}
    
        {% else %}
    
        {% endif %}
    
        {% include 'partial/pagination.twig' with { pagination: posts.pagination({show_all: false, mid_size: 3, end_size: 2}) } %}
    {% endblock %}
    

一切对我来说都很好——edit_post_link() 被正确调用并在标记中显示 post link 和 target="_blank"。 (我把 newwindow_edit_post_link 的东西放在 functions.php 里)

这很丑陋,但是如果你不能让 edit_post_link 函数在 template.twig 中工作,而 {{ person.id }} 确实有效,你可以在你的树枝中使用这个设置模板。

它确定用户是否已登录并且可以编辑,如果是,则显示编辑 link - 动态 {{ person.id }} - 在新选项卡中打开:

{% if user %}
<a class="style-me" target="_blank"
href="{{ site.url }}/wp-admin/post.php?post={{ person.id }}&action=edit">Edit</a>
{% endif %}