Как передать идентификатор сообщения функции 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 );
Хм ... но нет, это не сработает.
Как вы определяете index.php в people? Можешь показать код?
Я добавил index.php, но это стандартная функция Twig. Человек CPT - это стандартный CPT WordPress.
Я имел в виду, разве у вашего $context нет people ($context['people'])? Если да, то где это определяется? Если нет, то откуда здесь people? Может, вы сможете показать полный код в вашем файле index.twig? Или временно добавьте {{ fn( 'var_dump', person ) }} в ваш цикл for и поделитесь выводом.
Интересно; использование {{ dump(person) }} показало мне идентификатор, а использование {{ person.id }} отображает идентификатор в index.twig. Но это должен быть идентификатор в нижнем регистре, а не идентификатор. Но вся функция по-прежнему не работает.
Я могу протестировать ваш код, но мне нужно посмотреть, как определяется people. Или это что-то вроде get_posts( 'post_type=person' )? А под «функцией» вы имеете в виду newwindow_edit_post_link(), верно?
Извините, я имею в виду, это {{ function('edit_post_link', ...) }} не работает, и если да, то как он не работает? Нет вывода, не ожидаемый результат, или?
Нет вывода на {{ function('edit_post_link', ...) }}
Попробуйте {{ function( 'get_edit_post_link', person.id ) }}, просто чтобы посмотреть, приведет ли это к правильному выводу.
В качестве альтернативы, как говорит документация, сделайте edit_post_link доступным в Twig, используя Timber\Twig_Function внутри ловушки timber/twig. И используйте {{ edit_post_link(...) }}. Если это все еще не работает, возможно, проблема в person.id.
То, что находится в документации Twig, не работает. {{ function( 'get_edit_post_link', person.id ) }} не выводит сигнал. {{ person.id }} действительно работает, поэтому я сделал ссылку для ручного редактирования, используя {% if user %} для входа в систему.
Не уверен, что не так в вашем случае, но я проверил ваш код (хотя я использовал front-page.php), и у меня все сработало.






Если посмотреть на Документация 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 Похоже, мне нужна функция, которая будет получать идентификатор сообщения?
Если у вас нет функции PHP, зарегистрированной в Twig с псевдонимом edit_post_link, я подозреваю, что Twig выдаст это как исключение. Выполните поиск по запросу "edit_post_link", чтобы убедиться, что вы еще не зарегистрировали этот псевдоним для неправильной функции по ошибке.
Ах, у меня есть фильтр, который заставляет target = "_ blank"; добавил к моему вопросу. Ты прав; должно быть поэтому я не получаю фатальных ошибок. Так имеет ли смысл добавлять идентификатор сообщения к этой функции?
Да, вашему фильтру "edit_post_link" потребуется аргумент для получения идентификатора сообщения. Неважно, какой аргумент он предоставляет, использование вашего внешнего интерфейса Twig соответствует порядку.
Хорошо, но теперь я не знаю, как это сделать. Похоже, мне нужен глобальный $ post; $ post_id = $ post-> ID; чтобы получить идентификатор для каждого сообщения вне цикла.
Да, хотя это проблема WordPress, и на этом мой опыт заканчивается. (Кажется, с вашим Twig все в порядке.) Нет ли функции PHP, такой как the_post(), для получения этой информации?
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) }}
Как я подтвердил вышеизложенное
Я установил и активировал официальная стартовая тема Timber.
Я создал 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)
Спасибо, это должно быть так, но мне пришлось использовать "ручную" ссылку, такую как ответ markratledge.
Если бы я мог видеть весь код, который вы используете, я мог бы помочь вам в дальнейшем ... Но в любом случае, спасибо за награду. :)
Это уродливо, но если вы не можете заставить функцию 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 %}
Если
personявляется объектом сообщения (WP_Post), попробуйтеperson.IDвместоpost.ID.