Eine Funktion wie edit_post_link versucht, die ID des Beitrags, den Sie bearbeiten möchten, aus dem aktuellen Beitrag in The Loop zu erraten. die gleiche Funktion erfordert einige Änderungen in einer Datei wie archive.twig oder index.twig. Dort müssen Sie explizit die Post-ID übergeben.
in index.twighaben alle Bearbeitungslinks die Beitrags-ID der Seite, die die Schleife der benutzerdefinierten Beitragstypen anzeigt, nicht die Beitrags-ID jedes benutzerdefinierten Beitragstyps, der sich in der Schleife befindet.
Ich verwende die folgende Funktion in der functions.php, die auch a erzwingt target="_blank" auf Bearbeiten-Links:
Wenn person ist ein Beitrag (WP_Post) Objekt, versuchen Sie es person.ID Anstatt von post.ID.
– Sally CJ
26. Oktober 2018 um 18:33 Uhr
Hmm…. aber nein, das geht nicht.
– BlueDogRanch
26. Oktober 2018 um 19:22 Uhr
Im index.phpwie definierst du die people? Kannst du den Code zeigen?
– Sally CJ
26. Oktober 2018 um 23:56 Uhr
Ich habe index.php hinzugefügt, aber es ist eine Standard-Twig-Funktion. Die CPT-Person ist ein Standard-WordPress-CPT.
– BlueDogRanch
27. Oktober 2018 um 1:47 Uhr
Ich meinte, du nicht $context haben eine people ($context['people'])? Wenn ja, wo wird es definiert? Wenn nicht, woher kommt dann die people? Vielleicht können Sie den vollständigen Code in Ihrem zeigen index.twig Datei? Oder vorübergehend hinzufügen {{ fn( 'var_dump', person ) }} in deiner for Schleife und teilen Sie die Ausgabe.
– Sally CJ
27. Oktober 2018 um 17:24 Uhr
Wie rufe ich also die Post-ID auf?
Wenn die people in der Schleife in Ihrem index.twig Vorlage ist ein Array von Beiträgen (d. h. jeder Beitrag ist eine WP_Post / Timber\Post Beispiel), dann können Sie (bzw sollte in der Lage sein) die Post-ID über abzurufen person.IDoderperson.id (Jawohl, beide sind eigentlich einstellen). Also diese haben bei mir gut funktioniert:
<?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 );
Dann habe ich erstellt 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="https://stackoverflow.com/questions/52974561/{{ 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 %}
Und bei mir hat alles wunderbar geklappt – die edit_post_link() wurde richtig aufgerufen und zeigt den post mit dem link an target="_blank" im Markup. (Ich habe die newwindow_edit_post_link Zeug hinein functions.php)
Danke, das muss es sein, aber ich musste einen “manuellen” Link wie die Antwort von markratledge verwenden.
– BlueDogRanch
3. November 2018 um 2:32 Uhr
Wenn ich den gesamten von Ihnen verwendeten Code sehen könnte, könnte ich Ihnen vielleicht weiter helfen. Aber trotzdem danke für die Prämie. 🙂
– Sally CJ
3. November 2018 um 7:45 Uhr
Mit Blick auf die Twig 2.x-Dokumentation es gibt kein {{ function }} Twig-Funktion standardmäßig. Ich habe das in meinen Jahren der Verwendung von Symfony sicherlich noch nie gesehen, also vermute ich, dass dies etwas Brauchbares ist?
Ich habe gerade „timber/twig“ gegoogelt und dies ist tatsächlich ein WordPress-Plug-in, um Twig-Funktionen für Ihre Themenvorlagen bereitzustellen, daher glaube ich, dass Sie das Symfony-Tag versehentlich auf Ihre Frage gesetzt haben. Ich würde vorschlagen, dies zu entfernen und hinzuzufügen wordpress Stattdessen können Sie Antworten finden, die nützlicher sind als meine.
Wir müssten die PHP-Quelle für Ihre benutzerdefinierten sehen edit_post_link Zweigfunktion für Sicherheit. Es scheint jedoch, dass Sie in Ihren Argumenten einfach dieselbe Reihenfolge sowohl auf der PHP-Seite als auch auf der Twig-Seite abbilden müssen. Zum Beispiel, wenn Ihre Funktion ist:
function edit_post_link(string $label, string $openingHtml, string $closingHtml, int $postId) {
// blah blah blah
}
Nachdem Sie diese Funktion bei Twig registriert haben (obwohl Timber zu behaupten scheint, dass Sie dies möglicherweise nicht tun müssen, überprüfen Sie dies), würden Sie sie wirklich genau so verwenden, wie Sie es geschrieben haben:
Ich spüre, dass dies möglicherweise nicht das ist, worauf Sie hinauswollen, möglicherweise fragen Sie sich, wie Sie sich festhalten post.ID an erster Stelle. Wenn das der Fall ist, geht es bei Ihrem Problem nicht darum {{ function }}und wir müssten mehr von Ihrer Twig-Vorlagenquelle zusammen mit den Variablen sehen, die Sie ihr von PHP ausgesetzt haben.
Danke, ich habe Symphony fälschlicherweise markiert. Und ich habe keine Funktion namens edit_post_link in der functions.php Klingt so, als ob ich eine brauche, die die Post-ID erfasst?
– BlueDogRanch
24. Oktober 2018 um 18:50 Uhr
Wenn Sie keine PHP-Funktion haben, die bei Twig mit dem Alias registriert wurde edit_post_link Ich würde vermuten, dass Twig dies als Ausnahme werfen würde. Führen Sie eine Suche nach „edit_post_link“ durch, um sicherzustellen, dass Sie diesen Alias nicht bereits versehentlich für die falsche Funktion registriert haben.
– Adambean
24. Oktober 2018 um 18:54 Uhr
Ah, ich habe einen Filter, der ein target=”_blank” erzwingt; zu meiner Frage hinzugefügt. Sie haben Recht; Das muss der Grund sein, warum ich keine fatalen Fehler bekomme. Ist es also sinnvoll, die Post-ID zu dieser Funktion hinzuzufügen?
– BlueDogRanch
24. Oktober 2018 um 19:47 Uhr
Ja, Ihr “edit_post_link”-Filter benötigt ein Argument, um die Beitrags-ID zu erhalten. Es spielt keine Rolle, welches Argument Ihre Front-End-Twig-Nutzung mit der Bestellung übereinstimmt.
– Adambean
24. Oktober 2018 um 19:55 Uhr
OK, aber jetzt bin ich mir nicht sicher, wie ich das machen soll. Klingt, als bräuchte ich globale $post; $post_id = $post->ID; um die ID für jeden Beitrag außerhalb der Schleife zu erhalten.
– BlueDogRanch
24. Oktober 2018 um 20:10 Uhr
Das ist hässlich, aber wenn Sie das nicht bekommen können edit_post_link Funktion, um in einem template.twig zu arbeiten, und {{ person.id }} funktioniert, könnten Sie dieses Setup in Ihrer Zweigvorlage verwenden.
Es bestimmt, ob ein Benutzer angemeldet ist und bearbeiten kann, und zeigt in diesem Fall einen Bearbeitungslink an – dynamisch mit {{ person.id }} – das öffnet sich in einem neuen Tab:
{% if user %}
<a class="style-me" target="_blank"
href="https://stackoverflow.com/questions/52974561/{{ site.url }}/wp-admin/post.php?post={{ person.id }}&action=edit">Edit</a>
{% endif %}
12457500cookie-checkÜbergeben einer Post-ID an eine Twig/Timber-Funktionyes
Wenn
person
ist ein Beitrag (WP_Post
) Objekt, versuchen Sie esperson.ID
Anstatt vonpost.ID
.– Sally CJ
26. Oktober 2018 um 18:33 Uhr
Hmm…. aber nein, das geht nicht.
– BlueDogRanch
26. Oktober 2018 um 19:22 Uhr
Im
index.php
wie definierst du diepeople
? Kannst du den Code zeigen?– Sally CJ
26. Oktober 2018 um 23:56 Uhr
Ich habe index.php hinzugefügt, aber es ist eine Standard-Twig-Funktion. Die CPT-Person ist ein Standard-WordPress-CPT.
– BlueDogRanch
27. Oktober 2018 um 1:47 Uhr
Ich meinte, du nicht
$context
haben einepeople
($context['people']
)? Wenn ja, wo wird es definiert? Wenn nicht, woher kommt dann diepeople
? Vielleicht können Sie den vollständigen Code in Ihrem zeigenindex.twig
Datei? Oder vorübergehend hinzufügen{{ fn( 'var_dump', person ) }}
in deinerfor
Schleife und teilen Sie die Ausgabe.– Sally CJ
27. Oktober 2018 um 17:24 Uhr