Отображение доменов на постоянные ссылки (не мультисайты)

8

Я пытаюсь сделать это на автономной установке WP (не мультисайт). То, что я пытаюсь достичь, это:

  1. Пользователь экономит domain.comна usermeta. (сделанный)
  2. Пользователь создает новый CPT, скажем company. Который доступен через по умолчанию original.com/company/example-company(сделано - по умолчанию)
  3. Мне нужно, чтобы все посты, созданные пользователем, были доступны также через domain.com/company/example-companyпользовательскую мету domain.

Я понимаю, что DNS и домен должны указывать на текущую установку WP (не имеет значения), но не уверен, как сопоставить домен с постоянной ссылкой.

Алгоритм должен быть примерно таким

  1. Проверьте, companyотображается ли одна страница CPT.
  2. Проверьте, установил ли автор домен.
  3. Если domainустановлено, измените постоянную ссылку.
Sisir
источник

Ответы:

4

Если вы установите domain.comв качестве псевдонима original.com, в WordPress вам ничего не нужно делать, чтобы это работало.

Проблема заключается в countrary: один раз в DNS на 2 доменах псевдонимов, каждый URL вашего WordPress будет доступен через определяемый пользователь домены: domain.com/any/wp/url, но также domain2.com/any/wp/url, domain3.com/any/wp/urlи так далее ...

Итак, что вы должны сделать, это

  1. Проверьте, является ли URL одним из определенных пользователем доменов.
  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 только для своего сервера, где все определенные пользователем домены являются псевдонимами оригинала.

Обратите внимание, что код не проверен.

Gmazzap
источник
4

Простая константа WP_SITEURLможет добиться цели. Я работал над чем-то похожим на это.

Разница в том, что все домены были размещены на одном сервере и указывали на корневой каталог.

Процедура, которую я попробовал -

Проверил хост, используя $_SERVER['HTTP_HOST']и Validated, если он существует в базе данных.
Сравнивая ваши потребности, вы можете проверить это как -

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.

Shazzad
источник