Передача идентификатора поста в функцию Twig / Timber

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

Чтение документов на 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 все ссылки редактирования имеют идентификатор публикации страницы, на которой отображается цикл настраиваемых типов сообщений, а не идентификатор сообщения каждого настраиваемого типа сообщения, находящегося в цикле.

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

В результате все ссылки редактирования указывают на эту страницу, а не на каждый пользовательский тип сообщения «человек».

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

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

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

Если person является объектом сообщения (WP_Post), попробуйте person.ID вместо post.ID.

Sally CJ 26.10.2018 20:33

Хм ... но нет, это не сработает.

BlueDogRanch 26.10.2018 21:22

Как вы определяете index.php в people? Можешь показать код?

Sally CJ 27.10.2018 01:56

Я добавил index.php, но это стандартная функция Twig. Человек CPT - это стандартный CPT WordPress.

BlueDogRanch 27.10.2018 03:47

Я имел в виду, разве у вашего $context нет people ($context['people'])? Если да, то где это определяется? Если нет, то откуда здесь people? Может, вы сможете показать полный код в вашем файле index.twig? Или временно добавьте {{ fn( 'var_dump', person ) }} в ваш цикл for и поделитесь выводом.

Sally CJ 27.10.2018 19:24

Интересно; использование {{ dump(person) }} показало мне идентификатор, а использование {{ person.id }} отображает идентификатор в index.twig. Но это должен быть идентификатор в нижнем регистре, а не идентификатор. Но вся функция по-прежнему не работает.

BlueDogRanch 29.10.2018 03:17

Я могу протестировать ваш код, но мне нужно посмотреть, как определяется people. Или это что-то вроде get_posts( 'post_type=person' )? А под «функцией» вы имеете в виду newwindow_edit_post_link(), верно?

Sally CJ 29.10.2018 03:23

Извините, я имею в виду, это {{ function('edit_post_link', ...) }} не работает, и если да, то как он не работает? Нет вывода, не ожидаемый результат, или?

Sally CJ 29.10.2018 03:30

Нет вывода на {{ function('edit_post_link', ...) }}

BlueDogRanch 29.10.2018 03:37

Попробуйте {{ function( 'get_edit_post_link', person.id ) }}, просто чтобы посмотреть, приведет ли это к правильному выводу.

Sally CJ 29.10.2018 03:49

В качестве альтернативы, как говорит документация, сделайте edit_post_link доступным в Twig, используя Timber\Twig_Function внутри ловушки timber/twig. И используйте {{ edit_post_link(...) }}. Если это все еще не работает, возможно, проблема в person.id.

Sally CJ 29.10.2018 04:00

То, что находится в документации Twig, не работает. {{ function( 'get_edit_post_link', person.id ) }} не выводит сигнал. {{ person.id }} действительно работает, поэтому я сделал ссылку для ручного редактирования, используя {% if user %} для входа в систему.

BlueDogRanch 29.10.2018 04:38

Не уверен, что не так в вашем случае, но я проверил ваш код (хотя я использовал front-page.php), и у меня все сработало.

Sally CJ 29.10.2018 07:53

Но, конечно, edit_post_link() не вернет никаких результатов, если текущий пользователь не имеет прав на редактирование сообщения.

Sally CJ 29.10.2018 08:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
14
5 003
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Я только что погуглил «древесина / веточка», и на самом деле это плагин 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 (хотя Тимбер, похоже, утверждает, что вам, возможно, не нужно этого делать, проверьте), вы действительно будете использовать ее точно так, как вы написали:

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

Я чувствую, что это может быть не то, что вы имеете в виду, возможно, вам интересно, как вы вообще ухватились за post.ID. Если это так, то ваша проблема не в {{ function }}, и нам нужно будет увидеть больше из вашего источника шаблона Twig вместе с переменными, которые вы открыли для него из PHP.

Спасибо, я по ошибке пометил Симфонию. И у меня нет функции edit_post_link в functions.php Похоже, мне нужна функция, которая будет получать идентификатор сообщения?

BlueDogRanch 24.10.2018 20:50

Если у вас нет функции PHP, зарегистрированной в Twig с псевдонимом edit_post_link, я подозреваю, что Twig выдаст это как исключение. Выполните поиск по запросу "edit_post_link", чтобы убедиться, что вы еще не зарегистрировали этот псевдоним для неправильной функции по ошибке.

Adambean 24.10.2018 20:54

Ах, у меня есть фильтр, который заставляет target = "_ blank"; добавил к моему вопросу. Ты прав; должно быть поэтому я не получаю фатальных ошибок. Так имеет ли смысл добавлять идентификатор сообщения к этой функции?

BlueDogRanch 24.10.2018 21:47

Да, вашему фильтру "edit_post_link" потребуется аргумент для получения идентификатора сообщения. Неважно, какой аргумент он предоставляет, использование вашего внешнего интерфейса Twig соответствует порядку.

Adambean 24.10.2018 21:55

Хорошо, но теперь я не знаю, как это сделать. Похоже, мне нужен глобальный $ post; $ post_id = $ post-> ID; чтобы получить идентификатор для каждого сообщения вне цикла.

BlueDogRanch 24.10.2018 22:10

Да, хотя это проблема WordPress, и на этом мой опыт заканчивается. (Кажется, с вашим Twig все в порядке.) Нет ли функции PHP, такой как the_post(), для получения этой информации?

Adambean 25.10.2018 11:05
Ответ принят как подходящий

So how do I call the post ID?

Если 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)

Спасибо, это должно быть так, но мне пришлось использовать "ручную" ссылку, такую ​​как ответ markratledge.

BlueDogRanch 03.11.2018 03:32

Если бы я мог видеть весь код, который вы используете, я мог бы помочь вам в дальнейшем ... Но в любом случае, спасибо за награду. :)

Sally CJ 03.11.2018 08:45

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

Другие вопросы по теме