• Skip to main content
  • Skip to primary sidebar
  • Skip to footer

nSiteful Web Builders

Building a Better Web - One Site at a Time.

  • Home
  • About
    • Testimonials
    • Resources
    • Partner With Me
    • Frequently Asked Questions
  • Web Sites
  • Online Marketing
  • WordPress Support
    • Customized WordPress Training
    • 60-for-60 Sessions
  • Web Applications
  • Blog
    • At-A-Glance
    • Blog Articles Grouped by Category
    • Case Studies
    • General
    • Portfolio
    • Reviews
    • Snippets
    • Techniques
    • Projects
  • Contact
    • Purchase Retainer Consulting Hours
    • About Retainer Consulting Hours
    • Book a Meeting with Jeff
    • Tell Me About Your Web Project
    • nSiteful Newsletter Archives
    • nSiteful Rewards

By Jeff - 12/21/2018
Cats: Techniques · Tags: WordPress

techniques

Automatic “Visit Web Site” Links on WordPress Portfolio Posts

If your blog includes articles about Web sites you have built, here’s a simple way to automagically and uniformly show “Visit Web Site” links at the end of all such posts.

Here’s what I’m talking about:

visit web site link
Click to enlarge

An “old way” would be to manually enter the hyperlink for each Web site at the end of each post, like this:

<a class="web-url" target="_blank" rel="noopener" href="https://somesite.com">Visit Web Site</a>

An improvement over that method would be to create a special shortcode with a single parameter (the Web URL) that you would manually enter at the end of each post.

But there’s a better way that doesn’t involve hard coding anything into the post content.

The better way to add a “Visit Web Site” link to each portfolio post

This better way involves:

  1. a custom field, whose name I’ll call “web_url”
  2. a custom function that generates the HTML for the “Visit Web Site” link
  3. an add_filter call that hooks the above function to the WordPress the_content hook.
  4. css to dress up the link

Step 1: Add the custom field and value

If the Custom Fields section of the editor page isn’t showing, expand “Screen Options” and checkmark “Custom Fields”.

visit web site link
Click to enlarge

Enter web_url in the “Name” box and the URL of the Web site in the “Value” box.

visit web site link
Click to enlarge

(If you previously added the web_url custom field to another post, you can select it from the custom field “Name” dropdown.)

Step 2: Create a function to generate the HTML for the “Visit Web Site” link.

Do this in your child theme’s functions.php file or in a separate file in the mu-plugsins/ folder.

Here’s the code I used:

function nwb_show_web_url($content) {
	if ( is_single() && $web_url = get_post_meta(get_the_ID(), 'web_url', true) ) {
		$content .= '<div class="web-url"><a target="_blank" href="'.$web_url.'">Visit Web Site</a></div>';
	}
	return $content;
}

Code Explanation:

Line 1: Creates the custom function, passing the global $content variable as a parameter. This $content is the post content entered into the editor box.

Line 2: The first part of the “if” statement uses the WordPress is_single() function to test whether the current query is for an existing single post. The second part uses the WordPress get_post_meta() function to attempt to capture the value of the post’s “web_url” custom field. If the post has that custom field assigned to it, the value is assigned to the “$web_url” variable, and the second part of the condition is true.

Line 3: If both conditions evaluate to true, the HTML for the “Visit Web Site” link is appended to $content (using the .= operator).

Line 5: Finally, we return the new (“filtered”) $content.

Step 3: Use an add_filter call

add_filter( 'the_content', 'nwb_show_web_url', 10);

This tells wordpress to perform the instructions in the ‘nwb_show_web_url’ function and to change the post content to the return value of the function (because the function is hooked to the “the_content” hook).

Step 4: The CSS

.web-url {
	text-align: center;
	display: block;
	margin-bottom: 2em;
}
.web-url a {
	display: inline-block;
	text-align: center;
	padding: 1em;
	border: 1px solid;
}
.web-url a:after {
	font-family: 'FontAwesome';
	content: " \f08e";
}

The first two rules are probably pretty straightforward.

The third rule uses the :after pseudo-element. It uses the FontAwesome Web font to generate the “external link” icon:

Epilogue

One of the benefits of posting articles like this is that I often find ways to improve things.

Case in point: I don’t know why I didn’t insert a return in my custom function in the event the conditions evaluated false.

Here’s the better way, and I’ll fix the code soon:

function nwb_show_web_url($content) {
	if ( ! ( is_single() && $web_url = get_post_meta(get_the_ID(), 'web_url', true) ) ) {
		return;
	} else {
		$content .= '<div class="web-url"><a target="_blank" href="'.$web_url.'">Visit Web Site</a></div>';
	}
	return $content;
}

And yes, there’s a shorthand version:

function nwb_show_web_url($content) {
	if ( ! ( is_single() && $web_url = get_post_meta(get_the_ID(), 'web_url', true) ) ) 
		return;
	$content .= '<div class="web-url"><a target="_blank" href="'.$web_url.'">Visit Web Site</a></div>';
	return $content;
}

Like what you see? Share with others and join my mailing list. No long-term commitment, unsubscribe any time.

Related Posts

  1. Dive Into WordPress Custom Post Types – Part 2
  2. Dive Into WordPress Custom Post Types – Part 3
  3. How To Add Custom Contextual Help Content To The WordPress Dashboard
  4. How to add an About Us blurb to every WordPress blog post
  5. Case Study: Emergency Notice Banner for Hybrid Web site

Reader Interactions

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Primary Sidebar

mailchimp signup

Subscribe to get notified when new articles are published. Unsubscribe any time. No spam. I promise. Check out my newsletter archives.

social

Twitter Facebook LinkedIn

Recent Articles

  • Post-Specific CSS for WordPress October 5, 2026
  • You built an online course, but they haven’t come. September 16, 2026
  • Custom MemberPress Pricing Pages December 19, 2025
  • CSS Data Attribute Override December 11, 2025
  • MemberPress Rules Using Custom Taxonomies and Custom Roles December 10, 2025

Filter By Category/Tag

Categories

  • Case Studies (8)
  • For Staff (1)
  • General (73)
  • Portfolio (7)
  • Reviews (14)
  • Snippets (24)
  • Techniques (52)

Popular Tags

Advanced Custom Fields Blogging Child Themes Content Marketing CSS Customer Service Custom Fields Custom Post Types Diagnostics Domain Names Facebook FooGallery Genesis Hosting HTML Images iPhone Libra Live Chat Marketing Media MemberPress MemberPress Courses Membership Sites Mobile-Friendly MySQL Photo Gallery php Pinterest Plugins Post Formats Pricing Project Management SEBA SEO Seth Godin Shortcodes Social Networking Surveys Taxonomies Twitter Video Web design Web forms WordPress

Footer

Background

Web Sites | WordPress Support | Web Applications.

Formally trained in liberal arts and education (I have a B.A. in Government from Harvard and studied Secondary Education at Rutgers Graduate School), I have honed my skills in the communication arts and sciences as a teacher, trainer, instructional designer, writer, photographer, calligrapher, helpdesk manager, database programmer, and multimedia developer.

(I've also been a group counselor, waiter, bartender, bicycle messenger boy, computer salesman, carpenter's helper, financial analyst, and school board president.)

Tech

Systems since 1983.
Web sites since 1994.
PHP since 2001.
WordPress since 2007.

Contact

Book Meeting
770-772-5134
Email Jeff
Send Money
All Ways

Copyright 2026, nSiteful Web Builders, Inc.

Cookies Consent
To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions.
Functional Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.
  • Manage options
  • Manage services
  • Manage {vendor_count} vendors
  • Read more about these purposes
View preferences
  • {title}
  • {title}
  • {title}
https://iframe.mediadelivery.net/embed/392008/42d18bc1-2adc-4741-b733-053d08d09c32
https://vz-000c5976-3ab.b-cdn.net/42d18bc1-2adc-4741-b733-053d08d09c32/play_720p.mp4

Receive occasional emails from Jeff