Updating My Contact Email Automatically
Cast your mind all the back to yesterday, dear reader, where I published the Ban the Spam post. In that post I talk about combatting spam, yet having my contact email plastered across this site.
Problem is, I have 3 places where I list this contact email; on my contact page (of course), on my reply by email button at the bottom of every post, and in a similar link at the bottom of every post in my RSS feed.
So as you can imagine, changing the contact address could be somewhat painful if I want to do it semi-regularly. Toward the end of yesterdayโs post, I spoke briefly about this quandary:
Iโd prefer to set the email address in a single place and have it replicated to both my contact page and my button.
Iโll have to think about how best to do that โ Iโm sure there will be a way for me to that within
functions.php
or something. If youโre a WordPress ninja and have any ideas, Iโm all ears.
I know just enough PHP to be dangerous, and have managed to come up with a solution for doing this. Itโs probably not the best solution, but it works, so Iโm happy.
I wanted to write this post mainly as a reminder to myself, but if it helps any of you guys, then all the better.
Functions, short codes and PHP, oh my!
I was pretty sure that I would be able to do something in my functions.php
file with short codes etc. and I was right!
So I already had a couple of functions defined in there โ one that pulls the post title for the reply by email button, and another that I stole from my good pal, Ru Singh. (thanks, Ru!)
In this post Iโm going to start again with the functions, just so itโs clear to me what I did, when I read it back later.
Defining the short codes
I decided I needed to define two short codes for this to work. One that displays an arbitrary string of text (in this case, an email address). And another that pulls the postโs title.
Letโs look at the email address one first:
// Shortcode for inserting the site's contact email
add_shortcode( 'contact_email', 'contact_email' );
function contact_email( $atts ) {
return 'test@example.com';
}
This shot code allows me to use [contact_email]
anywhere on this site and WordPress will automagically insert the string after the return
.
Get the title
So weโve got the email address sorted. Next we need to do is create a short code that will pull the postโs title. This function already exists in WordPress, I just needed a short code to pull it:
// Shortcode for generating the post title
add_shortcode( 'get_title', 'get_title' );
function get_title( $atts ) {
return esc_attr( get_the_title( get_the_ID() ) );
}
As before, all I need to do now is place [get_title]
anywhere inside a post and it will display that postโs title.
Putting it all together
I now had the nuts and bolts to get this shin-dig on the road. All I had to do was put it together. So first I changed the email address on my contact page from, you know, the actual email address that I want people to email and replace it with my contact_email
. So when visit the page and it renders, you see whatever that return
value is for the short code. I also set the mailto:
value of the link to be the short code.
Confused yet? This is short code inception here, people! To try and give you a a better demonstration, here is a logical representation in HTML:
<a href="mailto:[contact_email]">[contact_email]</a>
So if the return
string on our shortcode is test@example.com
, the rendered HTML that you see would be:
<a href="mailto:<span style="font-family: var(--mono); background: var(--accent-bg);">test@example.com</span>"><span style="font-family: var(--mono); background: var(--accent-bg);">test@example.com</a></span>
Make sense? Good, Iโm glad weโre now on the same page. ๐
Fixing the button
So thatโs the contact page done. Next I need to sort the reply by email button. This was again, really easy. All I had to do was change the buttonโs link to be the following:
<a href="mailto:[contact_email]?subject=Reply to '[get_title]'">Reply by email</a>
Which renders a link that emails the address in the contact_email
short code and includes the post title in the subject line:
<a href="mailto:test@example.com?subject=Reply to 'Updating My Contact Email Automatically'">Reply by email</a>
Finally, the RSS feed
The last part was to bastardise Ruโs code so that includes my short codes so that thereโs a link at the end of every post in my RSS feed that, like my reply button, populates the contact_email
in the to
field and the subject line with the post title.
Hereโs what that code looks like:
// Add reply link to RSS feed
add_filter( "the_content_feed", "feed_comment_via_email" );
function feed_comment_via_email($content)
{
$content .= "<p><a href=\"mailto: " . do_shortcode( ' [contact_email] ' ) . "?subject=Reply to '" . do_shortcode( ' [get_title] ' ) . "'" . "\">Reply via email</a></p>";
return $content;
}
All this code is doing, is injecting a link at the bottom of each RSS feed entry that, you guessed it, uses my short codes.
How to use this code
Now that I have all the code I need, I just need to implement it on my theme. Iโm using a child theme for this so my theme changes persist through theme updates.
All I did was tie these code snippets together and added them to my functions.php
file:
// Shortcode for inserting the site's contact email
add_shortcode( 'contact_email', 'contact_email' );
function contact_email( $atts ) {
return 'test@example.com'; // Change this value when it's time to update your email everywhere!
}
// Shortcode for generating the post title
add_shortcode( 'get_title', 'get_title' );
function get_title( $atts ) {
return esc_attr( get_the_title( get_the_ID() ) );
}
// Add reply link to RSS feed
add_filter( "the_content_feed", "feed_comment_via_email" );
function feed_comment_via_email($content)
{
$content .= "<p><a href=\"mailto: " . do_shortcode( ' [contact_email] ' ) . "?subject=Reply to '" . do_shortcode( ' [get_title] ' ) . "'" . "\">Reply via email</a></p>";
return $content;
}
Changing the email
If at a later date I want to update the contact email for this site, all I need to do is replace the email address on line 5 above and the 3 locations where I use that address will automatically be updated.
No muss, no fuss. Winning.
Like I said at the start of this post, this probably isnโt the most elegant solution to the problem, but itโs a working solution so Iโm happy. If you have any idea as to how I can improve this, please do let me know.