Change post permalink to external URL from custom field

Filter post_link (or post_type_link for custom post types), fetch and validate the post meta value, then return that instead of the original link.

As a plugin:

<?php
/**
 * Plugin Name: External Permalinks
 * Plugin URI:  http://wordpress.stackexchange.com/q/64285/73
 * Description: Uses the value of post meta field <code>syndication_permalink</code> as permalink if available.
 * Version:     2012.11.13
 * Author:      Fuxia Scholz
 * Author URI:  https://fuxia.me
 * Licence:     MIT
 * License URI: http://opensource.org/licenses/MIT
 */

add_filter( 'post_link', 'wpse_64285_external_permalink', 10, 2 );

/**
 * Parse post link and replace it with meta value.
 *
 * @wp-hook post_link
 * @param   string $link
 * @param   object $post
 * @return  string
 */
function wpse_64285_external_permalink( $link, $post )
{
    $meta = get_post_meta( $post->ID, 'syndication_permalink', TRUE );
    $url  = esc_url( filter_var( $meta, FILTER_VALIDATE_URL ) );

    return $url ? $url : $link;
}

Sample input:

enter image description here

Leave a Comment