<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>Disembrangling Programming</title>
 <link href="http://embrangler.com/tag/wordpress/atom.xml" rel="self"/>
 <link href="http://embrangler.com/tag/wordpress"/>
 <updated>2012-02-03T09:24:19-08:00</updated>
 <id>http://embrangler.com/</id>
 <author>
   <name>Paul Craciunoiu</name>
   <email>paul@craciunoiu.net</email>
 </author>

 
 <entry>
   <title>Embrangler: Moving to Jekyll</title>
   <link href="http://embrangler.com/2010/03/embrangler-moving-to-jekyll"/>
   <updated>2010-03-21T00:00:00-07:00</updated>
   <id>http://embrangler.com/2010/03/embrangler-moving-to-jekyll</id>
   <content type="html">&lt;p&gt;It took only three days to migrate my blog from &lt;a href='http://wordpress.org'&gt;Wordpress&lt;/a&gt; to &lt;a href='http://wiki.github.com/mojombo/jekyll/'&gt;Jekyll&lt;/a&gt;. For anyone who plans to do this, I&amp;#8217;m summarizing the whole process below.&lt;/p&gt;

&lt;p&gt;Table of contents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='#why_change'&gt;Why change?&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='#why_jekyll'&gt;Why Jekyll?&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='#migration_process'&gt;Migration process&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='#conclusion'&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='why_change'&gt;Why change?&lt;/h2&gt;

&lt;p&gt;While I realize Wordpress the most popular blogging platform for a reason, I was bothered by the workflow involved with having a WP blog. Some of the (arguable) inconveniences I found were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the WYSIWYG editor doesn&amp;#8217;t handle some of the markup I would like (headings, tables aren&amp;#8217;t great either), so I would constantly switch between the Visual and HTML tabs to format things the way I wanted to. While I realize this could be fixed by customizing the editor, why should I have to do that? Plus, I have long given up hope of the ideal WYSIWYG editor. Besides not handling markup very well, it would sometimes reformat some of my plain HTML and break it.&lt;/li&gt;

&lt;li&gt;creating posts is pretty much the only thing I do. I don&amp;#8217;t use categories, tags, or any other features. Yet I had this admin area cluttered with features.&lt;/li&gt;

&lt;li&gt;I&amp;#8217;m not too fond of WP&amp;#8217;s version control. I would often see the message that &amp;#8220;a more recent version of this post is available&amp;#8221; erroneously, I&amp;#8217;m still not sure why. While changing versions worked well enough, I find the idea of an actual version control system more appealing.&lt;/li&gt;

&lt;li&gt;My blog could use a redesign. For a while, I was using the &lt;a href='http://wordpress.org/extend/themes/carrington-text'&gt;Carrington Text&lt;/a&gt; theme, which was ok but not great. I wanted to make it feel more like &lt;em&gt;my&lt;/em&gt; blog &amp;#8211; no sidebar, larger font, a better home page to name a few.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='why_jekyll'&gt;Why Jekyll?&lt;/h2&gt;

&lt;p&gt;A few weeks before I decided to switch off of Wordpress, I found out about static site-generator engines alternatives that would use available version control software such as git or svn. After looking around I hesitated to switch to any of these because they were mostly Ruby-based, and I was unfamliar with how they work. However, all other alternatives seem to be heading towards full-fledged &lt;abbr title='Content Management System'&gt;CMS&lt;/abbr&gt;&amp;#8217;s.&lt;/p&gt;

&lt;p&gt;A quick note on static sites: they have virtually no security holes (well, in theory), because there is no server-side handling of data submission. I&amp;#8217;m using a &lt;abbr title='Virtual Private Server'&gt;VPS&lt;/abbr&gt; too, so I was fond of having less CPU usage on the server (due to not having to process, say, PHP scripts for Wordpress).&lt;/p&gt;

&lt;p&gt;Some of the alternatives to Jekyll that I considered are &lt;a href='http://www.cloudhead.io/toto'&gt;Toto&lt;/a&gt;, &lt;a href='http://www.staceyapp.com/'&gt;StaceyApp&lt;/a&gt;, &lt;a href='http://chyrp.net/'&gt;Chyrp&lt;/a&gt;, &lt;a href='http://subtextproject.com/'&gt;Subtext&lt;/a&gt; and &lt;a href='http://typosphere.org/'&gt;Typo&lt;/a&gt;. I picked &lt;a href='http://wiki.github.com/mojombo/jekyll/'&gt;Jekyll&lt;/a&gt; for two main reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;popularity &amp;#8211; looking at the &lt;a href='http://wiki.github.com/mojombo/jekyll/'&gt;project&amp;#8217;s github&lt;/a&gt; watches/forks&lt;/li&gt;

&lt;li&gt;documentation and examples &amp;#8211; there is actually a &lt;a href='http://wiki.github.com/mojombo/jekyll/sites'&gt;Sites&lt;/a&gt; page, leading to other sites and their github hosted sources, immensely helpful when starting out&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='migration_process'&gt;Migration process&lt;/h2&gt;

&lt;p&gt;I followed these instructions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://wiki.github.com/mojombo/jekyll/install'&gt;Installation steps from the Jekyll documentation&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://blog.favrik.com/2009/03/02/installing-jekyll-on-ubuntu-8-10/'&gt;Installing Jekyll on Ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;#8230; and started by looking at &lt;a href='http://tom.preston-werner.com/'&gt;Tom Preston-Werner&amp;#8217;s blog&lt;/a&gt; and its &lt;a href='http://github.com/mojombo/mojombo.github.com'&gt;source on github&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id='migrating_posts'&gt;Migrating posts&lt;/h3&gt;

&lt;p&gt;After I got the redesign to look good on Jekyll, the next step was migrating my Wordpress posts. Fortunately, &lt;a href='http://wiki.github.com/mojombo/jekyll/blog-migrationsl'&gt;there is documentation for that too&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unfortunately, the automatic migration did not convert some of the markup very well, such as LaTex, images with captions, most lists and links. Yet I had less than 15 posts, so I just went through them and checked everything. Because I&amp;#8217;m using &lt;a href='http://www.latex-project.org/'&gt;LaTeX&lt;/a&gt; in some of my posts, I used &lt;a href='http://maruku.rubyforge.org/maruku.html'&gt;maruku&lt;/a&gt; (instead of &lt;a href='http://github.com/rtomayko/rdiscount'&gt;rdiscount&lt;/a&gt;) to parse them. I couldn&amp;#8217;t find LaTeX support for rdiscount, which is a faster parser.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m also using lsi for related posts, and &lt;a href='http://pygments.org/'&gt;python-pygments&lt;/a&gt; for syntax highlighting. The latter is simply a wonderful tool, and I recommend it to anyone posting code on the web. Of course, all of these are documented in the Jekyll documentation, so it was easy to get it all working.&lt;/p&gt;

&lt;p&gt;The code for this site is up on github as well, so you can &lt;a href='http://github.com/pcraciunoiu/embrangler/'&gt;check it out there&lt;/a&gt; to see how it works.&lt;/p&gt;

&lt;h3 id='migrating_comments'&gt;Migrating comments&lt;/h3&gt;

&lt;p&gt;This took me about 20 minutes :), following &lt;a href='http://disqus.com/comments/wordpress/'&gt;these instructions&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id='server_setup_and_more'&gt;Server setup and more&lt;/h3&gt;

&lt;p&gt;I actually didn&amp;#8217;t want to install jekyll on my server, and preferred to do all the generating locally. My server only works with plain html this way. The one thing I did do, however, was use github&amp;#8217;s post-receive-hook service. I ended up having something &lt;a href='http://forum.webfaction.com/viewtopic.php?id=964'&gt;similar to this&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;github posts data to a php file on my server&lt;/li&gt;

&lt;li&gt;this file verifies the posted data, logs the commit, and runs a C script.&lt;/li&gt;

&lt;li&gt;the C script runs &lt;code&gt;git pull&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here&amp;#8217;s the code for all of this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;php script&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href='http://coffeeonthekeyboard.com/'&gt;James&lt;/a&gt; pointed out that my security measures weren&amp;#8217;t good enough, so I updated the script. If you don&amp;#8217;t care much for security, you may prefer automated publishing. See my &lt;a href='#second-script'&gt;second script&lt;/a&gt;, below.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class='nv'&gt;$check&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;auth&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;!&lt;/span&gt;&lt;span class='nv'&gt;$check&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;die&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;lt;pre&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nb'&gt;exec&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;/path/to/site/pull_script&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;lt;/pre&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;auth&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='c1'&gt;// do some parameter checking here&lt;/span&gt;
    &lt;span class='c1'&gt;// and return true when matches&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;To make things even more awesome, I bookmarked this URL using &lt;a href='http://lifehacker.com/196779/hack-attack-firefox-and-the-art-of-keyword-bookmarking'&gt;Firefox&amp;#8217;s keywords&lt;/a&gt;, so I only need to type one character to publish ;)&lt;/p&gt;
&lt;span id='second-script' /&gt;
&lt;p&gt;Here is my second script, which does automatic publishing.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;!&lt;/span&gt;&lt;span class='nv'&gt;$_POST&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;payload&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='nb'&gt;header&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;HTTP/1.0 403 Forbidden&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;exit&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='nb'&gt;define&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;HOOKLOG&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;../logs/hooks.log&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='nv'&gt;$fh&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;fopen&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;HOOKLOG&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;or&lt;/span&gt; &lt;span class='k'&gt;die&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;Can&amp;#39;t open file&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='nv'&gt;$data&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='nv'&gt;$hook&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;json_decode&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$_POST&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;payload&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;

&lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$hook&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;repository&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;owner&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;name&lt;/span&gt; &lt;span class='o'&gt;!=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;pcraciunoiu&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='nb'&gt;header&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;HTTP/1.0 403 Forbidden&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;exit&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='nv'&gt;$cs&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$hook&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;commits&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='k'&gt;foreach&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$cs&lt;/span&gt; &lt;span class='k'&gt;as&lt;/span&gt; &lt;span class='nv'&gt;$c&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='nv'&gt;$data&lt;/span&gt; &lt;span class='o'&gt;.=&lt;/span&gt; &lt;span class='nv'&gt;$c&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;timestamp&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='nv'&gt;$data&lt;/span&gt; &lt;span class='o'&gt;.=&lt;/span&gt; &lt;span class='nv'&gt;$c&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;author&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;name&lt;/span&gt;
        &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39; (&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='nv'&gt;$c&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;author&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;email&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;)&amp;#39;&lt;/span&gt;
        &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39; pushed to &amp;#39;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='nv'&gt;$hook&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;repository&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;url&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;
        &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;View commit at &amp;#39;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='nv'&gt;$c&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;url&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;
        &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='se'&gt;\n\n&lt;/span&gt;&lt;span class='s2'&gt;Commit message was:&lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='nv'&gt;$c&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;message&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='se'&gt;\n\n&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;
    &lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='nb'&gt;fwrite&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$fh&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$data&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='nb'&gt;fclose&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$fh&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

&lt;span class='c1'&gt;// set this to your path&lt;/span&gt;
&lt;span class='nb'&gt;exec&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;/path/to/site/pull_script&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;There are two important security measures in the first script:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it not write to a file, so if it gets hit by someone trying to find the secret codes, my server&amp;#8217;s disk doesn&amp;#8217;t perform intensive &lt;abbr title='input-output'&gt;IO&lt;/abbr&gt;&lt;/li&gt;

&lt;li&gt;it does not hint in any way at parameter names, number of parameters that must be submitted, or whether they should be submitted through GET or POST &amp;#8211; if you don&amp;#8217;t get the right values, you don&amp;#8217;t see anything&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;the c file&lt;/li&gt;
&lt;/ol&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;stddef.h&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;unistd.h&amp;gt;&lt;/span&gt;

&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;main&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;void&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='n'&gt;execl&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/usr/bin/git&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;git&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;pull&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;origin&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;master&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='kt'&gt;char&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nb'&gt;NULL&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;EXIT_FAILURE&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Compile this with&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;gcc pull_script.c -o pull_script
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;So now, every time I push to github, the server automatically updates. Really cool way of publishing!&lt;/p&gt;

&lt;h2 id='conclusion'&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;I enjoy using git, and having a static site. My comments are offloaded to a separate server, and I write plain text files using the markdown syntax. My blog gets published when I visit a bookmarked URL.&lt;/p&gt;

&lt;p&gt;Goodbye Wordpress!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Hacking Wordpress: check contact messages for spam using Wordpress' built-in Akismet spam for comments</title>
   <link href="http://embrangler.com/2009/11/hacking-wordpress-check-contact-messages-for-spam-using-wordpress-built-in-akismet-spam-for-comments"/>
   <updated>2009-11-14T00:00:00-08:00</updated>
   <id>http://embrangler.com/2009/11/hacking-wordpress-check-contact-messages-for-spam-using-wordpress-built-in-akismet-spam-for-comments</id>
   <content type="html">&lt;p&gt;This article explains how to easily create a contact form with spam filtering in Wordpress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duration:&lt;/strong&gt; 30 minutes&lt;br /&gt; &lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href='http://awesomemath.org/'&gt;http://awesomemath.org/&lt;/a&gt; (see footer)&lt;br /&gt; &lt;strong&gt;Software:&lt;/strong&gt; Wordpress 2.8.6 (latest as of this writing)&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Don&amp;#8217;t you wish there was a nice and easy Wordpress plugin to add a contact form anywhere on your site, with the benefit of spam filtering &lt;em&gt;without&lt;/em&gt; Captchas? I do. And that&amp;#8217;s what prompted me to do things this way.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why not use Captchas?&lt;/em&gt; Hey, don&amp;#8217;t take my word for it: &lt;a href='http://www.seomoz.org/blog/captchas-affect-on-conversion-rates' title='Captcha effect on conversion rates'&gt;other people have spent time showing why&lt;/a&gt;. In short, Captchas are not user friendly, and, frankly, to me, they are frustrating. Every time I want to send a comment or submit some data to a website - bam, I have to spend that extra few to stare at some deformed text. I hate Captchas.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So what instead?&lt;/em&gt; Well, you&amp;#8217;re in luck: Wordpress offers a free, well-integrated spam service called &lt;a href='http://akismet.com/' title='Akismet spam service'&gt;Akismet&lt;/a&gt;, which works really well, and is &lt;a href='http://codex.wordpress.org/Plugins/Akismet' title='Wordpress 2.0 or later comes with Akismet'&gt;integrated into Wordpress by default&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article shows you how to quickly integrate Akismet into a contact form, and it&amp;#8217;s all built from scratch.&lt;/p&gt;

&lt;h2 id='step_1_the_frontend_html__php__jquery'&gt;Step 1: The frontend (HTML + PHP + jQuery)&lt;/h2&gt;

&lt;p&gt;I needed my contact form to be on every page (in the footer), so I created a widget. I used the ExecPHP plugin to include PHP code in it. I also limit submission to 1 every so often, based on a cookie. I also use jQuery to submit this form with AJAX for a snappy sense of response ;)&lt;/p&gt;

&lt;h3 id='step_1a_the_html_and_php'&gt;Step 1a: The HTML and PHP:&lt;/h3&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='html'&gt;&lt;span class='nt'&gt;&amp;lt;div&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_thanks&amp;quot;&lt;/span&gt; &lt;span class='err'&gt;&amp;lt;?&lt;/span&gt;&lt;span class='na'&gt;php&lt;/span&gt;
  &lt;span class='na'&gt;if&lt;/span&gt; &lt;span class='err'&gt;(!$&lt;/span&gt;&lt;span class='na'&gt;_GET&lt;/span&gt;&lt;span class='err'&gt;[&amp;#39;&lt;/span&gt;&lt;span class='na'&gt;contacted&lt;/span&gt;&lt;span class='err'&gt;&amp;#39;]&lt;/span&gt; &lt;span class='err'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='err'&gt;!$&lt;/span&gt;&lt;span class='na'&gt;_COOKIE&lt;/span&gt;&lt;span class='err'&gt;[&amp;#39;&lt;/span&gt;&lt;span class='na'&gt;examplesite_contact&lt;/span&gt;&lt;span class='err'&gt;&amp;#39;])&lt;/span&gt;
    &lt;span class='na'&gt;echo&lt;/span&gt; &lt;span class='err'&gt;&amp;#39;&lt;/span&gt;&lt;span class='na'&gt;style=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;display:none;&amp;quot;&lt;/span&gt;&lt;span class='err'&gt;&amp;#39;;&lt;/span&gt;
&lt;span class='err'&gt;?&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;&amp;gt;
    Thank you for contacting example site!
&lt;span class='nt'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;&amp;lt;?php if (!$_GET[&amp;#39;contacted&amp;#39;] &amp;amp;&amp;amp; !$_COOKIE[&amp;#39;examplesite_contact&amp;#39;]) { ?&amp;gt;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;form&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_form&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;method=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;post&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;action=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;div&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_msgbox&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;style=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;display:none;&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
        Put contact information here.
    &lt;span class='nt'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;div&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_error&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;style=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;display: none&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;a&lt;/span&gt; &lt;span class='na'&gt;href=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;class=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_error_close&amp;quot;&lt;/span&gt; &lt;span class='err'&gt;&amp;quot;&lt;/span&gt;&lt;span class='na'&gt;Dismiss&lt;/span&gt; &lt;span class='na'&gt;message&lt;/span&gt;&lt;span class='err'&gt;&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;x&lt;span class='nt'&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        We couldn&amp;#39;t submit your form for one or more of the following reasons:
        &lt;span class='nt'&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
            &lt;span class='nt'&gt;&amp;lt;li&amp;gt;&lt;/span&gt;All fields must be longer than 5 characters&lt;span class='nt'&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
            &lt;span class='nt'&gt;&amp;lt;li&amp;gt;&lt;/span&gt;You must provide a valid email&lt;span class='nt'&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
        Please resolve the above problems for the highlighted fields
        and try again.
    &lt;span class='nt'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;div&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_info&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;style=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;display: none&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;a&lt;/span&gt; &lt;span class='na'&gt;href=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;class=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_error_close&amp;quot;&lt;/span&gt; &lt;span class='err'&gt;&amp;quot;&lt;/span&gt;&lt;span class='na'&gt;Dismiss&lt;/span&gt; &lt;span class='na'&gt;message&lt;/span&gt;&lt;span class='err'&gt;&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;x&lt;span class='nt'&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;E-mail:&lt;span class='nt'&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; &lt;span class='nt'&gt;&amp;lt;a&lt;/span&gt; &lt;span class='na'&gt;href=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_email_addr&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;img&lt;/span&gt; &lt;span class='na'&gt;src=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/photos/email.png&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;alt=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;email&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;label&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_message_label&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;Message:
        &lt;span class='nt'&gt;&amp;lt;br/&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class='na'&gt;rows=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;5&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;cols =&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;25&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;name=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_message&amp;quot;&lt;/span&gt;
            &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_message&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;tabindex=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;3&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;label&amp;gt;&lt;/span&gt;Name:
        &lt;span class='nt'&gt;&amp;lt;br/&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;input&lt;/span&gt; &lt;span class='na'&gt;type=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;name=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_name&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;tabindex=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;1&amp;quot;&lt;/span&gt;
            &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_name&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;br/&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;label&amp;gt;&lt;/span&gt;Email:
        &lt;span class='nt'&gt;&amp;lt;br/&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;input&lt;/span&gt; &lt;span class='na'&gt;type=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;name=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_email&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;tabindex=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;2&amp;quot;&lt;/span&gt;
           &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_email&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;div&lt;/span&gt; &lt;span class='na'&gt;class=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;btn-panel&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;a&lt;/span&gt; &lt;span class='na'&gt;class=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;btn btn-brown&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;href=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;id=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact_form_info&amp;quot;&lt;/span&gt;&lt;span class='nt'&gt;&amp;gt;&lt;/span&gt;
            Contact Info
        &lt;span class='nt'&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class='nt'&gt;&amp;lt;input&lt;/span&gt; &lt;span class='na'&gt;type=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;name=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;contact&amp;quot;&lt;/span&gt; &lt;span class='na'&gt;value=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Submit&amp;quot;&lt;/span&gt;
            &lt;span class='na'&gt;class=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;btn btn-green&amp;quot;&lt;/span&gt; &lt;span class='nt'&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class='nt'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span class='c'&gt;&amp;lt;!-- btn-panel --&amp;gt;&lt;/span&gt;
&lt;span class='nt'&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;&amp;lt;?php } ?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;That may look a bit complicated, but let&amp;#8217;s strip this down to understand what&amp;#8217;s going on. At first, we wish to display a thank you message if the form was submitted &amp;#8211; either recently (through a cookie), or right after submission (using the URL parameter &amp;#8220;contacted&amp;#8221;). So, we hide the thank you message in any other situation. If the form hasn&amp;#8217;t been submitted recently, we show it. This, too, breaks down into parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I included a contact information box, too, but you may find that unnecessary. See the &lt;a href='http://awesomemath.org'&gt;demo&lt;/a&gt; to get the picture.&lt;/li&gt;

&lt;li&gt;I also include an error message box, to help validate the submitted contact information.&lt;/li&gt;

&lt;li&gt;Finally, the inputs themselves, &lt;em&gt;Name&lt;/em&gt;, &lt;em&gt;Email&lt;/em&gt; and &lt;em&gt;Message&lt;/em&gt;, each using tabindex attributes to ensure that the user fills them out in this order. Since, in my layout, the &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; comes before the two &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;, I need to use tabindex. I&amp;#8217;m using this layout because I intend to float the &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; to the right. Then, the submit button and contact info button are grouped together in &lt;code&gt;&amp;amp;div class=&amp;quot;btn-panel&amp;quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='step_1b_the_jquery'&gt;Step 1b: The jQuery:&lt;/h3&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;MIN_FIELDLENGTH&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;EMAIL_PREFIX&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;me&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;EMAIL_END&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;examplesite.com&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nx'&gt;jQuery&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;document&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;ready&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;is_valid_email_address&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;email_address&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;pattern&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nb'&gt;RegExp&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='sr'&gt;/^((&amp;quot;[\w-\s]+&amp;quot;)|([\w-]+(?:\.[\w-]+)*)|(&amp;quot;[\w-\s]+&amp;quot;)([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nx'&gt;pattern&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;test&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;email_address&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;validate_submission&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;field&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;field&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;fields&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;field&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;fields&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;returnval&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kc'&gt;true&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;text&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='k'&gt;in&lt;/span&gt; &lt;span class='nx'&gt;fields&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='nx'&gt;text&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='nx'&gt;fields&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]).&lt;/span&gt;&lt;span class='nx'&gt;val&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
            &lt;span class='nx'&gt;minlen&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;MIN_FIELDLENGTH&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;fields&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nx'&gt;minlen&lt;/span&gt; &lt;span class='o'&gt;*=&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;((&lt;/span&gt;&lt;span class='nx'&gt;text&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;length&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='nx'&gt;minlen&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                &lt;span class='o'&gt;||&lt;/span&gt; &lt;span class='p'&gt;((&lt;/span&gt;&lt;span class='nx'&gt;fields&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='o'&gt;!&lt;/span&gt;&lt;span class='nx'&gt;is_valid_email_address&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='nx'&gt;fields&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]).&lt;/span&gt;&lt;span class='nx'&gt;val&lt;/span&gt;&lt;span class='p'&gt;())))&lt;/span&gt;
            &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='nx'&gt;fields&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]).&lt;/span&gt;&lt;span class='nx'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;chighlight&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
                &lt;span class='nx'&gt;returnval&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kc'&gt;false&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='p'&gt;}&lt;/span&gt;
            &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='nx'&gt;fields&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]).&lt;/span&gt;&lt;span class='nx'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
            &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='p'&gt;};&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nx'&gt;returnval&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_name&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;keypress&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nx'&gt;validate_submission&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;});&lt;/span&gt;
    &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_email&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;keypress&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nx'&gt;validate_submission&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;});&lt;/span&gt;
    &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_message&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;keypress&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nx'&gt;validate_submission&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;});&lt;/span&gt;

    &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_form&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;submit&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;validate_submission&lt;/span&gt;&lt;span class='p'&gt;())&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;formInput&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;serialize&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
            &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;post&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;/contact_form.php&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;formInput&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;data&lt;/span&gt;&lt;span class='p'&gt;){&lt;/span&gt;
                &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_form&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;hide&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
                &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_thanks&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;show&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
            &lt;span class='p'&gt;});&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;showing_message&lt;/span&gt; &lt;span class='o'&gt;!=&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='nx'&gt;showing_message&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_msgbox&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;html&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_error&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;html&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
            &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_msgbox&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;addClass&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                                &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;removeClass&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;show&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
            &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;msg_timeout&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nx'&gt;clearTimeout&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;msg_timeout&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
            &lt;span class='nx'&gt;msg_timeout&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;setTimeout&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(){&lt;/span&gt; &lt;span class='nx'&gt;close_msgbox&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt; &lt;span class='p'&gt;},&lt;/span&gt; &lt;span class='mi'&gt;10000&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='kc'&gt;false&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;});&lt;/span&gt;

    &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_form_info&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;click&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;showing_message&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='nx'&gt;close_msgbox&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='kc'&gt;false&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_msgbox&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;html&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_info&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;html&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
        &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_msgbox&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;removeClass&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                            &lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;addClass&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;show&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
        &lt;span class='nx'&gt;showing_message&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;msg_timeout&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='nx'&gt;clearTimeout&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;msg_timeout&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='nx'&gt;msg_timeout&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;setTimeout&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(){&lt;/span&gt; &lt;span class='nx'&gt;close_msgbox&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt; &lt;span class='p'&gt;},&lt;/span&gt; &lt;span class='mi'&gt;10000&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='kc'&gt;false&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;});&lt;/span&gt;

    &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;close_msgbox&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_msgbox&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;hide&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
        &lt;span class='nx'&gt;showing_message&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='kc'&gt;false&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

   &lt;span class='kd'&gt;function&lt;/span&gt; &lt;span class='nx'&gt;email_link&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nb'&gt;window&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;location&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;mailto:&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;EMAIL_PREFIX&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;@&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;EMAIL_END&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='kc'&gt;false&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_msgbox a:first-child&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;live&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;click&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;close_msgbox&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#contact_email_addr&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;live&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;click&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nx'&gt;email_link&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='p'&gt;});&lt;/span&gt;
&lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Okay. First we have a constant for the minimum length of each field. In the validation function, &lt;code&gt;validate_submission()&lt;/code&gt;, fields get checked against this length. There&amp;#8217;s a special case for the &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt;, which has a minimum length of the constant value * 10 (times ten). Then two constants making up the email address for clicking on the image &amp;#8211; this is nice, it keeps the functionality of the &lt;code&gt;mailto:&lt;/code&gt; link, but protects it from spam. I doubt bots are smart enough to do string concatenation for every site they visit :)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;is_valid_email_address()&lt;/code&gt; validates an email using a regex. There&amp;#8217;s tons of these on the web. I wanted mine to be not too long, but long enough :)&lt;/li&gt;

&lt;li&gt;&lt;code&gt;validate_submission()&lt;/code&gt; either valides a certain field, or validates the entire form (latter if no parameters are passed&lt;/li&gt;

&lt;li&gt;The next three are jQuery events for &lt;code&gt;onkeypress&lt;/code&gt; in the form fields. They just call the validation function for each field. To make this even better (but a bit more CPU intensive), you may consider additional events on &lt;code&gt;blur&lt;/code&gt; or &lt;code&gt;change&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Next up, the submit function. This validates the entire form and submits data through ajax, using &lt;a href='http://docs.jquery.com/Ajax/jQuery.post'&gt;jQuery&amp;#8217;s built-in $.post call&lt;/a&gt;. Ideally, you should expect some kind of data response after posting, and show a thank you message based on that (or error otherwise) to ensure best functionality for the user, but I didn&amp;#8217;t bother.&lt;/li&gt;

&lt;li&gt;Finally, we have the close button functionality, with a timeout. At the end, we add events for email and bindings for the close button. You can read about all of these in &lt;a href='http://docs.jquery.com/Main_Page'&gt;jQuery&amp;#8217;s wonderful documentation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='step_2_the_backend_php'&gt;Step 2: The backend (PHP)&lt;/h2&gt;

&lt;p&gt;This is fairly short :)&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='nb'&gt;define&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;DEFAULT_POST_ID&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;post_id_here&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='cm'&gt;/* Contact form handling here */&lt;/span&gt;
&lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$_POST&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;contact&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;require_once&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;/wp-load.php&amp;#39;&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='nv'&gt;$contact_invalid&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='nv'&gt;$contact_data&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='nv'&gt;$contact_data&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;filter_var&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$_POST&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;contact_name&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt;
        &lt;span class='nx'&gt;FILTER_SANITIZE_STRING&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='nv'&gt;$contact_data&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;filter_var&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$_POST&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;contact_message&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt;
        &lt;span class='nx'&gt;FILTER_SANITIZE_STRING&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='nv'&gt;$contact_data&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;filter_var&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$_POST&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;contact_email&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt;
        &lt;span class='nx'&gt;FILTER_VALIDATE_EMAIL&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;foreach&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$contact_data&lt;/span&gt; &lt;span class='k'&gt;as&lt;/span&gt; &lt;span class='nv'&gt;$contact_key&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='nv'&gt;$contact_field&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;!&lt;/span&gt;&lt;span class='nv'&gt;$contact_field&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='nv'&gt;$contact_invalid&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;$contact_key&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;true&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;!&lt;/span&gt;&lt;span class='nv'&gt;$contact_invalid&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='o'&gt;!&lt;/span&gt;&lt;span class='nv'&gt;$_COOKIE&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;awesomemath_contact&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nv'&gt;$comment_post_ID&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;DEFAULT_POST_ID&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='nv'&gt;$comment_author&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$contact_data&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
        &lt;span class='nv'&gt;$comment_author_email&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$contact_data&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
        &lt;span class='nv'&gt;$comment_author_url&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='nv'&gt;$comment_content&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$contact_data&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
        &lt;span class='nv'&gt;$comment_type&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='nv'&gt;$comment_parent&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='nv'&gt;$user_ID&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

        &lt;span class='nv'&gt;$commentdata&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;compact&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;comment_post_ID&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;comment_author&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
            &lt;span class='s1'&gt;&amp;#39;comment_author_email&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;comment_author_url&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;comment_content&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
            &lt;span class='s1'&gt;&amp;#39;comment_type&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;comment_parent&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;user_ID&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='nv'&gt;$comment_id&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;wp_new_comment&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$commentdata&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='nv'&gt;$comment_approved&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$wpdb&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;get_results&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
           &lt;span class='s2'&gt;&amp;quot;SELECT (comment_approved = &amp;#39;spam&amp;#39;)&lt;/span&gt;
&lt;span class='s2'&gt;                AS spam&lt;/span&gt;
&lt;span class='s2'&gt;            FROM wp_comments&lt;/span&gt;
&lt;span class='s2'&gt;            WHERE comment_ID = &amp;#39;&lt;/span&gt;&lt;span class='si'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;$comment_id&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt; LIMIT 1;&amp;#39;&amp;quot;&lt;/span&gt;
        &lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='c1'&gt;// allow contact again after one hour&lt;/span&gt;
        &lt;span class='nb'&gt;setcookie&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;awesomemath_contact&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nb'&gt;time&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='mi'&gt;3600&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$comment_id&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='o'&gt;!&lt;/span&gt;&lt;span class='nv'&gt;$comment_approved&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;spam&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='c1'&gt;// not spam!&lt;/span&gt;
            &lt;span class='nv'&gt;$contact_headers&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; 
            &lt;span class='s2'&gt;&amp;quot;From: &lt;/span&gt;&lt;span class='si'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;$contact_data&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt; &amp;lt;&lt;/span&gt;&lt;span class='si'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;$contact_data&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;gt;&lt;/span&gt;&lt;span class='se'&gt;\r\n\\&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='nx'&gt;wp_mail&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;get_option&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;admin_email&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
                &lt;span class='s1'&gt;&amp;#39;Examplesite Contact Form Message&amp;#39;&lt;/span&gt;
                &lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$contact_data&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt; &lt;span class='nv'&gt;$contact_headers&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
            &lt;span class='nv'&gt;$contact_headers&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt;
                &lt;span class='s2'&gt;&amp;quot;From: Examplesite &amp;lt;me@examplesite.com&amp;gt;&lt;/span&gt;&lt;span class='se'&gt;\r\n\\&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='nx'&gt;wp_mail&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='si'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;$contact_data&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt; &amp;lt;&lt;/span&gt;&lt;span class='si'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;$contact_data&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                &lt;span class='s1'&gt;&amp;#39;Thank you for contacting Examplesite!&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                &lt;span class='s1'&gt;&amp;#39;Thank you for contacting us. We will get back to you shortly.&lt;/span&gt;

&lt;span class='s1'&gt;Below is a copy of your message.&lt;/span&gt;
&lt;span class='s1'&gt;If for any reason we do not get back to you soon, simply reply to this email.&lt;/span&gt;

&lt;span class='s1'&gt;------------------------------&lt;/span&gt;

&lt;span class='s1'&gt;&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='nv'&gt;$contact_data&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt; &lt;span class='nv'&gt;$contact_headers&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
            &lt;span class='c1'&gt;// redirect to prevent resubmission&lt;/span&gt;
            &lt;span class='nb'&gt;header&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;Location: &lt;/span&gt;&lt;span class='si'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;$_SERVER&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;HTTP_REFERER&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;?contacted=1&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
            &lt;span class='k'&gt;die&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;See? That wasn&amp;#8217;t so bad. Let me summarize the above. First, we validate data once again by using a simple php filter. See &lt;a href='http://net.tutsplus.com/tutorials/php/getting-clean-with-php/'&gt;this easy tutorial&lt;/a&gt; for the basics of php filters.&lt;/p&gt;

&lt;p&gt;Then, we use Wordpress&amp;#8217; built-in comment system to post contact messages as comments. We then check to see if the comments were potentially marked as spam. If they weren&amp;#8217;t, we send an email to the site admin (it can be any email, really), with the contact message. Make sure to set DEFAULT_POST_ID to a post against which you can file these &amp;#8220;comments&amp;#8221;.&lt;/p&gt;

&lt;p&gt;I should add that this contact_form.php file is also included in my theme to support no-JS submission. But, really, nowadays, unless you&amp;#8217;re on your phone, 99.9% of users have Javascript enabled in their web browsers.&lt;/p&gt;

&lt;p&gt;If I had time, I would turn this into a plugin with options and such. Wishlist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A separate panel for administering contact form messages, similar to the built-in WP comments.&lt;/li&gt;

&lt;li&gt;A built-in easy-to-customize widget&lt;/li&gt;

&lt;li&gt;Custom fields&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All-in-all, this was a quick and easy way to safely implement a contact form on a site without the hassle of using multiple plugins, having Captchas, or the inflexibility of requiring a subject line for the contact message (yet another reason I chose to implement my own contact form from scratch).&lt;/p&gt;

&lt;p&gt;Hope you found this article useful. Feedback welcome!&lt;/p&gt;</content>
 </entry>
 

</feed>

