I am trying to do this on a standalone WP installation (not multisite). What I am trying to achieve is:
- User saves
domain.com
on usermeta. (done) - User creates a new CPT, say
company
. Which is accessible via by defaultoriginal.com/company/example-company
(done – by default) - I need all the posts created by the user to make available also via
domain.com/company/example-company
when the usermetadomain
is set.
I understand that the DNS and domain should be pointed to current WP installation (irrelevant), but not sure how to map the domain to a permalink.
Algorithm Should Be Something Like This
- Check if
company
CPT single page is shown. - Check if the author set a domain.
- If
domain
is set, modify the permalink.
2 s
If you set domain.com
as an alias of original.com
, in WordPress you have to do nothing to make it works.
The problem is the countrary: once in DNS the 2 domains are aliases, every url of your WordPress will be accessible via user defined domains: domain.com/any/wp/url
, but also domain2.com/any/wp/url
, domain3.com/any/wp/url
and so on…
So, what you have to do, is
- Check if the url is one of the user defined domain
- If so, check if the page requested is a singular CPT and its author
is the one that saved the domain - If not, redirect the request to the original domainù
Let’s assume you save yout original domain in a constant, maybe in wp-config.php
define('ORIGINAL_DOMAIN', 'original.com');
now you can easily implement the workflow described above:
add_action('template_redirect', 'check_request_domain', 1);
function check_request_domain() {
$domain = filter_input(INPUT_SERVER, 'HTTP_HOST', FILTER_SANITIZE_URL);
// strip out the 'www.' part if present
$domain = str_replace( 'www.', '', $domain);
// if the request is from original domain do nothing
if ( $domain === ORIGINAL_DOMAIN ) return;
// if it is not a singular company CPT request redirect to same request
// but on original domain
if ( ! is_singular('company') ) {
redirect_to_original(); // function defined below
}
// if we are here the request is from an user domain and for a singular company request
// let's check if the author of the post has user meta, assuming meta key is `'domain'`
// and the meta value is the same of domain in current url
$meta = get_user_meta( get_queried_object()->post_author, 'domain', TRUE );
if ( $meta !== $domain ) { // meta doesn't match, redirect
redirect_to_original(); // function defined below
} else {
// meta match, only assuring that WordPress will not redirect canonical url
remove_filter('template_redirect', 'redirect_canonical');
}
}
Now let’s write a function to redirect request using current url, but with original domain
/**
* Redirect the request to same url, but using original domain
*/
function redirect_to_original() {
$original = untrailingslashit( home_url() ) . add_query_arg( array() );
wp_safe_redirect( $original, 301 );
exit();
}
The last thing to do is filter the permalink creation to use the user-defined domain for singular company CPT urls:
add_filter( 'post_type_link', 'custom_user_domain_plink', 999, 2 );
function custom_user_domain_plink( $post_link, $post ) {
// we want change permalink only for company cpt posts
if ( $post->post_type !== 'company' ) return $post_link;
// has the user setted a custom domain? If not, do nothing
$custom = get_user_meta( $post->post_author, 'domain', TRUE );
if ( empty($custom) ) return $post_link;
// let's replace the original domain, with the custom one, and return new value
return str_replace( ORIGINAL_DOMAIN, $custom, $post_link);
}
At this point, you have only set DNS for your server, where all the user defined domains are aliases of the original.
Please note code is untested.