将域映射到固定链接(不是多站点)

时间:2014-02-10 作者:Sisir

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

用户保存domain.com 在usermeta上。(完成)用户创建一个新的CPT,例如company. 默认情况下可通过访问original.com/company/example-company (完成-默认情况下)

  • 我需要用户创建的所有帖子也可以通过domain.com/company/example-company 当usermetadomain 已设置
  • 我知道DNS和域应该指向当前的WP安装(不相关),但不确定如何将域映射到永久链接。

    Algorithm Should Be Something Like This

    <检查是否company 显示CPT单页domain 设置后,修改永久链接

    2 个回复
    最合适的回答,由SO网友:gmazzap 整理而成

    如果您设置domain.com 作为的别名original.com, 在WordPress中,您无需采取任何措施即可使其正常工作。

    问题是数量:一旦在DNS中,这两个域就是别名,every WordPress的url可通过用户定义的域访问:domain.com/any/wp/url, 而且domain2.com/any/wp/url, domain3.com/any/wp/url 等等

    所以,你要做的是

    检查url是否为用户定义的域之一如果是,检查请求的页面是否为单数CPT及其授权保存域的页面如果不是,将请求重定向到原始域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 URL:

    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.

    请注意,代码未经测试。

    SO网友:Shazzad

    简单常数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站点一样访问。

    结束

    相关推荐

    Disable domain redirect

    所需行为:http://www.situationware.com 应留在www.situationware.com, 无需注册。目前wordpress正在自动重定向到Amazon主机名ec2-107-22-241-162.compute-1.amazonaws.com, 如果我更新wp config,则请求用户注册。通过取消注释phpDOMAIN_CURRENT_SITE 我最终将循环重定向到http://situationware.com/wp-signup.php?new=situationware