将帖子ID传递到树枝/木材功能

时间:2018-10-24 17:10:56

标签: php wordpress function twig timber

如何将帖子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 );

3 个答案:

答案 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) }}

我如何确认以上

  1. 我安装并激活了set

  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()被正确调用,并在标记中显示带有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 %}