Memetakan Domain ke Permalinks (bukan multisite)

8

Saya mencoba melakukan ini pada instalasi WP mandiri (bukan multisite). Apa yang saya coba capai adalah:

  1. Pengguna menghemat domain.comusermeta. (selesai)
  2. Pengguna membuat CPT baru, katakanlah company. Yang dapat diakses melalui secara default original.com/company/example-company(selesai - secara default)
  3. Saya membutuhkan semua posting yang dibuat oleh pengguna agar tersedia juga melalui domain.com/company/example-companyketika usermeta domaindiatur.

Saya mengerti bahwa DNS dan domain harus diarahkan ke instalasi WP saat ini (tidak relevan), tetapi tidak yakin bagaimana cara memetakan domain ke permalink.

Algoritma Harus Jadi Sesuatu Seperti Ini

  1. Periksa apakah companyhalaman tunggal CPT ditampilkan.
  2. Periksa apakah penulis menetapkan domain.
  3. Jika domaindiatur, ubah permalink.
Sisir
sumber

Jawaban:

4

Jika Anda menetapkan domain.comsebagai alias original.com, di WordPress Anda tidak perlu melakukan apa pun untuk membuatnya berfungsi.

Masalahnya adalah sebaliknya: sekali dalam DNS kedua domain adalah alias, setiap url WordPress Anda akan dapat diakses melalui domain yang ditentukan pengguna :, domain.com/any/wp/urltetapi juga domain2.com/any/wp/url, domain3.com/any/wp/urldan seterusnya ...

Jadi, yang harus Anda lakukan adalah

  1. Periksa apakah url adalah salah satu domain yang ditentukan pengguna
  2. Jika demikian, periksa apakah halaman yang diminta adalah CPT tunggal dan pembuatnya adalah yang menyimpan domain tersebut
  3. Jika tidak, arahkan permintaan ke domain asliù

Mari kita asumsikan Anda menyimpan domain asli Anda dalam konstanta, mungkin dalam wp-config.php

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

sekarang Anda dapat dengan mudah mengimplementasikan alur kerja yang dijelaskan di atas:

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

Sekarang mari kita menulis fungsi untuk mengarahkan permintaan menggunakan url saat ini, tetapi dengan domain asli

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

Hal terakhir yang harus dilakukan adalah memfilter pembuatan permalink untuk menggunakan domain yang ditentukan pengguna untuk url CPT perusahaan tunggal:

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

Pada titik ini, Anda hanya menetapkan DNS untuk server Anda, di mana semua domain yang ditentukan pengguna adalah alias dari yang asli.

Harap dicatat kode tidak diuji.

gmazzap
sumber
4

Konstanta sederhana WP_SITEURLdapat melakukan triknya. Saya memang mengerjakan sesuatu yang mirip dengannya.

Perbedaannya adalah semua domain di-host di server yang sama dan menunjuk ke direktori root.

Prosedur yang saya coba -

Memeriksa host menggunakan $_SERVER['HTTP_HOST']dan Divalidasi jika ada di database.
Membandingkan kebutuhan Anda, Anda dapat memeriksa ini seperti -

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.

Selanjutnya, didefinisikan WP_SITEURLdanWP_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;

Jadi, semua tautan diubah secara dinamis ke alamat host saat ini, dan semuanya dapat diakses seperti situs wordpress umum.

Shazzad
sumber