Ánh xạ tên miền vào Permalinks (không phải là nhiều trang)


8

Tôi đang cố gắng thực hiện việc này trên một bản cài đặt WP độc lập (không phải multisite). Những gì tôi đang cố gắng để đạt được là:

  1. Người dùng tiết kiệm domain.comtrên usermeta. (làm xong)
  2. Người dùng tạo một CPT mới, nói company. Có thể truy cập qua mặc định original.com/company/example-company(được thực hiện - theo mặc định)
  3. Tôi cần tất cả các bài đăng được tạo bởi người dùng để cung cấp thông qua domain.com/company/example-companykhi usermeta domainđược đặt.

Tôi hiểu rằng DNS và tên miền phải được trỏ đến cài đặt WP hiện tại (không liên quan), nhưng không chắc chắn làm thế nào để ánh xạ tên miền vào permalink.

Thuật toán nên là một cái gì đó như thế này

  1. Kiểm tra nếu companytrang đơn CPT được hiển thị.
  2. Kiểm tra nếu tác giả thiết lập một tên miền.
  3. Nếu domainđược đặt, sửa đổi permalink.

Câu trả lời:


4

Nếu bạn đặt domain.comlàm bí danh original.com, trong WordPress, bạn không phải làm gì để nó hoạt động.

Vấn đề là countrary: một lần trong DNS 2 lĩnh vực là bí danh, mỗi url của WordPress của bạn sẽ có thể truy cập thông qua người sử dụng định nghĩa lĩnh vực: domain.com/any/wp/url, mà còn domain2.com/any/wp/url, domain3.com/any/wp/urlvà vân vân ...

Vì vậy, những gì bạn phải làm, là

  1. Kiểm tra xem url có phải là một trong những miền do người dùng xác định không
  2. Nếu vậy, hãy kiểm tra xem trang được yêu cầu có phải là CPT không và tác giả của nó có phải là trang đã lưu tên miền không
  3. Nếu không, hãy chuyển hướng yêu cầu đến tên miền ban đầu

Giả sử bạn lưu tên miền gốc của bạn trong một hằng số, có thể trong wp-config.php

define('ORIGINAL_DOMAIN', 'original.com');

bây giờ bạn có thể dễ dàng thực hiện quy trình công việc được mô tả ở trên:

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');
  }
}

Bây giờ hãy viết một hàm để chuyển hướng yêu cầu bằng url hiện tại, nhưng với tên miền ban đầu

/**
 * 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();
}

Điều cuối cùng cần làm là lọc việc tạo permalink để sử dụng miền do người dùng xác định cho các url CPT của công ty số ít:

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);
}

Tại thời điểm này, bạn chỉ đặt DNS cho máy chủ của mình, trong đó tất cả các miền do người dùng xác định là bí danh của bản gốc.

Xin lưu ý mã chưa được kiểm tra.


4

Một hằng số đơn giản WP_SITEURLcó thể làm thủ thuật. Tôi đã làm việc trên một cái gì đó tương tự như nó.

Sự khác biệt là tất cả các tên miền được lưu trữ trên cùng một máy chủ và được trỏ đến thư mục gốc.

Thủ tục tôi đã thử -

Đã kiểm tra máy chủ bằng cách sử dụng $_SERVER['HTTP_HOST']và Xác thực nếu nó tồn tại trên cơ sở dữ liệu.
So sánh nhu cầu của bạn, bạn có thể kiểm tra như thế này -

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.

Tiếp theo, được xác định 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;

Vì vậy, tất cả các liên kết tự động thay đổi thành địa chỉ máy chủ hiện tại và tất cả các liên kết đều có thể truy cập giống như một trang web wordpress chung.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.