WordPress Change Preview Post Link Button URL Via preview_post_link Filter

by on September 14, 2012 · 4 comments· LAST UPDATED September 14, 2012


How do change the default "preview" button when posting using wordpress user/admin panel?

Tutorial details
DifficultyEasy (rss)
Root privilegesNo
RequirementsWordpress v2.0.11+
Estimated completion timeN/A

You need use the hook or filter called preview_post_link under wordpress to change the default "preview" button when posting. According to wordpress filter documentation:

  1. preview_page_link - Applied to the link on the page editing screen that shows the page preview at the bottom (or right) of the screen.
  2. preview_post_link - Applied to the link on the post editing screen that shows the post preview at the bottom (or right) of the screen.

You need to use functions.php a functions file, which resides in the theme subdirectory. This file acts like a plugin, and if it is present in the theme you are using, it is automatically loaded during WordPress initialization. Edit file using a text editor such as vim:
$ vi functions.php
Append the following code:

// Change post preview button url 
// Change www.cyberciti.biz/faq/?p=124&preview=true
// To server1.cyberciti.biz/faq/?p=124&preview=true
function nixcraft_preview_link() {
    $slug = basename(get_permalink());
    $mydomain = 'http://server1.cyberciti.biz';
    $mydir = '/faq/';
    $mynewpurl = "$mydomain$mydir$slug&preview=true";
    return "$mynewpurl";
add_filter( 'preview_post_link', 'nixcraft_preview_link' );

Save and close the file. Another example:

function nixcraft_update_post_link($link) {
        //replace www part with server1 using the following php function
        //preg_replace ( patter, replace, subject ) syntax
        $link = preg_replace('/www/', 'server1', $link);
        return $link;
add_filter('preview_post_link', 'nixcraft_update_post_link');

You can use the same filter when previewing to posts from a secure page (taken from secure-admin plugin):

function sa_post_link($link) {
	global $pagenow;
	if ( ('on' == $_SERVER['HTTPS']) && ('wp-comments-post.php' != $pagenow) )
		$link = preg_replace('/^https?/', 'https', $link);
	return $link;
add_filter('preview_post_link', 'sa_post_link');
add_filter('preview_page_link', 'sa_post_link');
Tweet itFacebook itG+ itDownload PDF versionFound an error/typo on this page?

{ 4 comments… read them below or add one }

1 Paul Thomson April 1, 2013 at 3:31 pm

Why on earth would you ever need to do this??


2 Mehdi April 8, 2013 at 1:38 pm

Because sometimes you need a different url structure (for your posts or pages), so the preview url has to reflect the real url structure, or it could show a 404 instead of the post preview.


3 Alex Leonard February 7, 2014 at 2:02 am

I have a perfect use-case. I’m using WordPress as an API for post content but the posts are actually appearing on a Laravel driven bespoke web-app.

As a result WordPress is not handling front-end display of post content at all.

Thank you NixCraft for sharing this!


4 Terry May 31, 2013 at 11:17 pm

I am having a problem where all of my links all show the same preview under them..

Whatever the top post is reading as a preview is being put under all other posts, any idea why?


Leave a Comment

Tagged as: , , ,

Previous Faq:

Next Faq: