Roots Discourse

Controller method outputting the_content() html tags as text; the_excerpt() does not work at all

I have been trying to create a selectable template that behaves like a WordPress default archive.php page. I’m using Sage 9, and specifically I’m using Controller to route some custom ACF fields as well as default WordPress functions, specifically the_excerpt() and the_content. I’ve had limited success in getting these to output anything at all, and when I do, html tags are either omitted entirely, or they show up inline with the text, not as html characters that help structure the data, but just as characters of text, visible on the page. I’m really not sure what to do here. I think I may need to add another loop somewhere but I’m not sure.

(As an aside that I think is probably related: For quite some time, I couldn’t get any inline PHP directives like {{ get_the_author() }} or (at)php the_author() (at)endphp to work, but then I added (at)while (have_posts()) (at)php the_post() (at)endphp and they started working).

Here is my Controller method for the page

public function archiveLoop()
$archive_items = get_posts([
‘meta_query’ => array([
‘key’ => ‘featured’,
‘value’ => ‘1’,
‘compare’ => ‘!=’,
return array_map(function ($archive_items)
return [
‘archive-content’ => apply_filters(‘the_content’, $archive_items->post_content),
‘permalink’ => get_post_permalink($archive_items->ID),
‘archive-feat-img-url’ => get_the_post_thumbnail_url($archive_items->ID),
‘archive-feat-img-alt’ => get_the_post_thumbnail_caption($archive_items->ID),
‘archive-title’ => get_the_title($archive_items->ID),
‘archive-excerpt’ => get_the_excerpt($archive_items->post_content),
}, $archive_items);

Here is the template file

  <!-- @ resources/views/archive.blade.php -->
  Template Name: Blog
@if (have_posts())
@while (have_posts()) @php the_post() @endphp
  @if (!have_posts())
   <div class="container700">
    <div class="alert alert-warning">
      {{ __('Sorry, no results were found.', 'sage') }}
    {!! get_search_form(false) !!}
  @if (have_posts())
<div class="container700">
@while (have_posts()) @php the_post() @endphp
//I forgot to include the loop above, and until I did that, entry-meta.blade.php wasn't outputting any dynamic data;
  {!! get_the_posts_navigation() !!}

Here is the section I’m having trouble with; included via the previous block of text

  <!-- @ resources/views/partials/content-archive.blade.php -->
@foreach ($archive_loop as $archive_items)
<div class="post-excerpt">
  <article @php post_class() @endphp>
      <div class="feat-img-container">
        <img class="feat-img" src="{{ $archive_items['archive-feat-img-url'] }}" alt="{{ $archive_items['archive-feat-img-alt'] }}" />
      <h2 class="entry-title"><a href="{{ $archive_items['permalink'] }}">{{ $archive_items['archive-title'] }}</a></h2>
    <div class="entry-summary">
      {{ $archive_items['archive-content'] }}
      {{ $archive_items['archive-excerpt'] }}

And finally, here is a pic of what is rendering on the pertinent section of the page:

By default, Blade {{ }} statements are automatically sent through PHP’s htmlspecialchars function to prevent XSS attacks. If you do not want your data to be escaped, you may use the following syntax:

Hello, {!! $name !!}.

You’re echoing escaped text, hence the plaintext tags (if you examine your HTML source you’ll see they’re HTML entities).

Your aside is almost certainly unrelated: many WordPress tags have to be inside The Loop in order to function, and Sage is no different. However, data provided by Controller is not tied to the loop in that way, and echoing variables passed from a Controller will (generally) not be affected by the loop.

1 Like

Thanks! I forgot about that syntax for unescaped content.