Support » Themes » Template-Part durch Plugin nachladen

  • Stefan

    (@wefan)


    Hallo zusammen,

    ich schlage mich mit folgendem Problem herum:

    Kann ich bei einem Template mittels Plug-In einen weiteren, eigenen Template-Part nachladen?

    Konkret geht es um TwentyTwenty, wo ich nach dem Template-Part ‚content-cover.php‘ einen eigenen Template-Part laden möchte.

    Von der Struktur nach bei Twentytwenty:

    index.php
    —— content-cover.php
    —— mein-part.php

    Ich habe natürlich ein Child-Theme angelegt und könnte dort ‚content-cover.php‘ so ändern, dass es mein Template-Part nachlädt.

    Mir kam aber dann der Gedanke, ob man es nicht eleganter und programmatischer mittels eines Plug-Ins lösen könnte, das eben nach ‚content-cover.php‘ mein Template nachlädt?

    Ich habe überall gesucht und nichts dazu gefunden. Ich dachte, es könnte irgendwo einen Hook geben, durch den man in die Ladefolge eines Templates eingfreift. Aber so, wie ich mir das denke, scheint es das nicht zu geben. Oder ich habe nicht die richtigen Worte für das Problem gebraucht.

    Kurz, hat jemand vielleicht eine Idee?

    Herzliche Grüße
    Stefan

Ansicht von 14 Antworten - 1 bis 14 (von insgesamt 14)
  • Moderator Bego Mario Garde

    (@pixolin)

    Mit der Vorgabe, dass du „nach dem Template-Part content-cover.php einen eigenen Template-Part laden möchte“st, schränkst du die Möglichkeiten bereits ein. Wenn du direkt nach dem Inhalt etwas ausgeben möchtest, reicht vielleicht ein

    add_filter( 'the_content', 'meine_callback_funktion' );
    function meine_callback_funktion( $content ) {
      $html = '<div class="foo">Das war toll.</div>';
      $content = $content . $html;
      return $content; 
    }

    Ansonsten kannst du in Templates mit require_once() immer PHP-Dateien einbinden. Das sollte auch in Template-Parts funktionieren.

    Mir kam aber dann der Gedanke, ob man es nicht eleganter und programmatischer mittels eines Plug-Ins lösen könnte …

    Die Motivation sollte anders sein: Wenn du zusätzliche Funktionalität hinzufügst, ist ein Plugin (oder ein Code Snippets, wenn du das Plugin Code Snippets verwendest) die richtige Wahl, wobei das Plugin entweder (wie im eingangs genannten Code) einen Hook benötigt, um Funktionen einzubinden. Geht es hingegen um eine gestalterische Änderung die nicht nur mit Einstellungen im Customizer und zusätzlichen CSS-Regeln zu bewerkstelligen ist, bist du mit einer Anpassung in einem Child-Theme richtig.
    Denk daran, dass du auch in drei Monaten (oder drei Jahren!) noch nachvollziehen musst, welche Anpassungen du aus welchen Gründen gemacht hast. Kurze Kommentare im Code sind hilfreich, vor allem aber solltest du dich an die Unterscheidung zusätzliche Funktionalität/gestalterische Änderung halten.

    Thread-Starter Stefan

    (@wefan)

    Vielen Dank für Deine hilfreiche Anregungen. An die Sache mit the_content hatte ich auch gedacht. Ich wollte aber aus Gründen der späteren Nachvollziehbarkeit, die Du auch ansprichst, nicht noch mehr in the_content packen.

    Vielleicht ist das einfache require_once tatsächlich die beste Lösung.

    Moderator Bego Mario Garde

    (@pixolin)

    Ist deine Frage damit beantwortet?
    Dann sei bitte so nett und markiere den Thread noch als „gelöst“.
    Das hilft den Teilnehmenden, nur ungelöste Threads aufzurufen.

    Thread-Starter Stefan

    (@wefan)

    Nein, noch nicht. Denn meine eigentliche Frage, ob man noch ein weiteres Template nachladen kann, ist noch offen.

    Vielleicht hat jemand dazu noch eine Idee?

    Moderator Hans-Gerd Gerhards

    (@hage)

    Hallo,
    aber Bego hatte dir doch bereits einige Beispiele genannt.
    Ich habe das in der Tat bei einer WordPress-Instanz in ähnlicher Form eingebaut, siehe hier:

    /*----------------------------------------------------------------*/
    /* Start: Beispieltext am Ende von jedem Beitrag oder jeder Veranstaltung
    /*----------------------------------------------------------------*/
    
    add_filter( 'the_content', 'filter_the_content_in_the_main_loop' );
    
    function filter_the_content_in_the_main_loop( $content ) {
    
        // Prüfen ob wir in dem Loop eines Beitrags oder einer Seite sind
        if (( is_single() OR is_page()) && in_the_loop() && is_main_query() ) {
            $ac_button = '<div class="ac_container"><div class="mitglied"><a class="button-mitglied" href="https://example.com" target="_blank" rel="noopener noreferrer">Beispiel</a></div><div class="mitglied_beschreibung">Das ist ein Beispieltext</div></div>';
            $abgesagte_events = '<div class="ac_container"><div class="mitglied"><a class="button-mitglied" href="https://example.com">Infos</a></div><div class="mitglied_beschreibung">Alle Infos.</div></div>';
            return $abgesagte_events . $content . $ac_button;
        }
        return $content;
    }
    /*----------------------------------------------------------------*/
    /* Ende: Beispieltext am Ende von jedem Beitrag oder jeder Veranstaltung
    /*----------------------------------------------------------------*/

    Die genannten CSS-Klassen für die Container (DIV) müssen natürlich noch individuell gestaltet werden. Damit hast du an sich alles, was du brauchst. Aber vielleicht verstehe ich dein Problem nicht richtig.
    Viele Grüße
    Hans-Gerd

    Moderator Bego Mario Garde

    (@pixolin)

    Die Funktion get_template_part() soll gegenüber einem einfachen require() mehr Flexibilität geben, weil du der Funktion einen Post Type übergeben kannst, um z.B. für Seiten und Beiträge unterschiedliche Template-Teile zu laden.
    Es spricht wohl nichts dagegen, in einem Template-Part mit get_template_part() einen weiteren Template-Part zu laden.

    Denn meine eigentliche Frage, ob man noch ein weiteres Template nachladen kann, ist noch offen.

    Kann man. Entweder mit require() oder mit get_template_part().

    Frage beantwortet?

    Thread-Starter Stefan

    (@wefan)

    @hage

    Ich möchte nicht über the_content gehen, sondern gerne ein weiteres Template nachladen. So, wie ich es schon beschrieben hatte.

    @pixolin

    Die Funktion get_template_part() habe ich mir angeschaut. Aber wie schaffe ich es dann, nach dem Template ‚content-cover.php‘ mein eigenes Template zu laden? Und zwar von einem Plugin aus?

    Moderator Bego Mario Garde

    (@pixolin)

    In einem (Child-)Theme kannst du weitere Templates wie gesagt mit get_template_part() oder require() einbinden. Wenn ein Template einen Hook hat, kannst du Funktionen eines Plugins über diesen Hook einbinden. Die Funktion kann auch sein, ein Template einzubinden, dass Bestandteil des Plugins ist.

    Wenn das Theme keinen Hook zur Verfügung stellt, du die Hooks des WordPress-Core nicht verwenden und auch kein Child-Theme anlegen möchtest, bleibt dir nur die Möglichkeit, die Funktion eines Plugins über einen Shortcode einzubinden. Dazu verwendest du im Plugin add_shortcode() und fügst manuell in den Inhalt deiner Seiten und Beiträge den Shortcode [beispiel] ein.

    Wie eingangs beschrieben, haben gestalterische Anpassungen (was anders sollte ein Template sein?) eigentlich nichts in einem Plugin zu suchen, sondern gehören in ein (Child-)Theme.

    Nachtrag: Noch ein Satz zu deiner Antwort an Hans-Gerd mit dem Nebensatz „So, wie ich es schon beschrieben hatte.“ – wir helfen in unserer freien Zeit aus. Das kann zwischen zwei Terminen sein, während ein Backup-Script läuft oder man auf den Anruf eines Kunden wartet. Was ich sagen möchte: manchmal übersehen wir auch, dass bestimmte (naheliegende) Antworten bereits gegeben oder vom Fragesteller vorab ausgeschlossen wurden. Nicht alle Antworten passen, nicht alle Antworten sind gut, aber wir versuchen vor allem, dir zu helfen. Bei diesem Thread stand für mich bisher „Template einbinden“ im Vordergrund, während für dich vielleicht „durch Plugin nachladen“ viel größere Bedeutung hat. Hab also ein bisschen Nachsicht, wenn mal eine Antwort doppelt kommt oder wie vielleicht auch nicht auf Anhieb verstanden haben, dass du eigentlich einen anderen Schwerpunkt legst.

    • Diese Antwort wurde geändert vor 3 Jahren von Bego Mario Garde. Grund: Nachtrag
    Thread-Starter Stefan

    (@wefan)

    @pixolin Ich habe wirklich volles Verständnis dafür, dass jede/r hier nach seinen Kräften hilft, wie es möglich ist und möchte auch nicht unhöflich sein, aber ich hatte mich mit der Frage an dieser Forum gewandt, ob es möglich sei, mittels eines Plugins weitere Template-Parts in einem bestehenden Template nachzuladen?

    Vielleicht hat jemand dazu noch ein Idee, sonst können wir das Thema dann gerne abschließen.

    Moderator Bego Mario Garde

    (@pixolin)

    Das verstehe ich nicht. Was war denn jetzt an der Aussage „… bleibt dir nur die Möglichkeit, die Funktion eines Plugins über einen Shortcode einzubinden.“ verkehrt?

    Moderator Hans-Gerd Gerhards

    (@hage)

    Hallo @wefan,
    ich möchte noch mal darauf eingehen, warum ich zu der Option mit the_content noch eine Antwort gegeben habe: Als einzigen Grund hast du angegeben, dass du „aus Gründen der späteren Nachvollziehbarkeit“ diese Option nicht nutzen wolltest.
    Ich nutze diese Option häufiger und bei entsprechend guter Dokumentation und Versionierung über Github sollte das an sich kein Problem darstellen.
    Wenn du diese Option nicht nutzen willst, ist das natürlich deine Sache und ok. Mir war es nur wichtig, noch mal neben der bereits von Bego genannten Lösung zu the_content durch den von mir genannte rudimentären Code deutlich zu machen, wie flexibel diese Lösung ist.
    Viele Grüße
    Hans-Gerd

    Thread-Starter Stefan

    (@wefan)

    @pixolin Weil, so wie ich es verstehe, ein Shortcode Code in schon bestehenden Inhalt (einen Post etwa) einfügt. Damit ist es nahe an dem, was auch über the_content erreicht worden wäre.

    Was ich aber suche, ist die Möglichkeit, durch ein Plugin einen eigenen Template-Part in einem bestehenden Template nachzuladen.

    • Diese Antwort wurde geändert vor 3 Jahren von Stefan.
    • Diese Antwort wurde geändert vor 3 Jahren von Stefan.
    Moderator Hans-Gerd Gerhards

    (@hage)

    @wefan: Bego hatte das hier geschrieben und genau so sehe ich das auch: „Wie eingangs beschrieben, haben gestalterische Anpassungen (was anders sollte ein Template sein?) eigentlich nichts in einem Plugin zu suchen, sondern gehören in ein (Child-)Theme.“
    Warum du jetzt trotz allem unbedingt ein Plugin haben möchtest – keine Ahnung.
    Viel Erfolg bei der Suche.

    Moderator Bego Mario Garde

    (@pixolin)

    Was ich aber suche, ist die Möglichkeit, durch ein Plugin einen eigenen Template-Part in einem bestehenden Template nachzuladen.

    Das geht nur, wenn das Template dazu Hooks zur Verfügung stellt. Gibt es keinen Hook, bleibt dir nur die Lösung, Shortcodes zu verwenden. Alernativ kannst du auch noch eigene Blöcke definieren, die alles Mögliche an Code einbinden können – theoretisch also auch Code zur gestalterischen Anpassung. Das hat dann aber eigentlich nichts mehr damit zu tun, wie Templates eines Themes geladen werden. Die Verwendung des Begriffs Template-Parts ist in diesem Zusammenhand eher verwirrend.

Ansicht von 14 Antworten - 1 bis 14 (von insgesamt 14)
  • Das Thema „Template-Part durch Plugin nachladen“ ist für neue Antworten geschlossen.