将 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) }}
我是如何确认以上内容的
我安装并激活了official Timber starter theme。
我创建了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 );
然后我创建了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 %}
如何将 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) }}
我是如何确认以上内容的
我安装并激活了official Timber starter theme。
我创建了
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 );
然后我创建了
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 %}