如何将帖子ID传递到诸如edit_post_link之类的Twig / Timber函数?
在https://timber.github.io/docs/guides/functions/#function-with-arguments上阅读文档
诸如edit_post_link之类的功能将尝试猜测帖子的ID 您想从The Loop中的当前帖子进行编辑。相同的功能 需要对诸如archive.twig或index.twig之类的文件进行一些修改。 在那里,您需要显式传递帖子ID。
这就是发生的情况;当我使用这个
{{ function('edit_post_link', 'Edit', '<span class="edit-link">', '</span>', post.ID) }}
在index.twig
中,所有编辑链接都具有显示自定义帖子类型循环的页面的帖子ID,而不是循环中每种自定义帖子类型的帖子ID。
我正在使用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
上的基本循环。 “人物”是标准的WordPress自定义帖子类型:
{% 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 %}
这将导致指向该页面的所有编辑链接,而不是每个自定义帖子类型为“人员”。
那我怎么称呼帖子ID?我需要在自定义帖子类型功能中调用帖子ID吗?
主要的index.php文件具有标准的Twig功能:
$context = Timber::get_context();
$context['posts'] = Timber::get_posts();
$templates = array( 'index.twig' );
Timber::render( $templates, $context );
答案 0 :(得分:1)
在Twig 2.x documentation中,默认情况下没有{{ function }}
Twig函数。在使用Symfony的这些年中,我当然从未见过这种情况,所以我怀疑这是自定义的吗?
我刚刚在Google上搜索了“木材/树枝”,实际上这是一个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暴露给它的变量。
答案 1 :(得分:1)
那我怎么称呼帖子ID?
如果people
模板中循环中的index.twig
是帖子数组(即每个帖子都是WP_Post
/ Timber\Post
实例),则您可以(或应该能够)通过person.ID
或 person.id
来检索帖子ID(是的,两者实际上是{ {3}})。因此这些对我来说效果很好:
{{ function('edit_post_link', 'Edit', '<span class="edit-link">', '</span>', person.id) }}
{{ function('edit_post_link', 'Edit', '<span class="edit-link">', '</span>', person.ID) }}
我如何确认以上
我安装并激活了set。
我创建了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()
被正确调用,并在标记中显示带有target="_blank"
的帖子链接。 (我将newwindow_edit_post_link
放在functions.php
中)
答案 2 :(得分:1)
这很丑陋,但是如果无法使edit_post_link
函数在template.twig中工作,而{{ person.id }}
确实可以工作,则可以在嫩枝模板中使用此设置。
它确定用户是否已登录并可以进行编辑,如果可以,则显示一个编辑链接-动态为{{ 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 %}