Rah's Metas

A tiny SEO- and meta-tool for Textpattern CMS. Build descriptions, simple meta info, rel links and prevent double content.


Version 1.5 Oct 30, 2011
Other versions...

A cup of coffee
via PayPal

Intro and description

A Textpattern plugin used for SEO. The plugin includes basic SEO tools, from semi-automatic metainformation generation to useful redirections that prevent double content as rah_metas is also able redirect requested messy urls to cleans, leaving no space for the double content fault.

List of features

  • Outputs automatic metadescriptions from article’s body, excerpt or custom field.
  • Limits and customizes the automatic metadescription by word or character limit, strips all XHTML and invalid characters.
  • Redirects messy urls to clean ones, if cleans are in use. In example, ?id=xx and ?s=xx would be redirect to the correct place, preventing possible double content.
  • Outputs other useful meta as author, description and language.


Minimum requirements:

  • PHP 5+
  • Textpattern 4.0.4+


  • PHP 5.1.2+
  • Textpattern 4.4.1+

Installation and usage

The general behavior stands: paste plugin code to the plugin installer textarea and run the automatic setup. Then just activate the plugin and you are ready to use new tags that plugin includes like others.

For usage, basically just put <txp:rah_metas />-tag with wanted attributes to inside your site’s <head>-tags. As the plugin’s tag outputs metainformation, and meta-tags, it shouldn’t be used outside <head>-tags.


The tag is <txp:rah_metas /> and attributes for it follow. Default value "" means that the attribute is unset and by default not used.

To block an browser’s image toolbar. Allowed attributes are true and false. By default not used.
Example: imagetoolbar="false" Default: ""

The language used by the site. Value should be a language code, for example en, de, it or se.
Example: language="en" Default: ""

Directs how robots should navigate on the page. Valid values include index, noindex, follow, nofollow. The values can be combined.
Example: robots="index, follow" Default: ""

Author name that you want to show as the page’s author. Usually you, company or the website’s name. This value is used as the fallback when useauthor is used, but no author is available.
Example: author="John Doe" Default: ""

If set to 1, <txp:author /> is used to populate author metadata when possible. The value set with author attribute will be used as a fallback in list context and such.
Example: useauthor="1" Default: "0"

Outputs copyright meta. Value is used as the content.
Example: copyright="Copyrihts &copy; 2007 John Doe" Default: ""

Description related attributes

A default meta description that will be shown in list context, or when there isn’t an article description to show and description_replacement is set on.
Example: description="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce at dui eget est congue aliquet. Quisque sed nunc" Default: ""

Which artile field is used for the automatic meta description. The attribute takes comma separated list of fields. The first field in the list that isn’t empty is used as the meta description. Available values: body, excerpt or custom field’s name. If set empty, the automatic description isn’t used.
Example: description_from="body,excerpt,metadescription" Default: "body,excerpt"

Limits the amount of words shown in the automatic meta description.
Example: words="15" Default: "25"

The maximum number of characters used in the generated automatic meta description.
Example: maxchars="170" Default: "250"

Ending trail used in the end of the automatic metadescription. Trail is only shown if the description is longer than the limit set by maxchars and/or words.
Example: description_trail="" Default: "&hellip;"

If set on (1) and there isn’t automatic description available, description attribute is used as the description instead. By default this feature is not used.
Example: description_replacement="1" Default: ""

If set to 1, will remove raw Textile markup from the description. By default the attribute is unset, and the feature is not used. Usually this feature isn’t required, but it might be good if you are supplying the description in a custom field and you are using Textile there. Textile in custom fields isn’t, by default, parsed by Textpattern.
Example: escape="1" Default: ""

Keyword related attributes

Default keywords that will be used as keyword meta in a list context, or when there isn’t any keywords set for an article and keywords_replacement attribute is set on.
Example: keywords="life, Doe, cat, dog" Default: ""

Which field is used for the keyword meta. The attribute takes comma separated list of fields. The first field in the list that isn’t empty is used as the keywords. Available values, any article field: keywords, body, excerpt or custom field’s name. If empty, the feature isn’t used.
Example: keywords_from="keywords,excerpt" Default: "keywords"

If there isn’t keywords available for an article, use default defined in keywords attribute instead.
Example: keywords_replacement="1" Default: ""

Limits the words used in the keywords. Takes a number.
Example: keywords_limit="5" Default: "25"

Redirect related attributes

Use messy to clean redirect. Redirects messy requrests to clean urls. Use this only if you use clean urls. With messy urls this only causes eternal loop.
Example: messy_to_clean_redirect="1" Default: ""

The code of redirection, value should be three numeric stannard status code protocol.
Example: redirect_code="302" Default: "301"

Rel link related attributes

Use rel link to point next page’s location to the browser. relnext attribute’s value is used as <link rel="next" /> tag’s title. Ideal values are Next, Go to next and so on. The attribute, relnext, adds a next rel link meta that points to the next section page or article by posting date. If attribute is used (filled) then used, if unset (empty) then not.
Example: relnext="Next" Default: ""

Use rel link to point previous page’s location to the browser. relprev attribute’s value is used as <link rel="prev" /> tag’s title. Ideal values are Previous, Go to prev and so on. The attribute, relprev, adds a next rel link meta that points to the previous section page or article by posting date. If attribute is used (filled) then used, if unset (empty) then not.
Example: relprev="Previous" Default: ""

Manually defines relative prev url. Value should be a URL address. The URL is only used if automatic URL isn’t found.
Example: prev_url="http://www.example.com/path/to/id" Default: ""

Manually defines relative next url. Value should be a URL address. The URL is only used if automatic URL isn’t found.
Example: prev_url="http://www.example.com/path/to/id" Default: ""


#1: Basic usage

<txp:rah_metas keywords="dog, cat, house" description="Lorem lipsum" maxchars="170" words="15" />

#2: Using content preferring. First look at the custom field, then main article (excerpt, body) fields.

<txp:rah_metas description_from="MyCustomFieldName,excerpt,body" />

#3: Use rah_metas tag inside article_custom block

If rah_metas is placed directly inside article_custom (or article) tag, it can be used to pull the meta data from that specific article.

<txp:article_custom id="5">
	<txp:rah_metas />

In the code above, we took the meta data from the article where the ID is 5.

#4: How to not output description at all, but keep all other features intact?

<txp:rah_metas description="" description_from="" />

If description and description_from are set empty, no description will be generated. Same applies to keywords (see keywords and keywords_from attributes).


Version 1.5

  • Wrapped set of extra functions into a class, and removed the prefixing from the new methods.
  • Added comments, cleaned up some code.
  • Removed rah_metas_textile() function.

Version 1.4

  • Now automatically converts values supplied in keywords_from and description_from to lowercase. Thank you for reporting, pompilos.
  • Now uses lAtts() just once.
  • Removed dublicated trim() from rah_metas_strip().
  • Removed rah_metas_atts().

Version 1.3

  • Now description_from and keywords_from take comma separated list of fields. The first field in the list that isn’t empty is used as keywords or description.
  • Removed attribute prefercontent. Using the attribute will throw notice in testing or debugging mode.

Version 1.2

  • Now the <txp:rah_metas/> tag can be also used directly inside <txp:article_custom/> and <txp:article/> blocks. That means that the tag now works in article lists. You just have to point it to the article. See example number 3.
  • Now any article field can be used in description_from and keywords_from attributes. Even title, authorid, override_form or status.
  • Now dublicate keyword “uniqueing” is done with array_unique().
  • Fixed keywords code escaping.

Version 1.1

  • Added: attribute keywords_limit.
  • Added: removes doublicated words from keywords.
  • Added: list view’s description is effected by word and character limits.
  • Fixed double "=" define bug.
  • Now escape attribute effects also body and expert, not only custom fields.
  • Now keywords are escaped, striped for tags and parsed.
  • Counts white space into chars.
  • Removed imagetoolbar attribute validation.

Version 1.0.5

  • Added attribute: escape.
  • Rebuild description’s word and chars counting: now always counts correctly: doesn’t ever cut words.
  • Optimized parsing and speed: plugin is around 20% faster than before.
  • Removes &#8230; from end of the description if trails are used and description is cut from context and shortened.

Version 1.0.4

  • Added attribute: relnext.
  • Added attribute: relprev.
  • Minified amount of used globals by one.

Version 1.0.3

  • Fixed last words truncate bug.

Version 1.0.2

  • Fixed some typos in documention.
  • Now prefercontent also works with custom_fields.

Version 1.0.1

  • Debugged version 1.0: status now stable.
  • Fixed a bug: now whitespace is stripped from beginning and end of the description content.

Version 1.0

  • Improved documentation.
  • Little speed improvement.
  • Removed charset-attribute, it ain’t needed as Textpattern sends charset via headers – and it must not differ.
  • Merged customfieldexcerpt-attribute with description_from.
  • Included redirecting functions that prevent double content when using clean urls.
  • Validates imagetoolbar-attribute to false or true.
  • Added attribute: description_replacement.
  • Added attribute: keywords_replacement.
  • Added attribute: description_from
  • Added attribute: messy_to_clean_redirect.
  • Added attribute: redirect_code.
  • Added attribute: description_trail.
  • Added invalid charasters removing for custom fields.
  • Removed Textile removing from body and excerpt, that was meant to remove Textile + XHTML bugs caused by user’s invalid article code, and used instead body_html, and just stripped HTML: it’s faster.
  • Some users wanted to be able input invalid characters to description: now it is possible, if you turn Textile off: why should we validate meta description, if article’s body itself is invalid, because writer doesn’t use valid HTML special characters.

Version minor 0.9.2

  • One bug fix, created by little one chars typo in the code.

Version minor 0.9.1

  • Removed a debugging error, caused by undefined variable if there were no description.

Version 0.9

  • Added attribute: copyright.
  • Added attribute: useauthor.
  • Added attribute: customfieldkeywords.
  • Added attribute: customfieldexcerpt.

Version 0.8

  • Added Textile remover: removes Textile completely from description
  • Cleaned up the code

Version 0.7

  • Fixed bug that appears if single article has no body or excerpt. Only shown in debugging.

Version 0.6

  • Fixed a code-removing bug
  • Now removes all code from automatic metadescription

Version 0.5

  • Finished bug-testing

Version 0.4

  • Add missing variable

Version 0.3

  • Compined two separated functions
  • Improved the code by fixing globals

Version 0.2

  • Replaced automatic-medescription’s ending points &#8230; with &hellip;
  • Added new attribute: imagetoolbar

Version 0.1

  • First release

Known issues

Redirects might not always work on old fast-cgi (requires clarifation), but on other systems fine.

Thanks to

  • All folks that thanked me by making this plugin available.
  • rolograaf and pat64 for great ideas of keywords.
  • fuls, strawberryfusion, jim_01, pompilos and ian_ep for reporting me some bugs.
  • maniqui for the ideas.
  • And all the other great Textpatternists.