From Joomla! Documentation
Revision as of 15:01, 6 April 2014 by P.Alex
This article or section is incomplete, which means it may be lacking information. You are welcome to assist in its completion by editing it as well. If this article or section
What is Microdata?
Microdata is a way of adding contextual information to your website and its contents, allowing search engines to better understand the information you provide them with.
Contextual information allows search engines to understand the meaning of the information presented on your website, which allows it to better answer more verbose 'natural language' queries where an understanding of the meaning helps to interpret the most relevant content to be displayed.
Microdata can be used to explain just about anything you would ever want to explain, and there are more 'schemas' being added on a regular basis. There are several vocabularies in existence, however at present the system favoured by search engines is that of schema.org.
To understand how search engines use the microdata information take a look at this short video.
How do I use Microdata?
Microdata can be added to Joomla! using template overrides or with the use of plugins which allow you to insert microdata into specific resources.
As of Joomla! there is a library within Joomla! which allows developers to pull in microdata without needing to format it correctly.
JMicrodata is a library to implement http://schema.org microdata semantics.
The JMicrodata class uses the types.json file which contains all available http://schema.org Types and Properties.
types.json file was automatically created with the https://github.com/PAlexcom/Spider4Schema web crawler.
For some usage examples you can see the library test file https://github.com/joomla/joomla-cms/blob/master/tests/unit/suites/libraries/joomla/microdata/JMicrodataTest.php
How do I use the JMicrodata library?
First of all you need to make an instance of the library in your extensions:
$microdata = new JMicrodata('Article');
So let's suppose that you have the following string which is part of your article and the current scope is Article:
$microdata = new JMicrodata('Article'); echo 'Written by Alexandru Pruteanu';
And the microdata you need to add is an author property:
$microdata = new JMicrodata('Article'); echo 'Written by ' . $microdata->content(“Alexandru Pruteanu”)->property('author')->fallback('Person', 'name')->display();
The library will display:
Written by <span itemprop='author' itemscope itemtype='https://schema.org/Person'> <span itemprop='name'> Alexandru Pruteanu </span> </span>
What happens if the current scope is something else than Article, for example a Product scope, and the current scope doesn't have an author property?
$microdata = new JMicrodata('Product'); echo 'Written by ' . $microdata->content(“Alexandru Pruteanu”)->property('author')->fallback('Person', 'name')->display();
Well it will fallback in:
Written by <span itemscope itemtype='https://schema.org/Person'> <span itemprop='name'> Alexandru Pruteanu </span> </span>
If I want to disable the microdata semantics output?
You can simply disable the microdata output by calling the following function:
The library will display the following:
Written by Alexandru Pruteanu
All Microdata HTML output is handled by the JMicrodata class.
the HTML Scope of the given Type, must be inside a HTML tag element.
the HTML of the given Property, must be inside a HTML tag element.
JMicrodata::htmlSpan($content, $property = "", $scope = "", $inverse = false);
<span itemscope itemtype="http://schema.org/$scope itemprop="$property"> $content </span>
the microdata in a tag, there is also available a JMicrodata::htmlDiv() method with the same functionalities.
JMicrodata::htmlMeta($content, $property, $scope = "", $inverse = false);
<meta $property $scope content="$content">
the microdata in a <meta> tag with the content for machines, this method does not add the meta tag in the <head> section of the page.
$microdata = JMicrodata($type = "", $flag = true);
Create a new instance of the JMicrodata class and setup the current Type, the flag param is for enabling or disabling HTML microdata semantics output. Fallback to Thing Type if the Type isn't available or given.
$microdata->enable($flag = true);
Enable or Disable HTML Microdata semantics output.
Return true if Microdata semantics HTML output are enabled.
Set a new Schema.org Type, there is also a $microdata->getType() function to retrieve the current Type.
Setup the Property if available in the current Type Scope, there is also a $microdata->getProperty() function to retrieve the current Property.
$microdata->content($value, $machineValue = null);
Setup a Text value or Content value for the Microdata, there is also a $microdata->getContent() function to retrieve the current Text value.
Setup a Fallback Type and Property, there are also the $microdata->getFallbackType() and $microdata->getFallbackProperty() to retrieve the Fallback Type and Fallback Property. Fallback to Thing Type if the Type isn't available, Fallback to null the Property if isn't available.
the HTML with the Scope of the current Type, must be inserted inside a tag element.
$microdata->display($displayType = "", $emptyOutput = false);
Return the Microdata HTML, if the Property isn't available it checks for a Fallback, otherwise return .
There are 4 types of $displayType:
This method contains the HTML Microdata display logic, If you specify the $displayType param, the Microdata will be returned the way you specified and expect — to, Otherwise if the $displayType param is empty it will be processed by the display() method and returned the HTML in the right way, with the expected Property Type (example of expectedTypes = URL, Text, Person ...)
— What happens if you call display($displayType = "meta") ?
The returned HTML will be inside a <meta> HTML tag.
— What happend if you call display()?
The method will automatically check the expected type for the given Property, and will return the right Microdata HTML.
There are 3 types of Microdata:
- nested → example:
itemprop="$property" itemscope itemtype="http://schema.org/$scope
<span itemprop="$property" itemscope itemtype="http://schema.org/$scope">$content</span>
- meta → example:
<meta content="$content" itemprop="$property">
- normal → example: