PHP Wordpress: Custom Field Value wird nicht formatiert ausgegeben

KeinProblem

Ensign
Registriert
Okt. 2013
Beiträge
191
Hi,

Ich habe ein aktuelles Wordpress laufen. Nun möchte ich innerhalb einer Seite an einer bestimmten Stelle einen Text angezeigt bekommen, der im Backend eingegeben wird.

Dafür nutze ich Advanced Custom Fields als Plugin mit einer einfachen Eingabemaske für ein Textfeld. Dort wird der Text eingegeben und auch gespeichert.

Ausgelesen werden soll er durch einen Shortcode, den ich mit dem Plugin XYZ PHP Code erstelle.

Dort hole ich mir den Inhalt mit $text = get_field('meintext');

Der Text wird auch ausgelesen, den var_dump(§text) bekomme ich angezeigt. Darin ist alles reiner Fließtext. Lasse ich es mir zwischen <pre></pre>' ausgeben, sehe ich den Text auch genau so wie ich ihn eingegeben habe, inklusive Absätze. So hätte ich ihn gerne.

Möchte ich den $text dann aber normal (nicht als var_dump) per echo anzeigen lassen in meinem Kästchen, bekomme ich nur Fließtext, keine Absätze.


Welches Kommando fehlt da vor der Ausgabe? Text und Informationen über die Absätze sind ja vorhanden, ich stehe nur gerade absolut auf dem Schlauch, bei einem anderen shortcode funktioniert das herrlich mit dieser Methode. Wenn ich die Seite im Backend aktualisiere, wird der Text auch richtig formatiert angezeigt. Nur im Frontend spuckt er unformatierten Fließtext aus.

Danke schonmal für Ideen, für die ich wahrscheinlich einfach grad ein wenig zu vernagelt bin^^
 
Du gibst vor der Ausgabe noch einen Filter drauf:
PHP:
<?php echo apply_filters('the_content', $text); ?>
dabei wird autop angewand, wenn es nicht durch einen anderen Filter deaktiviert ist sowie shortcodes ausgeführt. Manchmal kann das Problematisch sein, dann mußt du dir ansehn wie die funktion des filters arbeitet und die nachbauen: https://github.com/WordPress/wordpress-develop/blob/6.2/src/wp-includes/formatting.php
 
Zuletzt bearbeitet:
Mit reinem PHP ist es wohl ein:
PHP:
<?php echo nl2br($text); ?>
Ein NewLine aus einem Textfeld wird in HTML nicht wirklich interpretiert. Daher die Konvertierung zu einem <br/>.
 
Grundsätzlich würd ich Custom Fields nie ohne WP Filter ausgeben. Wer weiß was da alles drin stehn könnte.
Für Attribute in HTML Tags gibts eigene Filter, mmn ein wichtiges Thema, wenn du dich mit Custom Fields befasst.

Zum Auslesen würde ich eher eine Build-In WP Funktion statt der ACF Funktion nutzen, dann bist du bei Deaktivierung oder Wechsel des Plugins unabhängig.

Einfache Nutzung im Loop:
PHP:
<?php
  $post_meta = get_post_custom();
  echo apply_filters('the_content', $post_meta['meintext'][0]);
?>
Docs: https://developer.wordpress.org/reference/functions/get_post_custom/

Außerdem hast du nur einen Funktionsaufruf und dann alle Felder in einer Variable.

Mit mehr Zusatznutzen:

functions.php (ändere myTheme auf dein Prefix) - Numerische und serialisierte Felder trage ich hier in einer kleinen Config ein, könnten aber auch Theme-Optionen sein.

PHP:
function myTheme_get_post_meta(){
  $numeric_fields = array('_alpha_file_count', '_favorites', '_wpcr_rating', '_thumbnail_id');
  $serialized_fields = array('_more-link', '_alpha_file_options', '_section-linked', '_conditions-table', '_links-internal', '_links-external');
  $post_id = absint($post_id);
  if ( !$post_id ) {
    $post_id = get_the_ID();
  }
  $post_custom = get_post_custom($post_id);
  $post_meta_keys = get_post_custom_keys($post_id);

  $post_meta = array();
 
  if ( $post_custom !== false && !empty($post_custom) ) {
    foreach ( $post_meta_keys as $post_meta_key ) {
      if ( !empty($post_custom[$post_meta_key][0]) ) {
        $post_meta[$post_meta_key] = $post_custom[$post_meta_key][0];
        // exeptions
        // numeric field type
        if ( in_array($post_meta_key, $numeric_fields) ) {
          $post_meta[$post_meta_key] = intval($post_custom[$post_meta_key][0]);
        }
        // serialized field type
        if ( in_array($post_meta_key, $serialized_fields) ) {
          $post_meta[$post_meta_key] = unserialize($post_custom[$post_meta_key][0]);
        }
      } else {
        $post_meta[$post_meta_key] = '';
        // exeptions
        // numeric field type
        if ( in_array($post_meta_key, $numeric_fields) ) {
          $post_meta[$post_meta_key] = 0;
        }
        // serialized field type
        if ( in_array($post_meta_key, $serialized_fields) ) {
          $post_meta[$post_meta_key] = array();
        }
      }
    }
  }
  return $post_meta;
}
Achtung: hier wird immer nur das erste Feld mit dem gleichen Namen genommen(wie get_field()). Es könnte auch mehrere davon geben, ist aber selten bzw von deiner Felderkonfig abhängig.

Verwendung im Loop:
PHP:
<?php
  $post_meta = myTheme_get_post_meta();
  echo apply_filters('the_content', $post_meta['meintext']);
?>
Ergänzung ()

Zum Abschluß noch eines: Filter sollten immer bei der Ausgabe angewandt werden. Nicht als Variable speichern und wenn, dann im Scroll-Sichtbereich. Wenn die in einer anderen Datei oder sehr weit weg gesetzt wird, könnte sie sich unterwegs nochmal verändern. Das birgt zukünftige Bugs, Konfusion und Sicherheitslücken.

Weiteres: Custom Fields Namen sollten per Konvention immer mit einem Unterstrich beginnen. Quelle müsst ich erst raussuchen. Ich würde auch empfehlen, die zu prefixen, da Plugins ggf weitere Felder hinzufügen und die Namen nicht gleich lauten sollten, also in dem Beispiel: _myTheme_meintext
 
Zuletzt bearbeitet:
Du kannst wenn du im ACF - wenn du ein Textfeld anlegst, definieren ob er mit oder ohen Zeilenumbrüche ausgegeben werden soll.

1686656144645.png


Der standard (also wenn du nichts einstellst) ist "keine formatierung". Und dann kannnst du es auch mit get_field() oder the_field() ausgeben ohne den Inhalt vorher noch den Content Filter zu jagen.
Ergänzung ()

Und als Ergänzung - wenn du weiterhin Advanced Custom Field nutzen willst würde ich den ganzen Beitrag von @netzgestaltung direkt wieder vergessen.

Du kannst im Grunde bei jedem Feld bei ACF auswählen wie du die Rückgabe formatiert haben willst. Z.b. bei einem Farb Feld ob du ein RGB Array, oder nur Hex Code haben willst, wie Zahlen oder ein Datum formatiert sein sollen, etc.

Wenn du diese Rückgaben dann noch durch eigene Filter jagst, wirst du am Ende nie die Rückgaben so formatiert haben wie du sie gerne hättest.

Die Auflistung von netzgestaltung macht nur Sinn wenn du Custom Fields ohne Plugin (wie ACF) verwendest - weil du dann nämlich all das manuell machen musst was ACF halt schon für dich tut.
 
Zuletzt bearbeitet:
@kim88 hat da schon recht ;-) aber ich will ja selber formatieren. Einer der Gründe für mich, ACF nicht zu nutzen, meine Policy das Frontend ganz selber zu machen und keinen Plugins/Frameworks zu überlassen.
 
Danke für die Antworten und Mühen :) Tatsächlich hat die Einstellung beim Textfeld am einfachsten geholfen, da brauche ich gar nichts weiter zu filtern. the_content hatte das Problem mit sich gebracht, dass ich bereits andere Funktionen daran angehängt hab, die er mir dann unter den Text gerendert hat, bevor der eigentliche Beitrag weitergeht.
 
  • Gefällt mir
Reaktionen: netzgestaltung
Zurück
Oben