PHP SEO: Page-Level Titles, Meta Descriptions, & More


When it comes to updating title tags, meta descriptions, canonical link elements, etc. on a page-by-page basis, we often rely on the power of the client’s CMS. Whether we’re using WordPress plugins or Drupal modules to get the job done, we generally have a process that is efficient and feasible. No tinkering with template files. No scouring the web for alternative solutions. Simple implementation – just the way we like it.

Content Management Systems with built in SEO utilities are great. What happens, though, when you’re tasked with implementing all of the pertinent HTML elements page-by-page on a PHP based website with a static <head>? Let’s dive right in.

1. Make that <head> dynamic!

In most cases, each static PHP file, be it index.php, contact.php, what have you, will reference the same header.php file via an include statement:

The include statement tells the server that any code within header.php should also be included in the file being requested. This way, we don’t have to write a lot of the same HTML on every content page. Instead, we have this one static file from which we can pull the necessary code. Note that the header.php file doesn’t necessarily contain only the HTML <head>. Generally, it will include any code that is reusable at the top of the HTML document throughout the website (including the logo, navigation, banner, etc.). Let’s look at an example of code we might find in header.php:

This is a bit stripped-down, of course, but it’s serviceable. Notice, though, that our title tag and meta description have static text values. Even if we edit these to be a bit more descriptive of a particular page, we’ll be effectively applying the same title and meta description to every page on the website. Not good. Fortunately, we can make these dynamic values (unique to each page) by using PHP variables. We’ll use the echo construct to place the necessary page-level variables (which we haven’t yet created) in the right spots in header.php.

It’s safe to say that we’ll be implementing titles and meta descriptions on each page of the website. What about something like a canonical link element or meta robots markup, though? We might not want these on every page, but rather just select pages. To handle these elements, we’ll use a couple of conditional statements. If the canonical URL and/or robots content is defined for a given page, then we’ll include the element(s) in the <head>. If the condition within the parentheses is met, then the code within the brackets ({ ... }) is executed.

Now that we have ourselves a <head> with elements that rely on page-defined variables, we’ve done most of the “hard” work. Let’s move on to defining these page-specific variables.

2. Define page-specific PHP variables

So, for each page on our site – all individual PHP files – we’ll need to define, at a minimum, two variables ($pageTitle and $pageDescription) before our include(header.php) statement. Ideally, we would write in some conditionals to catch cases where these variables aren’t defined; but for now, we’ll just be extra careful to define them on each page. We have the option of defining two additional variables ($pageCanonical and $pageRobots), as well. To define a variable, we use the syntax: $variable = "This is a string";. Let’s go ahead and assign values to all four of our variables for the home page. We’ll be working with the index.php file. (The topic of our site is Orange Widgets).

Simple enough, right? We’ve defined our title, meta description, canonical URL, and meta robots content with four PHP variables. Let’s see what the top of the source code looks like for index.php.

Not too shabby, eh? While it might seem like a pain to declare these variables on a page-by-page basis, it’s really not much different than using All in One SEO for WordPress or something comparable for another CMS. Once you’ve familiarized yourself with the concepts outlined above, you’ll find that editing the files directly isn’t as taxing a process as you might have thought. For those of you working on small PHP-based websites, I highly recommend implementing the dynamic <head> elements we’ve discussed. What takes minutes to implement could yield years’ of worth.

Any cool tips or tricks when it comes to doing SEO for PHP-based websites/applications? Share ’em in the comments below!

Travis is a former LunaMetrician and contributor to our blog.

  • Antti Nylund

    Dropping my 2 cents

    Don’t know if this is the most efficient solution server-wise, but if the site is less than 100 pages I favor switch clause.

    switch ($pageurl) {
    case ‘homepage.php’:
    $title = “”;
    $metadescription = “”;
    $canonicalURL = “”;
    $whateverYouWantToDefine = “”;
    case ‘someotherpage.php’:
    $title = “My default title”;


    For the sake of upkeep you might want to consider by default connect page main heading (h1) and title and small insert with meta description.

    • Travis Loncar

      Thanks for the example, Antti. My first reaction was that a long switch statement could get a bit confusing (if the URLs aren’t especially indicative of the page content). However, with a smaller site, I could see a commenting convention making this easier to work with. (In fact, I guess the same issue exists when editing individual page files.) This is where mapping content to URLs in a spreadsheet pays off.

  • Nice text – all in one place. I think another good practice is to handle some constant parts of title and/or description. For example:

    $pageTitleCommonSuffix = ‘The Best Orange Widgets’;
    $pageTitle = ‘Orange Widgets’ . ‘|’ . $pageTitleSuffix;

    • Travis Loncar

      Thanks, Mikolaj. Good point. If you find that it is important to brand your titles, defining the common suffix in the header could be a time-saver. I think it’s important to be mindful of character length when you’re doing this. It’s easy to forget that the suffix is being appended.

  • I was just talking about using conditional formatting on static PHP headers. Your code came out 95% the same as mine. Nice work!

  • If i use the same page with different seo friendly urls changing title and meta description accordingly will it help seo ( Provided i put rel=canonical to the primary page)

  • I am rather new to website administration and I need a few clarifications.

    I am trying to make my website easier to manage and your content is very interesting and applicable to what I am looking for.

    Will removing this line make the page visible or do you have to do something else to it?
    $pageRobots = ‘noindex,nofollow’;

    According to google support (link below), the canonical information is for SEO, preventing numerous extremely similar hits (when pages are very similar). Am I getting this right? I am guessing that ‘ . $pageCanonical . ‘ (in the header) looks for the second entry on the given page? I’m guessing that if I do not have multiple extremely similar pages, I do not need these entries to put SEO information within the page?

    Header entry:
    echo ”;

    page entry:
    $pageCanonical = ‘’;

    Google info on rel=”canonical”

  • Nice,Was Working on a project and was looking for something similar.

  • Nice tutorial Travis. This article helped me very much. Thank you

  • thank you..
    i have been setting my new site and need this treatment

  • Hello Travis Loncar,

    I tried your code and it works great for variables.

    How do you do HTML blocks like say I wanted to include a div or something a little bigger than just a variable?

    Thanks again.

  • Boni Satani

    Hi Travis,

    I tried the code you have provided but its not working.

    Dont know why. Little help appreciated

  • Amber Amrien
  • Vishwas M

    Try checking your site status with and at the suggestion level you can opt for the how to fix option and you’ll get the respective code which you need to use for your website, in order to work based on individual web technology employed.

  • Thank You, that was useful!

  • I need some pages with default meta descriptions and some pages with page description?> how can i add?

  • Parker Boyack

    great stuff. Thanks Travis!

  • in our web page what we use its (no index, no follow) or (index, follow) which is better

    • Sushil Kundu

      index & follow is given for robots.txt file. If you have created the path for robots.txt file with your associative domain like This robotsl.txt file allow or disallow the search engine bot to crawl your web pages.. If you want the search engine bot crawl your webpages & rank your website globally. Then use (index,follow) meta tag with robots.txt file. If you don’t want the search engine bot crawl your page then use (no index,no follow) meta tag. By default the search engine bot follow & index all pages of your domain diretory.

Contact Us.

Follow Us



We'll get back to you
in ONE business day.
Our Locations
THE FOUNDRY [map] LunaMetrics

24 S. 18th Street
Suite 100

Pittsburgh, PA 15203


4115 N. Ravenswood
Suite 101
Chicago, IL 60613


2100 Manchester Rd.
Building C, Suite 1750
Wheaton, IL 60187