WordPress Change Preview Post Link Button URL Via preview_post_link Filter

last updated in Categories

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

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');


Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.

7 comment

    1. 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.

    2. 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!

  1. 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?

  2. Thanks for sharing, this is great, I have it working like this: (in wp 4.3.1

    function update_preview_link() {
        $slug = get_the_ID();
        $mydomain = 'http://myreviseddomain.com';
        $mynewpurl = "$mydomain/preview/$slug";
        return "$mynewpurl";
    add_filter( 'preview_post_link', 'update_preview_link' );

    Still, have a question? Get help on our forum!