Dynamic meta (keywords, description) - php

I know that that this topic has been elaborated on many times, but I can still not figure out how to do it. Maybe My site structure is not like it should; I don't know.
Anyway, I have the following:
An Index.php containing a heading in which I have :
<meta name="description" content="<?php echo $pg_desc; ?>"/>
<meta name="keywords" content="<?php echo $pg_key; ?>"/>
This index.php is also containing all the referenced stylesheets and jquery code.
Then I have all content of the pages in SQL. Each page in my database is formatted as follows (as a longtext):
<?php ##commented out page name just for my own convenience ?>
<div class="#"
body
</div>
Now I thought I had to put
$pg_desc = "my page is about"
and
$pg_key = "you,name,it"
in the php part, but that did not seem to work. Can anyone help me?

You would need to declare that variables before outputting them to meta tags.
For example:
<?php
$pg_key = "you,name,it";
$pg_desc = "my page is about";
?>
<meta name="description" content="<?php echo $pg_desc; ?>"/>
<meta name="keywords" content="<?php echo $pg_key; ?>"/>

Related

How do I dynamically generate og meta data for Facebook sharing based on content on that page?

I'm trying to figure out a simple way of using PHP to dynamically generate OG meta information for Facebook sharing such as og:title, og:description and other tags based on content that is already on a page.
Here's the URL for reference: http://jonathanmitchell.ca/OPEC/new3.php
The og:title I want to draw from is the "This is the title" which has an ID of news-story-title-on-template.
Any help at all would be really appreciated ... thanks!
You can generate the dynamic og tags.
For eg you want to assign og tags the values according to an ID-
Your object url: http://myobject.com?id=ID
<?php
$id = $_GET['id'];
// manipulate title and image with this id, say $title / $image
?>
<meta property="og:url" content="http://myobject.com?id=<?php echo $id; ?>" />
<meta property="og:app_id" content="APP_ID" />
<meta property="og:title" content="<?php echo $title; ?>" />
<meta property="og:image" content="<?php echo $image; ?>"/>
If you are passing any parameter to your object url, make sure you add the same to the og-tag: og:url (as I've shown in above example)

is this the correct way to add META TAGS using CakePHP 2.4?

I have the default template and a view named home.ctp
When the user call the home page / the home view is rendered inside default.ctp.
In my view I have:
<?php
$this->set('title', 'This is the title');
$this->set('description', 'This is the description');
...
?>
and in my default.ctp I have:
<title><?php echo $title; ?></title>
....
<meta name="description" content="<?php echo $description; ?>">
....
it works correctly, but, is this the correct way to add title and meta tags in CakePHP ?
Thank you!
No
That's not a safe way to output your title and description variables.
Cake does have a helper function for outputting metatags extract from the docs:
<?php
echo $this->Html->meta(
'description',
'enter any meta description here'
);
?>
// Output
<meta name="description" content="enter any meta description here" />
Alternatively
You don't have to use the above function - but if you don't you must take care to escape your variables. Consider what happens with this:
$description = 'something with a "quote in it';
if you just blindly echo variables - you're going to create malformed html and/or permit injection attacks. As such it's perfectly fine to use the code in the question if you escape $title and $description appropriately:
<title><?php echo htmlspecialchars($title); ?></title>
....
<meta name="description" content="<?php echo htmlspecialchars($description); ?>">

How to send data to a previously included PHP file?

I have a header.php and a footer.php file. My HTML header is in header.php and I have an index.php file.
I’m using so (index.php):
require 'header.php';
$example_code = 'example';
︙
require 'footer.php';
And my header.php:
<html>
<head>
<title>
???
<title>
<meta name="description" content="???" />
<meta name="keywords" content="???" />
</head>
<body>
︙
I want to send some data from index.php to header.php to print it there (see the ???). I’m thinking of the header() function but I can’t see any example in the PHP manual.
The best thing you could do is separating logic from presentation. Using an MVC approach, where you take care of all logic in one file, and then display the outcome of what you've done in a presentation only layer.
Besides that, if you want to keep your approach, what you simply have to do is to make assignments before header.php is included. So, suppose you want to change your page title, this is what you need to do:
index.php
<?php
$title = 'My Page Title';
$description = 'My meta description';
$keywords = 'keyword list';
include('header.php');
?>
header.php
<html>
<head>
<title>
<?php echo $title; ?>
<title>
<meta name="description" content="<?php echo $description; ?>" />
<meta name="keywords" content="<?php echo $keywords; ?>" />
</head>
<body>
It's as simple as that. Just keep in mind you can't make assignments to a page/script, AFTER such has been included
Again, though, I'm trying to answer you, not necessarily suggesting this approach. If your application has just a couple of pages, that's ok. If it's bigger (or going to be), something like the MVC pattern (two-step view pattern) is a better alternative IMHO.
php header function got nothing to do with html tag "head" .
<?php
$tpTitle="Helping you to improve your web site";
$pgHeading="Site-Report.com - Helping you to improve your web site";
$pgDesc="Helping you to improve your web site";
$pgKeywords="site-report";
?>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
<title><?php echo $tpTitle ?></title>
<meta name="description" content="<?php echo $pgDesc ?>"></meta>
<meta name="keywords" content="<?php echo $pgKeywords ?>"></meta>
</head>
http://www.cre8asiteforums.com/forums/index.php?showtopic=4558
The header() function is not suitable for what you would like to do. You're merely looking for a variable:
index.php:
$title = 'My Page Title!';
$description = 'This is how I describe it.';
$keywords = 'page, title, describe';
header.php:
<title>
<?php echo htmlspecialchars($title); ?>
<title>
<meta name="description" content="<?php echo htmlspecialchars($description); ?>" />
<meta name="keywords" content="<?php echo htmlspecialchars($keywords); ?>" />

headMeta() in zend_view returns nothing, what am I doing wrong?

I'm using Pimcore with the Zend Framework. In my header view, I output this:
<?php echo $this->headMeta(); ?>
The output is blank.
Instead I've changed it to this:
<meta name="description" content="<?php echo $this->document->description ?>" />
<meta name="keywords" content="<?php echo $this->document->keywords ?>" />
That works fine. The issue here is that I want to use zend correctly and I feel that this is probably not the most ideal approach.
Can anyone coach me on the correct way of performing this?
Thank you!
In your Boostrap.php file you need to init the head with values like this:
$view->headMeta()->appendHttpEquiv('Content-type', 'text/html; charset=UTF-8')
->appendName('description', 'mySite');
$view->headTitle()->setSeparator ('-')->headTitle('myPage');
$view->doctype('HTML4_STRICT');
This code belongs in the _initViewHelpers function. Then you can call it in the <head>:
<?php
echo $this->doctype ();
?>
<html>
<head>
<?php
echo $this->headMeta();
echo $this->headTitle();
?>
//...

PHP: How can I reference variables from an included file before it's been included?

How can I reference variables from an included file before it's been included? Or can I somehow include the file (so I can lead its variables later) before its HTML is literally inserted into the body tag? Or can I contain all of home's body content in one big variable that I can echo as well in the index?
Here's what I'm trying to do:
index.php
<html>
<head>
<title><?php echo $title; ?></title>
<meta name="description" content="<?php echo $description; ?>" />
<meta name="keywords" content="<?php echo $keywords; ?>" />
</head>
<body>
<?php include 'home.php'; ?>
</body>
</html>
home.php
<?php
$title="home page";
$description="this is the home page";
$keywords="home, awesome, yes";
?>
this is the home page content that gets inserted into the body!
Just move the include statement to the top of the file.
This will expose all values, functions and variables to all subsequent lines.
<?php include 'home.php'; ?>
<html>
<head>
<title><?php echo $title; ?></title>
<meta name="description" content="<?php echo $description; ?>" />
<meta name="keywords" content="<?php echo $keywords; ?>" />
</head>
<body>
</body>
</html>
Short answer version: You can't. You'll get an 'Undefined variable' notice if you do that.
I find it is usually much more convenient to have a header.php (and a footer.php for that matter) which gets included in the index, home, contact or whatever other file. The advantage is that you don't have redundant code, and if you need to make a modification in the header or footer, you need to only modify one file.
So for example, 'about_us.php' would look like:
<?php
include('path/to/header.php');
#body goes here
include('path/to/footer.php');
?>
And your header would be something like:
<?php
$title = ucfirst(str_replace('_', ' ', substr(basename($_SERVER['PHP_SELF']), 0, -4));
?>
<html>
<head>
<title><?php echo $title; ?> page</title>
<meta name="description" content="this is the home page" />
<meta name="keywords" content="home, awesome, yes" />
</head>
<body>
The $title variable will be the file name, minus the extension, with all underscores replaced by spaces and the first letter of the first word capitalized. So basically about_us.phpwould be converted into "About us". This is not necessarily a general solution, but I gave it as an example keeping in mind that you wanted to use a dynamic title in your original example. For dynamic description and keywords, based on the file name you could also assign different values with the help of a switch() statement.
UPDATE:
Another solution, although kind of the reverse of what you're asking, but at the same time much closer to what you're looking for would be to write the header.php like
<html>
<head>
<title><?php echo $title; ?> page</title>
<meta name="description" content="<?php echo $desc; ?>" />
<meta name="keywords" content="<?php echo $keywords; ?>" />
</head>
<body>
... the footer like ...
</body>
</html>
... and then include them in your other files:
<?php
$title = 'Your title';
$desc = 'Your description';
$keywords = 'The, big, brown, fox, jumps, over, the, lazy, dog';
include('path/to/header.php');
?>
<!-- body goes here -->
<?php
include('path/to/footer.php');
?>
This way, you are assigning all the variables BEFORE you are including the files in which they are being referenced, you have distinct files for all the links and you don't need fancy switches. Also as a side note, wrapping the body's HTML in PHP is simply bad practice. Try to keep the HTML separated from the PHP as much as possible in general. It will help both you, and whoever is going to do work on the code in the future.
Hope this helps !
I would have a look at using a template system. Separating your code from the content will save you a lot of trouble in the future. it will also allow you to change the html template easily in the future. plus you can see your template without having to run the php code.
have a look at smarty templates
http://www.smarty.net/
you would then build a template file: "template.tpl"
<html>
<head>
<title>{$title}</title>
<meta name="description" content="{$description}" />
<meta name="keywords" content="{$keywords}"/>
</head>
<body>
{$home_content}
</body>
</html>
and some php code to run:
<?php
require_once('Smarty.class.php');
$smarty = new Smarty();
$smarty->assign('title' , 'Your title');
$smarty->assign('description' , 'Your description');
$smarty->assign('keywords' , 'The, big, brown, fox, jumps, over, the, lazy, dog');
$smarty->assign('home_content' , 'this is the home page content that gets inserted into');
$smarty->display('template.tpl');
?>
And that is just scratching the surface of what a templating system can do. you can repeating or optional bocks, include other templates, etc etc.

Categories