This plugin hasn’t been tested with the latest 3 major releases of WordPress. It may no longer be maintained or supported and may have compatibility issues when used with more recent versions of WordPress.

Keyword Statistics


With this plugin you can optimize your WordPress blog for search engines.
It can automatically generate meta informations (like keywords and description for example) needed for the search engine optimization (SEO) of your blog.

The Keyword-Statistics-Plugin checks the content of a post or a page for keyword density (single words and optionally 2- and 3-word phrases; for each the 1-10 most commonly used can be displayed).
It can update its informations automatically while the author is writing his content in a variable interval (every 1-10 seconds) or manually by clicking on a button.
The script comes with english and german stopwords, which optionally can be filtered out before calculating the keyword densities.
Moreover the commonest keywords are extracted in a list as a META keywords suggestion.
Based on this list a META description can be created and automatically set.
So the plugin can be used to do the on-page part of your SEO strategy.


  • Keyword density statistics about the usage of single keywords and keyphrases (2- and 3-words)
  • Setting an individual title for each page and post
  • META keywords will be set automatically based on the page content
  • META description generated from content based on the keyword statistics
  • Definition of individual titles, keywords and descriptions for all kinds of content aggregations. A set of variables that can be used on the specific aggregations – keywords will be filled up automatically to the maximum number of keys (you can define this too) with the ones generated from the listed posts.
  • Predecessors and successors that will be added to all page titles and descriptions served by your blog
  • Sitewide definition of meta keywords that will appear at the end or the beginning of the keyword list on each page of your blog – in addition to the ones defined for single posts or pages and at the various aggregations keyword lists.
  • Page-specific control of robots META
  • Generation of Canonical URLs – also for all kinds of content aggregation (lists with last posts, archive, tag, category, search results and author including pagination)
  • Controls the index/follow settings of the content aggregations (full control of robots for the specific aggregations)
  • Configuration of ODP, Yahoo! Directory and ARCHIVE (archiving of the content for search engines like google but also at META
  • Prevents urls resulting in a not found response (404) from indexation
  • All meta tags generated by the plugin can be switched off separately to prevent collisions with other plugins
  • Using nonces for plugins security
  • Allow or deny indexation of the blogs feeds

Stopwords filtered for:

  • Brazilian Portoguese
  • Bulgarian
  • Czech
  • Danish
  • Dutch
  • English
  • French
  • German
  • Hungarian
  • Polish
  • Slovak
  • Spanish
  • Turkish

Backend translations for:

  • English
  • German
  • Slovak

Please notify: The SEO-relevant meta-information (meta keywords, meta description and the robots meta-tag) will be generated – and served – only for pages and posts which are saved after plugin installation.
You have to open and save an older post or page if you want to generate the meta data for the particular content.
For now there is no way to do this automatically.

The administrator can allow ordinary authors to change META informations or not.
Even if changing is disallowed an author can see the keyword density and can be guided from the statistics while he is writing the content.
He can do the on-page search engine optimization incidentally by knowing which keyword density should be reached.
This makes SEO easier for authors.

Learn more about this plugin on keyword statistics plugingerman


  • Settings for sitewide used predecessors and successors that should be added at meta informations on any page served by the blog (e.g. main keywords for the domain or branding titles and descriptions)
  • Dialog for setting meta data for the different content aggregations
  • Options for metadata delivery
  • Settings for the automatic generation of meta informations
  • Defaults for controlling robots
  • Configuration of the keyword density checker
  • Options to control visibility of additional input fields (for title, meta keywords and meta description of single posts or pages) in post-/page-edit dialog
  • Keyword statistics and additional input fields at page-/post-edit dialog


  • Just copy the keyword-statistics folder to the plugins directory of your blog.
  • Enable the plugin in your admin panel.
  • Use the options panel to choose the settings you want.

Updating: If you are updating by uploading the files by your ftp program you should login as admin after it.
This way options added in later versions will be initialized without changing the way your blog has served meta informations before.

After updating you should check the plugins configuration at the options panel and save the settings.
If anything goes wrong with the plugin do this first.
There may are new options for whom an initialization is needed and this will be done by saving the configuration.

Just tell your authors which keyword density you need and let them create the content – the on-page SEO work will be done automatically.
Remember that all META informations (meta keywords, meta description and the meta-tags for robots – and moreover the canonical url in WordPress versions less than 2.9) will only be generated and served by your blog if you have created or edited your posts or pages after installation of the plugin.
Each older post or page has to be opened and saved manually if the keywords, description and robots META should be generated (if you configured automatic setting of meta data) automatically.
After that the header tags for search engines will be set and served from the next page-request on.
By the way you can check the keyword density of the page content – maybe you have to change the text a little bit to reach your desired density.


My language is not supported by the plugin! How can I replace a language I don’t need with another one?

First you should add the language specific stopwords. You can integrate them in the file stopwords.js. The simpliest way: If you are writing in french you can edit the block defined with 'de' which you replace with 'fr' – if you don’t need the german language. After that you can replace the wordlist with the french ones. At least you have to search the file keyword-statistics.php for all occurencies of the string <option value="de" and replace the de with fr.

I don’t know the language code for the language I want to add! Where can I find it?

Simply have a look at There you can find a list of all language codes that can be used as your content lanugage.

I want to add my language to the existing ones! How does it work?

Simply add the string '*LANGUAGE*': [ *...* ], at the second line of the file stopwords.js. Replace *LANGUAGE* with the one you want to integrate (fr if you want to integrate french for example).The *...* is a placeholder for the stopwords you wish to define. You must embed each word in single quotes (e.g. 'the'). Single quotes unsed in the stopword have to be escaped with \'. If you wan to add it's you have to make it this way: 'it\'s'. Between the stopwords you need a , to separate them.

At least you have to search after all occurencies of <option value="de". Just copy these lines and insert them the line before. Then change all "de"s in the new line to "fr". From now on you can set french as your default language and also choose it in edit post/page.

Which words should appear in the stopword list?

The stopword list should only contain single words with no double meanings. For example in the dutch language the word ‘weer’ means ‘weather’ but also ‘again’. Words like that should not appear in the list. There are two reasons why: Firstly these words are helping search engines to classify the page content and these words are surely not classified as stopwords by Google, Yahoo! and Bing. The second reason is that there are some people writing about weather and they need this word to be listed as a keyword and not as a stopword. So please avoid those words if you want to filter stopwords.

Every time the plugin has been updated I need to reintegrate my stopwords. What can I do to prevent this?

Just send me the stopword list. Before you do this be sure that the stopwords face the conditions described above. I’ll check the wordlist – if there is a way of automatic translation – and add it to the plugin. In future updates the stopwords stay inside the plugin so you don’t have to do it anymore.

I am missing some stopwords in the plugin’s list. Can you add them?

If there are some words that – for your meaning – belong to the stopword list just send them to me via. e-mail. I’ll check and maybe add them to the existing.

Where can I get the plugin with my native backend language?

You have to create your own pot file of the plugin which is containing the localized captions. Translate the captions in the pot file and build your own mo file. The name of this file has to keep the structure condition keyword-statistics-*LANGUAGE*.mo. LANGUAGE is a placeolder for your personal language – to be exact the shortcode of it. If you are translating the captions to spanish you’ll use es instead of it.

More about localization you’ll find at I18n and Translating WordPress

How can I translate the plugin’s backend to my language?

If you want to translate the captions displayed at the admin interface or the author’s view for editing posts, you’ll have to edit the included file named keyword-statistics.pot that comes with the current version of the plugin. There you see the english captions used in the backend.

It is separated in blocks beginning with comments – recognizable at a # – which is followed by two lines. The first line is containing the double quoted english caption initiated by a msgid at the beginning of the line. At the second line – initiated by msgstr – you can add your translation between the double quotes.

After translating all messages you can send me the file and I’ll integrate the translation. At the end your authors got rid of the language mix at their backend.


There are no reviews for this plugin.

Contributors & Developers

“Keyword Statistics” is open source software. The following people have contributed to this plugin.


Translate “Keyword Statistics” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.



  • Done some compability check with versions since 3.0.1. Everything works fine.


  • Updated german backend translation and screenshot


  • Integrated a new option for telling bots to index/noindex the blogs feeds.


  • Drop any shortcode before text analysis will be done – only the content of the caption shortcode (including the caption attribute) will remain. The content – text between the opening and closing parts – of any other shortcode will be left too but attributes will be deleted.


  • Translated new backend messages to german and updated screenshots


  • Added more revealing error messages for misentries at configuration dialogs to tell the user which input field have to be changed before saving of configuration is possible.
  • Added previews for title, description and keywords in edit-page/post dialog when sitewide predecessors and/or successors are defined
  • Include sitewide predecessors and successors when checking the maximum number of characters and/or keywords at edit-dialogs
  • Now counting length of input fields for sitewide and aggregations meta before translation of special characters into html enities. In the past the length of the strings where counted with the entities, which leaded to an error while saving meta informations. E.g. a double quote where translated into the html entity " which leaded to the length of 6 characters (while only one character where counted at the preview).


  • Now with hungarian wordlist – Thanks to Németh Balázs


  • Added bulgarian wordlist from Yassen Yotov – Thanks for that


  • Integrated slovak word filter and backend translation – Thanks to Ondrey Tatliak


  • New stopwords for czech language – Thanks to adyba


  • Added nonces to all dialogs for plugins security (they where there before changing the structure of plugins configuration but got lost while reorganization process).


  • Integrated danish wordlist to the plugins filter


  • Now including french stopword list for filtering stopwords


  • New polish stopwords added – Thanks to Michał Jankowski


  • Translated new options
  • Added screenshot of sitewide meta predecessors and successors configuration dialog


  • Prevent the plugin from multiple addition of page numbers if the variable %pagination% is included in an aggregations title
  • Added missing variable replacement in sitewide predecessors and successors
  • Number of automatic generated keywords in post-edit and page-edit dialog had not been initialized so the number of generated keywords has been not the number defined at the plugins configuration.


  • New stopword list: Added spanish word filter data


  • Integrated definition of predecessors and successors for title, description and keywords which will be appended at any page of the blog.
  • Include length of aleady defined sitewide meta informations in status messages at the input previews on aggregations meta configuration dialog.


  • In debug mode the variable replacement function leaded to warnings when missing second parameter
  • Update of plugins configuration did not initialize all settings. This leaded to notices – also occourred in debug mode only – when accessing missing array indices.
  • When no posts has been assigned to tags or categories the javascript for generating the previews in aggregations meta configuration failed


  • Added / corrected german captions
  • New screenshot for aggregations meta settings
  • Changed some default values at the plugins configuration: displaying additional fields for admins is now activated and the additional field title – for definition of the pages/posts title at post-/page-edit dialog – can now be editied by authors by default (this will affect new installations of the plugin only)


  • Added possibility to set individual titles, descriptions and keywords for all types of content aggregations (index-, category-, tag-, author-, archive- and search results).
  • Controlling robots (index and follow) now can be set individual for the aggregation types too.
  • Metadata for aggregations title, description and keywords can be defined using a set of variables.


  • Corrected migration of single options used on older wordpress versions
  • Dropped display of keywords suggestion. For those who are using other SEO plugins and don’t use the plugin for serving meta keywords this makes no sense. We better save some space on display. These users better use the SEO-Tool – Keyword Density Checker which doesn’t execute extra code on ordinary page reguests. This one is for informational use only and the extracted keywords can be copied to the meta keywords input field of any SEO plugin.


  • Translation of the new captions
  • Some optical changes


  • Restructured the plugins configuration pages to make options clearer. Moreover there are some options coming soon to set individual titles, meta keywords, descriptions and robots meta informations for all kinds of content aggregations.
  • Updated screenshots of the plugins configuration dialogs and the additions at edit-post and edit-page generated by the statistics plugin.


  • Updated backends translation


  • Prevent output of redundant ruler if visibility of all meta input fields is switched off.
  • Hiding of meta input fields now is availiable for admin users too. No screen space will be wasted for those users who are using the plugin for calculating the keyword densities only.


  • Added list with turkish stopwords which came from Burak Tuyan.


  • Checked compability with WP 3.0. Everything seems to work fine.


  • Canonical urls were not set correctly if the posts page – index aggregation / post list – were set to a specific page url (configurable at Reading Settings -> Front page displays)


  • Dropped unneeded spaces and commas in keyword lists (post/page edit dialog) before update of meta keywords.


  • Corrected JS-Script for counting keywords in edit post/page. Counted always one before even if the field was empty.


  • Image captions were not filtered before text analysis so if a picture with a caption including the most important keyword were at the beginning of a post/page the source code of the captions block could be written in the generated description.
  • Corrected regular expression for filtering special characters out of the content.
  • Changed expression for automatic generation of meta description.


  • Updated german translation of the plugin


  • Now you can configure a sitewide used maximum number of keywords / keyphrases and the length this meta tag should have at the most. In edit-post/page these values will be checked so the author can see if he is using too many characters or keys.


  • Translated new configuration field captions.


  • Option for setting maximum number of characters used in title tags. While editing a post or page the custom title field now has a status field automatically updated when the field has been changed. Authors can see if they are using too many characters in this field.


  • Resolved conflicts with other plugins using the same name for the plugins base directory variable. This could cause an overwriting of the plugins path variable while initialization of the different parts in the wrong order.


  • Update of german captions and the needed pot for additional translations


  • If the plugin is not serving the page title, we should not drop an existing page title generated by WordPress or another plugin.


  • Added page title also to be served optional like meta informations. This way the page title already generated by WordPress or a plugin which ran before stay in the document.


  • Translated backend text for serving canonical urls


  • Made generation of canonical urls by the plugin optional too. WordPress only generates these on single pages or posts but not for archives, author aggregations, categories and tag lists.


  • Translations for captions of the new options for not serving various meta tags.


  • Now admin can configure which meta-informations sould be served or not – meta keywords and description in addition to robots meta and the content language. This will help when the plugin is installed with others who send meta informations and prevents from sending multiple tags of the same type. You can use it with other SEO plugins without confusing search engine crawlers.


  • Prevent plugin from resetting already defined metadata when post or page has been changed in quick edit mode.
  • Changed confusing description in options backend


  • Captions for option testmode had to be translated


  • Don’t delete the page title generated by WordPress or a plugin which generated one before if we are in testmode. This one should still be there for comparing with the one generated by keyword statistics plugin.


  • Added a testmode in which the plugin sends his meta description, keywords and other meta tags inside a HTML comment. This way you can check if the served metadata meets your expectations. Moreover you can compare the plugins meta output with the situation before. By commenting out the generated metadata search engines are ignoring these informations.


  • Translated german captions of new option and updated pot file


  • Added option which makes serving of all meta informations optional. This can be used if you want to manage these things with another SEO plugin and you don’t want to serve the plugin generated meta informations. In this case the plugin can still be used to have a look at keyword densities.


  • Completed german translation and pot needed to be updated


  • Made robots-meta optional. If controlling robots will be handled by robots.txt file it may confuse search engine crawlers when they get different informations via robots.txt and the robots meta-tag on a particular page. Now serving of the meta tag can be disabled.


  • Updated pot file and translation for new option min_words


  • We should not generate meta informations (keywords and description) if there isn’t enough content. New parameter for controlling the minimal number of words per post or page before automatic generation of metadata is setting these informations.


  • Autoupdate status not set correctly in edit-page/post. Now it should work in all cases.
  • Fixed problem with concatenation of meta robots.


  • Under certain curcumstances an error with the concatenation operator could occur while assembling of metadata.


  • Resolved problem on blogs running on servers with PHP 4. There the object operator did not work on function results.


  • Added information about the plugins version to the configuration. This can be used for future automatic update of the plugins configuration while keeping the state of the art – the plugins behave will not change while new options which are allowing a more sophisticated configuration are added.


  • Status of autoupdate has been lost if authors and distributors were not able to change automatic generated content in fields keywords and description.


  • Updated german translation of configuration and pot file for translating the plugins backend


  • Added possibility to hide fields authors and contributors can not change – e.g. if admin disallows editing robots meta or manual input of a meta description. These fields may confuse the author when they will be displayed but the user can’t edit them. Moreover it’s a waste of space on screen.


  • With some custom settings of permalink structure a false canonical were generated or an unaccurate slash at the end were appended.


  • Completed missing translations and faqs about backend translation and adding stopword lists


  • Added configuration to prevent sending of language meta informations or attributes in keywords and description. These should not be served if a language is not supported by the plugin (no stopwords present for the particular language).


  • Added german translation of the plugins backend and a pot file needed to add more translations


  • Prevent the plugin from serving language tags and language attributes in meta description and keywords in content aggregations when posts are written in different languages.


  • Conflict in backend (edit page/post) with category ‘uncategorized’ because of using the same value attribute. Changing plugin checkboxes for robot, stopword and autoupdate fields resulted in de-/activation of this category.


  • If automatic update of metadata is off and authors can edit keyword and descriptions (both set in plugin configuration), the activation of this feature in edit-post/page failed because of missing event-handlers.


  • When creating a new post or page the default values for description- and keywords autoupdate were not set correctly.


  • Contributors were able to change fields authors could not change (like configuration of the stopwords filter and manually setting of meta description, keywords, title and robot meta). If an author can’t do this contributors should not do it too.


  • Integrated stopword list for dutch language – wordlist came from Sakshin de Groot


  • Added stopword list for brazilian portoguese – thanks to Yoshio Iwamoto for the wordlist


  • Updated screenshots containing the robots options in admin panel.
  • Internal handling of the plugins version should make things easier when testing sites with outdated plugin. Notification for newer versions will be added soon within a dashboard widget.


  • Tested with WP 2.9.2 and confirmed compability


  • Prevent multiple canonical urls on posts and pages with WordPress 2.9+


  • Added possibility of configuration for controlling ODP, YDIR and ARCHIVE robots meta


  • Corrected javascript error: While using the HTML mode the script could not get the current content from the textarea so the statistics could not be updated in this view


  • Error while activation on WP 2.9+ (“Plugin could not be activated because it triggered a fatal error.”) – Used a function name already defined since WP 2.9
  • WP installation installed in subdirectories caused problem with include paths of javascript files


  • Initial release