I've seen this convention pretty much everywhere, and, at times, it comes close to driving me nuts:

<?php //The loop ?>
<?php while ( have_posts() ) : the_post(); ?>
    <?php the_content(); ?>
<?php endwhile; // end of the loop. ?>

Where the <?php and closing ?> are on every single line, even if there is no intervening HTML code.

My question is: Why? Why include all these extra tags?

To me, it seems this convention adds a significant amount of clutter to code, is annoying to follow in the first place, and adds that many more places to accidentally leave out an opening or closing tag.


This is code pulled from the Twenty-Twelve theme, the example given by WordPress.

  • also, shorthand while statements =o
    – Tom J Nowell
    Commented Jan 10, 2013 at 0:08
  • 3
    Flagging to close - there is no definitive answer to this question, and it's certainly not a WP specific issue - any person working with PHP will face this issue
    – anu
    Commented Jan 10, 2013 at 11:16
  • 3
    @anu: First, a question may not always have a single, definitive answer (though it still may have a best answer). The guidelines say "practical, and answerable". Second, yes, this is technically a PHP issue, but I've seen this much, much more in my short time working with WP. So, while this isn't limited to WP, it seems to me to be correlated enough to ask in a WP setting. Commented Jan 10, 2013 at 17:32

5 Answers 5


This is not recommended in any WordPress style guide, and I think it is a bad coding style. Beginners are using this style, maybe because it feels more like HTML …

Unfortunately, the default themes are using this style way too often, so some beginners might think it is part of a code style.

One disadvantage of this style is comment handling. Look closely at the following example and how it doesn't do what the author might expect:

<?php echo 'Important: '; // announcement ?>
<?php echo ' enter the word '; /* start ?>
<?php echo '<b>password</b>'; /* the end */ ?>

Good luck debugging that. :)

Rule: Switch between PHP and HTML context only if you have to create output in of both languages. Use regular line breaks in all other cases.

Update, further thoughts: Every valid HTML file is a complete and valid PHP program. Yes, even if it does not contain a single line of actual PHP code.

If you start from HTML and add small pieces of PHP step by step … you might end up with the style we’re discussing here. That’s where refactoring comes into the game: Once everything runs as expected, rewrite the code until it is as readable as possible, easy to maintain and to extend, without repeating parts.

I guess some people are happy without this last step, and that’s why this won’t die soon.

  • It's a pity that the syntax highlighting above doesn't show what actually happens with that comment...
    – webaware
    Commented Jan 9, 2013 at 23:22
  • 9
    @webaware I think that illustrates the problem even more. :)
    – fuxia
    Commented Jan 9, 2013 at 23:23
  • 1
    Saying "This is not recommended anywhere" goes too far. I recommend this, and though I am very possibly in the minority, I've developed enough themes to hold a semi-valid opinion :).
    – Andy Adams
    Commented Jan 10, 2013 at 1:06
  • 2
    @AndyAdams Fair enough, I have rephrased that. And now go away, you evil recommender. :)
    – fuxia
    Commented Jan 10, 2013 at 1:14
  • 3
    Themes use this style because doing otherwise is just too ugly. When refactoring themes, I'd prefer to rewrite the code to be as readable as possible, and that means not having echo/printf/var_dump all around and to put each control structures inside their own pairs of <? ... ?> to make nesting easier to comprehend. One thing I'd do differently than the OP's example though, is that I'd put the_post(); on its own line.
    – Lie Ryan
    Commented Jan 10, 2013 at 4:16

While I avoid this for PHP comments, I am an avid PHP opener/closer in template files. The alternative involves echoing HTML via PHP strings, which looks even worse in my opinion. As a primitive example:

<!-- Example 1 -->
        foreach ( $list_items as $list_item ) {
            echo "<li><a href='" . $list_item->url . "'>" . $list_item->name . "</a></li>";

<!-- Example 2 -->
    <?php foreach ( $list_items as $list_item ) : ?>
            <a href="<?php echo $list_item->url; ?>">
                <?php echo $list_item->name; ?>
    <?php endforeach; ?>

Is example 2 more verbose? Perhaps? But easier to read and edit, in my opinion. You can imagine how ugly it can get for complex HTML.

Also, just as a side note: using endforeach and endif when writing HTML between your PHP logic enhances readability a ton compared to }.

  • 7
    the huge advantage of }over endif however is that (in many editors) you can easily see where the opening { is and therefore whether everything has been properly closed. Try figuring that out with endif and a whole bunch of conditionals...
    – user2015
    Commented Jan 10, 2013 at 1:10
  • 2
    foreach ( $list_items as $list_item ) printf( '<li><a href="%1$s">%2$s</a></li>', $list_item->url, $list_item->name );two lines, HTML and PHP nicely separated. :P
    – fuxia
    Commented Jan 10, 2013 at 1:18
  • 4
    @toscho: You totally missed the point. You're still mixing PHP and HTML, people that prefers the second style does it because we want to avoid having HTML inside PHP string. I use the second style when using PHP as a templating language because it is the only way to nest a mixture of PHP and HTML sensibly, while I use the former when using PHP as a scripting language because there is usually no good reason to have HTML in the script when you separate the application logic from the template. The second style would be even better if short tags are available: <? ... ?> and <?= ... ?>.
    – Lie Ryan
    Commented Jan 10, 2013 at 3:56
  • 1
    @Piet: if you have troubles matching up braces, you probably never heard of indentation? Also, you should be able to configure to highlight the opening of endif in any decent editors.
    – Lie Ryan
    Commented Jan 10, 2013 at 4:21
  • 4
    @LieRyan Be nice.
    – Rarst
    Commented Jan 12, 2013 at 14:09

This is about choice between seeing page as:

  • as completely PHP-generated entity
  • as HTML document template, powered by PHP template tags

Different people tend to think about it differently. Note that functions rarely use this style, because they feel more like block of pure PHP. On other hand it's not uncommon in templates because they are more spread across files and amount of pure HTML can be easily more than that of PHP in them.

If you look at templating engines (Mustache, Twig, etc) - they look very much like this style except that their syntax tends to eliminate verbosity of plain PHP.

PS I want to note that I am talking about sane embedding of PHP in HTML, not literally opening and ending tags on every line just for the sake of it.


My question is: Why? Why include all these extra tags?

The answer is pretty simple: Audience. When people (not programmers) grab a theme, then FTPing up their install, running the 5min setup and so on already feels like programming to them. When they then want to add or change a single line of whatever in their theme, then they maybe already figured out what HTML is. PHP still will be far out of their reach. So my guess is that the idea behind this is to allow easier adding or removing of elements without breaking everthing when they make a mistake.

Note: This is not what I like, prefer or would recommend. It's just what I think why this happens.


I have found that some new programmers are trained this way. I'm following a 40 hour course on Lynda and the instructor is dropping PHP tags on every line, with the exception of function definitions. It's probably to clearly draw lines between HTML and PHP, which probably helps new people understand where HTML ends and PHP begins. After that, its probably a habit. I was starting to get annoyed by it myself and decided to see if anyone else was complaining.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.