将域映射到永久链接(非多站点)


8

我正在尝试在独立的WP安装(不是多站点)上执行此操作。我想要实现的是:

  1. 用户保存domain.com在usermeta上。(完成)
  2. 用户创建一个新的CPT,例如company。默认情况下可通过访问(默认为original.com/company/example-company完成)
  3. 我需要用户创建的所有帖子也可以通过设置domain.com/company/example-companyusermeta时才可用domain

我知道DNS和域应该指向当前的WP安装(无关),但不确定如何将域映射到永久链接。

算法应该是这样的

  1. 检查是否显示companyCPT单页。
  2. 检查作者是否设置了域。
  3. 如果domain设置,则修改永久链接。

Answers:


4

如果您将设置domain.com为的别名original.com,则在WordPress中您无需执行任何操作即可使其工作。

问题是countrary:一旦DNS的2个域别名,每一个你的WordPress的URL将通过用户定义的域访问:domain.com/any/wp/url,而且 domain2.com/any/wp/urldomain3.com/any/wp/url等...

所以,您要做的是

  1. 检查网址是否为用户定义的域之一
  2. 如果是这样,请检查所请求的页面是否为单个CPT,并且其作者是保存该域的页面
  3. 如果不是,请将请求重定向到原始域

假设您将原始域保存为一个常量,也许是 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();
}

最后要做的是过滤永久链接创建,以将用户定义的域用于单个公司的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,其中所有用户定义的域都是原始服务器的别名。

请注意,代码未经测试。


4

一个简单的常数WP_SITEURL可以解决问题。我确实做了类似的事情。

区别在于所有域都托管在同一服务器上并指向根目录。

我尝试过的程序-

使用检查主机,$_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_SITEURLWP_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网站一样访问。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.