Передача идентификатора сообщения в функцию Twig / Timber - PullRequest
0 голосов
/ 24 октября 2018

Как передать идентификатор сообщения в функцию Twig / Timber, например edit_post_link?

Чтение документов в https://timber.github.io/docs/guides/functions/#function-with-arguments

Функция типа edit_post_link попытается угадатьИдентификатор поста, который вы хотите отредактировать из текущего поста в Цикле.эта же функция требует некоторой модификации в файле, например archive.twig или index.twig.Там вам нужно будет явно передать идентификатор сообщения.

И вот что происходит;когда я использую это

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

в index.twig, все ссылки редактирования имеют идентификатор поста страницы, который отображает цикл пользовательских типов постов, а не идентификатор поста каждого из них.Пользовательский тип записи, который находится в цикле.

Я использую функцию ниже в файле 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:

 {% 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 %}

, что приводит ко всем ссылкам редактирования, указывающим на эту страницу, а не к каждому пользовательскому типу записи "person".

Так какпозвонить по идентификатору записи?Нужно ли вызывать идентификатор записи в пользовательской функции типа сообщения?

Основной файл index.php имеет стандартные функции Twig:

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

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Так как мне назвать идентификатор сообщения?

Если people в цикле в вашем шаблоне index.twig представляет собой массив сообщений (т.е. каждое сообщение является WP_Post / Timber\Post экземпляр), то вы можете (или должен быть в состоянии) получить идентификатор сообщения с помощью person.ID или person.id (да, оба на самом деле установлено ).Так что у меня это хорошо сработало:

{{ 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. Я установил и активировал официальный стартер Timberтема .

  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)

0 голосов
/ 01 ноября 2018

Это ужасно, но если вы не можете заставить функцию 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 %}
0 голосов
/ 24 октября 2018

Глядя на документацию Twig 2.x , по умолчанию нет функции {{ function }} Twig.Я, конечно, никогда не видел этого за годы использования Symfony, поэтому я подозреваю, что это что-то особенное?

Я только что прогуглил "timber / twig", и это на самом деле плагин WordPress для обеспечения функциональности Twig в ваших шаблонах тем, поэтому я считаю, что вы добавили тег Symfony на свойвопрос по ошибке.Я бы предложил удалить это и добавить wordpress вместо этого, чтобы вы могли получать ответы, более полезные, чем мои.


Нам нужно было бы увидеть исходный код PHP для вашей пользовательской функции edit_post_link Twig.для гарантии.Однако может показаться, что вам просто необходимо отобразить в ваших аргументах один и тот же порядок как на стороне 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...