Support » Plugins » ACF Felder im Frontend zeigen

  • Hallo!

    Habe nun ACF installiert und tw. kapiert. Tolles Plugin, echt. Endlich Ordnung im Gewirr der inzwischen 100en, von irgendwem angelegten BN-Felder.

    Für ACF gibt es sicherlich auch 100 Zusatzplugins. Dabei sollte doch eins sein, welches dabei hilft diese Felder im Frontend zu zeigen.

    Ok, die einfache Anzeige eines Feldwertes ist eh leicht, wie diese Anleitung zeigt: https://www.advancedcustomfields.com/resources/adding-fields-posts/
    Doch ich wollte einfach nur ein URL Feld ausgeben, was natürlich gleich ein Link sein soll.
    Also sowas wie:
    echo '<p><a href=the_field('quelle_acf')>Quelle</a></p>';
    ins Template, (in meinem Fall single.php). Doch das klappt nicht, egal wie ich wo die Anführungszeichen, Verkettungen, usw. mache – immer Fehler.

    Ergo: Da ich einfach zu blöd bin, diese einfache Sache zu coden: Was ist erst bei komplexeren Integrationen im Template?
    Daher könnte es ja ein Plugin geben, welches einem hilft, diese ACF Felder in Theme, Template zu kleben oder evtl. auch als Shortcode zu verpacken.

    Danke für etwaige Inputs …

Ansicht von 15 Antworten - 1 bis 15 (von insgesamt 16)
  • Das ist doch nur simples PHP. Versuche es mal mit
    echo '<p><a href="' . the_field('quelle_acf') . '">Quelle</a></p>';

    Thread-Ersteller pezi

    (@pezi)

    Ja, ganz simpel. Funzt aber nicht wirklich.
    Klar hatte ich
    echo <p><a href="' . the_field('quelle_acf') . '">Quelle</a></p>; als erstes genauso drin ( "'.xxx.'" hab ich mir als Standardsnippet für sowas angelegt)

    Doch damit passiert folgendes:
    Es erscheint der Text „Quelle“ als Link. Ok. Aber: Der Link darin ist nicht der Wert des per ACF angelegten Feldes, sondern der des Beitrages … komisch, aber so isses.

    Irgendwas ist bei den ACF Funktionen anders. Evtl. hängt es mit dem Unterschied zwischen get_field() und the_field() zusammen.
    Da muss ich noch experimentieren …

    Danken jedenfalls für die Bestätigung, das mein erster Code (nicht der Start-Post) eh richtig gewesen wäre.

    • Diese Antwort wurde geändert vor 3 Wochen, 4 Tage von pezi.
    • Diese Antwort wurde geändert vor 3 Wochen, 4 Tage von pezi. Grund: Code tags vergessen
    Thread-Ersteller pezi

    (@pezi)

    Es klappt!

    $quelle = get_field('quelle_acf');
    echo '<p><a href="' . $quelle . '">Quelle</a></p>';

    funzt!

    Also man muss kann das erst eine Var let per get_field(‚feldname‘) definieren, diese dann ausgeben. Nur the_field(‚feldname‘); geht nicht …

    Ergo geht auch:
    echo '<p><a href="' . get_field('quelle_acf') . '">Quelle</a></p>';

    • Diese Antwort wurde geändert vor 3 Wochen, 4 Tage von pezi.

    get_field() gibt den Wert eines Feldes zurück, um es z.B. in einer Funktion zu verwenden (so wie return).
    the_field() gibt den Wert eines Feldes gleich aus (so wie echo).

    echo the_field('feldname'); ist also „doppelt gemoppelt“ und ergibt deshalb keinen Sinn. 🙂

    Schau dir mal diese Seite aus der ACF-Dokumentation an, da wird das sehr schön (auf Englisch) erklärt:

    Adding fields to Posts

    Wenn dir das auf Englisch zu kompliziert ist, öffne die Seite im Browser Chrome > Rechtklick auf die Seite > Auf Deutsch übersetzen. Die Übersetzung ist recht brauchbar, der Code wird natürlich nicht übersetzt, weil hole_feld('feldname') wohl auch nicht funktionieren würde. 😀

    Thread-Ersteller pezi

    (@pezi)

    echo the_field(‚feldname‘); ist also „doppelt gemoppelt“ und ergibt deshalb keinen Sinn

    und daher in einem echo mit Absatz u weiteren Kram also so nicht nutzbar. the_field() ist also zb. dann brauchbar, wenn der Wert alleine stehen kann.

    Danke!

    Die Anleitung habe ich eh im Start-Post genannt – nur aufgrund meiner Faulheit suchte ich halt ein Zusatzplugin, was das Anzeigen der BN Felder evtl. einfacher macht. (Weil es ja sooooviele Erweiterungen für ACF gibt, dachte ich, schau’n mer mal …)

    Andererseits: Eigener Einbau von ein paar Zeilen Code erspart ein Extra-Plugin.

    Jetzt schau ich mal, ob ich es noch hinbekomme, die Ausgabe der per ACF gebauten Felder zu einem [Shortcode] zu machen um die Felder ggf. auch so nutzen zu können.
    Bitte keine Lösung posten, ich will das selber hinbekommen!

    Die Anleitung habe ich eh im Start-Post genannt

    Ups, glatt übersehen.

    Jetzt schau ich mal, ob ich es noch hinbekomme, die Ausgabe der per ACF gebauten Felder zu einem [Shortcode] zu machen

    Hm, oder den Shortcode nutzen, den dir ACF anbietet?

    Thread-Ersteller pezi

    (@pezi)

    Hm, oder den Shortcode nutzen, den dir ACF anbietet?

    Ups, auch übersehen, diese Anleitung – das teste ich später. Danke!

    Oder „Warum bequem, wenns auch umständlich geht?“ 😉

    PS: Habs per (selbstgemachten) Shortcode nicht hinbekommen, weil man dazu etliches von ACF includen müsste (eben die function get_field, die class … irgendwie ging das nicht so wirklich)

    Öhm, nein? 🙂

    Nehmen wir an, du fügst ein neues Feld „Webadresse“ hinzu, das eine URL aufnimmt:

    Screenshot Einstellungen
    (zum Vergrößern anklicken)

    Mit einem Code-Snippet fügst du folgende Zeilen hinzu:

    add_shortcode( 'webadresse', 'webadresse_shortcode' );
    function webadresse_shortcode () {
      return get_field( 'webadresse', $post->ID );
    }

    Den verwendest du in einem Beitrag. (Nicht vergessen, auch im neuen Feld eine URL einzufügen!)

    Screenshot Einstellungen
    (zum Vergrößern anklicken)

    Das sieht dann im Frontend so aus:

    Screenshot Einstellungen
    (zum Vergrößern anklicken)

    „weil man dazu etliches von ACF includen müsste“ – wo das? 😀

    Thread-Ersteller pezi

    (@pezi)

    Nein, weil ich zu dumm dafür bin, war.

    Dein Code funzte natürlich sofort! 1000 THX!
    Da kommt nur das im debug.log:

    [11-Nov-2021 13:01:37 UTC] PHP Notice:  Undefined variable: post in /var/www/clients/client21/web123/web/wp-content/themes/magazine-child/functions.php on line 177
    [11-Nov-2021 13:01:37 UTC] PHP Notice:  Trying to get property 'ID' of non-object in /var/www/clients/client21/web123/web/wp-content/themes/magazine-child/functions.php on line 177

    Zeil 177: return get_field( 'webadresse', $post->ID );

    Bei meinen Versuchen, get_field oder irgendwas von ACF als Shortcode auszugeben, war die debug.log gleich überfüllt vor Fehlern …

    Hier noch mein alter Code, der plötzlich und seltsamerweise auch ohne die ganzen blöden include Versuche auch funzt:

    add_shortcode( 'quelle', function () {
      $quelle = get_field('quelle_acf');
      $out = "<p><a href='$quelle'>Quelle</a></p>";
    	return $out;
    } );

    Der Shortcode [quelle] gibt hier gleich brav Absatz, samt Link aus. (Aber auch da wird die Var post angemeckert)

    Thread-Ersteller pezi

    (@pezi)

    Nachtrag + noch ne Frage zu ACF:

    Die nicht definierte Var post wird bei deinem Codesnippet weiterhin angemeckert, auch wenn man global post definiert.

    Meine Version funzt komischerweise noch immer. Hier die letzte Version:

    add_shortcode( 'quelle_acf', function () {
      if ( function_exists( 'get_field' ) ) {
        $quellenlink = get_field( 'quelle_acf' );
        if ( $quellenlink ) {
          $linktitel = "APA OTS Adaption";
          $out = "<p>Quellenangabe: <a href='".$quellenlink."' title='".$linktitel."'>".$quellenlink."</a></p>";
    	  return $out;
        }
      }
    } );

    Zusatzfrage zu ACF:
    – Die WP nativen Benutzerfelder braucht man im Editor nur mit einem Wert füllen, das wars. Auch beim ändern reicht es den neuen Wert einzutragen.
    – Bei ACF muss man den Beitrag zusätzlich aktualisieren, zB. wenn man einen Feldwert ändert. (Wieder eine Revision mehr) Ist das bei ACF so gewollt oder machen wir was falsch? (Fand in den ACF Dokus u. Foren nichts dazu)

    Die WP nativen Benutzerfelder braucht man im Editor nur mit einem Wert füllen, das wars.

    Das kann ich nicht reproduzieren. Lege ich ein neues Custom Field an, weise dem Feld einen Wert zu und verlasse den Beitragseditor, ohne den Beitrag zu aktualisieren, wird das Custom Field bei einem erneuten Aufruf nicht angezeigt.

    (Wieder eine Revision mehr)

    Für die Datenbank sollte das herzlich ergal sein. Wird tatsächlich der Speicherplatz knapp, lässt sich eine Anzahl an Revisionen vorgeben.

    add_shortcode( 'quelle_acf', function () {

    Ich finde es etas mühsam, im Shortcode jedesmal _acf tippen zu müssen. Ich würde eher sowas wie [quellurl] verwenden. Aber das ist hängt wohl von persönlichen Vorlieben ab.
    Es ist zwar OK, einen anonyme Funktion zu verwenden, aber ich finde das schlechter lesbar und würde, um die Wartungsfreundlichkeit zu erhöhen, darauf verzichten.

    if ( function_exists( 'get_field' ) ) { …

    völlig korrekt, ich hatte das in meinem Code-Snippet nicht eingefügt.
    Denk bitte daran, dass für jede Antwort hier eigentlich nur wenige Minuten Zeit eingeplant sind, weil man sonst nichts anderes am Tag geschafft bekommt. 🙂

    Übrigens kannst du auch die nativen WordPress-Funktion get_post_meta( get_the_ID(), 'customfieldname' ) zum Abrufen von Custom Fields verwenden. Auch die Custom Fields, die du mit ACF (bequemer, weil ohne Programmierung) anlegst, sind am Ende nur Custom Fields.

    $out = "<p>Quellenangabe: <a href='".$quellenlink."

    Wenn ACF das nicht bereits selber übernimmt, macht es Sinn, bei jeder Ausgabe die Variable nochmal zu escapen, hier mit
    $quellenlink = esc_url( get_field( 'quelle_acf' ) );

    Thread-Ersteller pezi

    (@pezi)

    Sorry. Ich meinte schon angelegte Felder, die einen neuen Wert bekommen sollen (kommt bei uns öfters vor)
    Das reichts einen neuen Wert rein, fertig, der erscheint sofort – mit ACF muss der Beitrag auch aktualisiert werden.

    Bei ca. 10, 20 Beiträgen täglich und bis zu 15.000 insgesamt will ich immer Revisionen sparen. Vielleicht ein blöder Wunsch, aber mich stört die unglaubliche Menge an unnötigen Revisionen. „Meine“ Autoren arbeiten oft tagelang an den Beiträgen, da wird oft nach jeder kleinen Änderung auf „Aktualisieren“ geklickt.

    Das begrenzen der Revisionen klappte bisher nicht. Keiner der Tricks half. (Hatten wir hier schon mal diskutiert.)

    mühsam, im Shortcode jedesmal _acf

    Das ist zum einen nur ein Test und ‚_acf‘ kam als Unterscheidungsmerkmal dazu, weil das andere, seit Jahren aktive Feld ‚quelle‘ nicht angetastet werden sollte.

    Auch soll der Shortcode fix unter den Post in ein Widget. (So erspare ich mir, dies in die single.php hart einzucoden (bisher wurde das Feld ‚quelle‘ nämlich mit einer Funktion im Template aufgerufen))

    für jede Antwort hier eigentlich nur wenige Minuten Zeit

    Dafür sind es aber oft umfangreiche, maßgeschneiderte Tutorials von höchsten Wert für den Fragesteller. Für diese Antworten unsereiner ein Semester Informatik brauchen würde.

    nativen WordPress-Funktion

    Ja, genau die gleiche Methode hatte ich bisher drin!
    Wollte aber die neue Einbindung per Shortcode und eben diese eigenen Ausgabefunktionen testen. (Warum was funktionierendes so lassen, wenn mans auch umkrempeln kann? 😉 )

    Auch die Custom Fields, die du mit ACF … anlegst, sind am Ende nur Custom Fields.

    Auch wieder wahr …

    Moderator Bego Mario Garde

    (@pixolin)

    Ich meinte schon angelegte Felder, die einen neuen Wert bekommen sollen …
    Das reichts einen neuen Wert rein, fertig, der erscheint sofort

    Auch das kann ich nicht reproduzieren: Beitrag mit vorhandenem Custom-Field-Eintrag aufgerufen, Wert geändert, ohne „Aktualisieren“ ins Backend zurück, Beitrag neu aufgerufen: Custom Field hat den ursprünglichen Wert.
    Vielleicht nutzt ihr da noch ein anderes Plugin?

    Das begrenzen der Revisionen klappte bisher nicht.

    Der Eintrag define( 'WP_POST_REVISIONS', 3 ); in der wp-config.php sollte die Anzahl der gespeicherten Revisionen auf drei begrenzen.

    Auch soll der Shortcode fix unter den Post in ein Widget.

    Alternative wäre vielleicht, das Custom Field an den Inhalt anzuhängen, also sinngemäß sowas wie

    add_filter( 'the_content', 'inhalt_mit_customfield' );
    function inhalt_mit_customfield( $content ) {
     $content = $content . get_field('quelle_acf');
     return $content;
    }

    (Die oben besprochenen if-Statements habe ich der Kürze wegen weggelassen.)

    Thread-Ersteller pezi

    (@pezi)

    Ich meinte ohne Aktualisieren des Beitrags – nicht ohne Aktualisieren des Feldes.
    Es gibt meiner Meinung zwei Unterschiede zw. dem Neu speichern des Beitrages und dem des Feldinhaltes:
    Keine Revision; und das Feld Aktualisieren ist blitzschnell erledigt, recht lange Beiträge rödeln manchmal einige Sekunden bis die Rückmeldung kommt.

    Möglich, das dieser Aktualisieren Button unter den Benutzer Felder nicht Standard ist?
    so schauts in allen Sites mit gleichem Theme (Magazine von MH) aus:

    Das Begrenzen der Revisionen klappt weiterhin nirgends. Den Code kannte ich ja, nutzte nie. Komisch, ist aber so.

    Custom Field an den Inhalt anzuhängen

    Genau so eine Lösung fiel mir gestern ein, habe stundenlang nach Tipps gesucht, wie dies funzen könnte! (Da ja einige Ad Inserter (Zb. das coole Advanced Ads) das können, dachte ich: Das musst auch schaffen.) Aber ne.

    Das es aber so einfach sein soll …? Nur eine Verkettung von content + Feld. WOW!

    1000 THX im Voraus – ich teste das dann später.

    Moderator Bego Mario Garde

    (@pixolin)

    Ich meinte ohne Aktualisieren des Beitrags – nicht ohne Aktualisieren des Feldes.

    Das sind diese kleinen Details … 😉

    Das es aber so einfach sein soll …? Nur eine Verkettung von content + Feld. WOW!

    Naja, das war jetzt grob vereinfacht. Wie gesagt müsstest du abfragen, ob die Funktion get_field() vorhanden ist und das Feld gesetzt wurde. Zusätzlich wirst du das Custom Field noch in etwas HTML mit CSS-Klassen verschachteln wollen, damit die Ausgabe des angehängten Custom Field nicht irgendwo steht.

    Du kannst für die Ausgabe von Custom Fields ein Child-Theme anlegen und das Template mit einer Funktion get_field() erweitern.
    Du kannst auch ein Child-Theme erstellen und eine Funktion in die functions.php einfügen, die den Filter the_content nutzt.
    Am einfachsten (und sehr aufgeräumt) finde ich aber, die Funktion direkt per Code Snippets einzubinden. Das erspart dir (sofern nicht bereits geschehen) das Anlegen eines Child-Themes und verringert den Wartungsaufwand erheblich.

Ansicht von 15 Antworten - 1 bis 15 (von insgesamt 16)