web-dev-qa-db-ja.com

ドメインをパーマリンクにマッピングする(マルチサイトではない)

スタンドアロンのWPインストール(マルチサイトではない)でこれを実行しようとしています。私が達成しようとしているのは、

  1. ユーザーはdomain.comをusermetaに保存します。 (完了)
  2. companyのように、ユーザーが新しいCPTを作成します。これはデフォルトでoriginal.com/company/example-company経由でアクセス可能です(done - デフォルトで)
  3. Usermeta domainが設定されているときにdomain.com/company/example-companyでも利用できるようにするには、ユーザーが作成したすべての投稿が必要です。

私は、DNSとドメインは現在のWPインストール(無関係)を指すべきだと理解していますが、ドメインをパーマリンクにマッピングする方法がわからない。

アルゴリズムはこのようなものであるべきです

  1. company CPTシングルページが表示されているか確認してください。
  2. 作者がドメインを設定しているか確認してください。
  3. domainが設定されている場合は、パーマリンクを修正してください。
8
Sisir

domain.comoriginal.comのエイリアスとして設定した場合、WordPressではそれを機能させるために何もする必要はありません。

問題は数にあります。一度DNSで2つのドメインがエイリアスになると、 every あなたのWordPressの/ urlはユーザー定義のドメインを介してアクセスできるようになります:domain.com/any/wp/urldomain2.com/any/wp/urldomain3.com/any/wp/urlなど。

だから、あなたがしなければならないのは、

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

この時点では、サーバーにDNSを設定しただけで、ユーザー定義ドメインはすべて元のエイリアスです。

コードがテストされていないことに注意してください。

4
gmazzap

単純な定数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;

そのため、すべてのリンクは動的に現在のホストアドレスに変更され、それらすべては一般的なワードプレスサイトのようにアクセス可能でした。

4
Shazzad