Übergeben einer Post-ID an eine Twig/Timber-Funktion

Lesezeit: 7 Minuten

Benutzer-Avatar
BlueDogRanch

Wie übergebe ich eine Post-ID an eine Twig/Timber-Funktion wie edit_post_link?

Lesen Sie die Dokumente unter https://timber.github.io/docs/guides/functions/#function-with-arguments

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.

Und genau das passiert; wenn ich das benutze

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

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:

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;
    }

Dies ist die grundlegende Schleife index.twig. „Menschen“ ist ein standardmäßiger benutzerdefinierter WordPress-Beitragstyp:

 {% 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>', post.ID) }}

            {% endfor %}

    {% else %}

 {% endif %}

Das führt dazu, dass alle Bearbeitungslinks auf diese Seite verweisen, nicht jeder benutzerdefinierte Beitragstyp „Person“.

Wie rufe ich also die Post-ID auf? Muss ich die Beitrags-ID in der benutzerdefinierten Beitragstypfunktion aufrufen?

Die Hauptdatei index.php hat Standard-Twig-Funktionen:

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

  • 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.ID oder person.id (Jawohl, beide sind eigentlich einstellen). Also diese haben bei mir gut funktioniert:

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

Wie ich das oben bestätigte

  1. Ich habe die installiert und aktiviert offizielles Timber-Starterthema.

  2. ich erschuf 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. 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:

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

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

1245750cookie-checkÜbergeben einer Post-ID an eine Twig/Timber-Funktion

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy