问题描述
我试图在独立的 WP 安装 (而不是多站点) 上执行此操作。我想要实现的是:
-
用户在 usermeta 上保存
domain.com
。 (完成) -
用户创建一个新的 CPT,说
company
。哪个可以通过默认访问original.com/company/example-company
(完成 – 默认情况下) -
当设置 usermeta
domain
时,我需要用户创建的所有帖子,也可以通过domain.com/company/example-company
使用。
我明白 DNS 和域应该指向当前的 WP 安装 (不相关),但不知道如何将域映射到固定链接。
算法应该是这样的
-
检查是否显示
company
CPT 单页。 -
检查作者是否设置了一个域。
-
如果设置了
domain
,请修改固定链接。
最佳解决方案
如果将 domain.com
设置为 original.com
的别名,则在 WordPress 中,您不得不做任何事情使其工作。
问题是数量:一旦在 DNS 中,2 个域是别名,您的 WordPress 的每个 url 都可以通过用户定义的域访问:domain.com/any/wp/url
,还有 domain2.com/any/wp/url
,domain3.com/any/wp/url
等等…
那么,你要做的就是
-
检查 url 是否是用户定义的域之一
-
如果是这样,请检查请求的页面是否是单个 CPT,其作者是保存域的作者
-
如果没有,请将请求重定向到原来的 domainù
我们假设你把一个原始域保存在一个常量中,也许在 wp-config.php
中
define('ORIGINAL_DOMAIN', 'original.com');
现在,您可以轻松实现上述工作流程:
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');
}
}
现在我们来写一个函数来重定向请求使用当前的 url,但与原始域
/**
* 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();
}
最后一件事是过滤固定链接创建,以将 user-defined 域用于单一公司 CPT 网址:
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);
}
此时,您只为服务器设置 DNS,其中所有用户定义的域都是原始的别名。
请注意代码未经测试。
次佳解决方案
一个简单的常数 WP_SITEURL
可以做到这一点。我做过类似的事情。
The difference is all of the domains were hosted on the same server and pointed to the root directory.
我试过的程序 –
使用 $_SERVER['HTTP_HOST']
检查主机,并在数据库中存在验证。比较你的需求,你可以检查一下 –
global $wpdb;
$domain_user = $wpdb->get_var(
"SELECT user_id FROM $wpdb->usermeta".
" WHERE meta_key = 'domain'".
" AND meta_value='". $_SERVER['HTTP_HOST'] ."'"
);
// if an user found, do further processing.
// Exclude posts by other user using pre_get_posts may be.
接下来,定义 WP_SITEURL
和 WP_HOME
define( 'MY_SITE_DOMAIN', $_SERVER['HTTP_HOST'] );
if( !defined( 'WP_SITEURL' )):
if( is_ssl())
define( 'WP_SITEURL', 'https://'. MY_SITE_DOMAIN );
else
define( 'WP_SITEURL', 'http://'. MY_SITE_DOMAIN );
endif;
if( !defined( 'WP_HOME' ) ):
define( 'WP_HOME', WP_SITEURL );
endif;
所以,所有的链接动态地改变到当前的主机地址,并且它们都可以像一般的 wordpress 站点一样可访问。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。