WordPress multisite untuk pengembangan lokal dan jarak jauh

Diterbitkan: 2021-07-19

Ini adalah praktik umum untuk menggunakan lingkungan lokal dan jarak jauh saat mengembangkan untuk web. Dalam kasus situs WordPress tunggal ini berfungsi dengan baik. Namun, instalasi WordPress Multisite memperumit masalah secara signifikan.

Saat mencari solusi untuk masalah instalasi WordPress Multisite, kami menemukan serangkaian artikel yang ditulis oleh John Russel di Laubster Boy. Dalam artikel ini, dia menandai cara untuk memecahkan masalah ini untuk pengembangan jarak jauh dan lingkungan produksi, yang cukup mendekati apa yang kami inginkan. Dengan beberapa modifikasi, kami berhasil menyortir beberapa hal. Namun, sejak itu, pembaruan tertentu untuk WordPress telah merusak solusi itu dan kami harus meninjau kembali masalah tersebut.

Pada artikel ini, saya akan menunjukkan kepada Anda bagaimana kami memecahkan masalah ini menggunakan berbagai sumber dan sedikit mengutak-atik.

Maksud

Kami ingin dapat meng-host instalasi lokal situs dan instalasi jarak jauh dari situs yang keduanya menjalankan database (jarak jauh) yang sama.

Masalah

Pengaturan multisite WordPress selalu mengarahkan ulang ke instalasi dasar, dalam hal ini: remote. Hal ini membuat sulit untuk bekerja pada basis kode pengembangan yang persis mencerminkan situs jarak jauh.

Untuk menyiasatinya, perlu menjalankan dua instalasi yang menggunakan database berbeda. Hal ini dapat menyebabkan konflik yang membingungkan dan masalah sinkronisasi, karena dengan setiap pengeditan, kode dan database harus digabungkan.

Larutan

Kami akan menggunakan plugin Pemetaan Domain WPMU.

Perhatikan bahwa beberapa file dari plugin ini akan diedit secara langsung, jadi penting untuk mengingat ini jika Anda memperbarui plugin untuk alasan apa pun!

Proses ini mengasumsikan Anda memiliki instalasi multisite WordPress di lingkungan jarak jauh dan lokal Anda.

Langkah-langkah berikut untuk masing-masing akan dipisahkan oleh lokal dan jarak jauh, karena penting untuk memiliki versi berbeda dari file yang sama di setiap lokasi.

Jadi, setelah pengaturan latar belakang selesai, mari kita lanjutkan dengan langkah-langkahnya!

Struktur direktori untuk multisite WordPress lokal & jarak jauh

Sebagai referensi, struktur file untuk pengaturan ini, pada lingkungan lokal dan jarak jauh, adalah sebagai berikut:

 +-- wp-config.php
|
+-- .htaccess
|
+-- wp-konten
| |
| +-- sunrise.php
| |
| +-- plugin
| |
| +-- wordpress-mu-pemetaan domain
| |
| +-- Changelog.txt
| |
| +-- domain_mapping.php
| |
| +-- readme.txt
| |
| +-- sunrise.php
| |
| +-- wordpress-mu-domain-mapping.php

1. Jarak Jauh

Bagian ini memberikan rincian file dan pengaturan jarak jauh.

1.1 wp-config.php

Ini tidak boleh diubah di server jauh.

1.2 Pemetaan Domain MU WordPress (jarak jauh!)

Unduh plugin Pemetaan Domain MU WordPress dari sini:

https://en-gb.wordpress.org/plugins/wordpress-mu-domain-mapping/

Instal di situs jarak jauh dan "aktifkan jaringan" agar aktif di semua situs.

1.3 matahari terbit.php

Salin file sunrise.php dari plugin wordpress-mu-domain-mapping langsung ke direktori wp-content , sehingga berada di sini:

/wp-content/sunrise.php

1.4 Akhiri Pengeditan Jarak Jauh

Anda sekarang selesai mengedit situs jarak jauh. Kunjungi beberapa halaman untuk memastikan Anda tidak merusak apa pun, dan kita sudah selesai di sini.

2. Lokal

Bagian ini menunjukkan apa yang harus dilakukan di localhost. Beberapa kode digandakan, tetapi semuanya ditampilkan untuk kelengkapan.

2.1 wp-config.php

Salin kode dari bawah dan rekatkan ke file wp-config.php Anda. Anda kemudian dapat memperbaruinya dengan detail dari wp-config.php jarak jauh Anda (database, dll)

Anda perlu memperbarui ini dengan detail database Anda, dll., tetapi kita akan berakhir dengan dokumen yang mirip dengan yang ditunjukkan di bawah ini di “ Daftar Kode 1: wp-config.php “.

Daftar Kode 1: wp-config.php


<?php

define( 'LINGKUNGAN', 'pembangunan');
define('WP_DEBUG_LOG', benar);
define('WP_DEBUG_DISPLAY', benar);
define('WP_DEBUG', benar);

/* Pengaturan MySQL */

/** Nama database untuk WordPress */
define( 'DB_NAME', 'situs_db saya');

/** Nama pengguna basis data MySQL */
define( 'DB_USER', 'situs_pengguna');

/** Kata sandi basis data MySQL */
define( 'DB_PASSWORD', '**********' );

/** nama host MySQL */
define( 'DB_HOST', 'contoh.com');

/** Database Charset untuk digunakan dalam membuat tabel database. */
define('DB_CHARSET', 'utf8');

/** Tipe Susunan Basis Data. Jangan ubah ini jika ragu. */
define('DB_COLLATE', ”);

define( 'AUTH_KEY', '************');
define( 'SECURE_AUTH_KEY', '************');
define( 'LOGGED_IN_KEY', '************');
define( 'NONCE_KEY', '************');
define( 'AUTH_SALT', '**********' );
define( 'SECURE_AUTH_SALT', '************');
define( 'LOGGED_IN_SALT', '**********' );
define( 'NONCE_SALT', '**********' );

$table_prefix = 'wp_';

/* Multisitus */
define( 'WP_ALLOW_MULTISITE', benar );
define('MULTISIT', benar);
define('SUBDOMAIN_INSTALL', salah);
define( 'DOMAIN_CURRENT_SITE', 'contoh.com');
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );

define( 'ADMIN_COOKIE_PATH', '/' );
define( 'COOKIEPATH', ”);
define('SITECOOKIEPATH', ”);

// WPMU membagikan hal-hal DB
define( 'SUNRISE', 'on' );
define( 'WP_PRODUCTION_DOMAIN', 'contoh.com' );
define( 'WP_DEVELOPMENT_DOMAIN', 'domain-lokal-saya');

/* Itu saja, berhenti mengedit! Selamat ngeblog. */

/** Path absolut ke direktori WordPress. */
jika ( ! didefinisikan( 'ABSPATH' ) ) {
define( 'ABSPATH', dirname( __FILE__ ) . '/' );
}

/** Menyiapkan vars WordPress dan file yang disertakan. */
require_once( ABSPATH . 'wp-settings.php' );

2.2 Pemetaan Domain MU WordPress (lokal!)

Tambahkan plugin yang sama ke situs lokal. Anda mungkin berpikir seperti itu, sesuai dengan situs jarak jauh, tetapi Anda salah!

Buka file domain_mapping.php di editor favorit Anda dan edit baris 708 dan 709 sehingga keseluruhan pernyataan if terlihat seperti ini:

Daftar Kode 2: domain_mapping.php


if ( $url && $url != untrailingslashit( $protocol . $current_blog->domain . $current_blog->path ) ) {
$redirect = get_site_option( 'dm_301_redirect' ) ? '301' : '302';
if ( ( didefinisikan( 'VHOST' ) && konstan( “VHOST” ) != 'ya' ) || ( didefinisikan( 'SUBDOMAIN_INSTALL' ) && konstan( 'SUBDOMAIN_INSTALL' ) == false ) ) {
$_SERVER[ 'REQUEST_URI' ] = str_replace( $current_blog->path, '/', $_SERVER[ 'REQUEST_URI' ] );
}
// header(“Lokasi: {$url}{$_SERVER[ 'REQUEST_URI' ]}”, true, $redirect );
// keluar;
}

2.3 matahari terbit.php

Pertama, salin file sunrise.php dari plugin wordpress-mu-domain-mapping ke direktori wp-content. Mungkin sudah ada file sunrise.php di sini. Jangan khawatir – timpa saja.

Salin dari sini:

/wp-content/plugins/wordpress-mu-domain-mapping/sunrise.php

Ke sini:

/wp-content/sunrise.php

Selanjutnya, edit file sunrise.php baru ini, tambahkan baris di sekitar baris 40, sehingga terlihat seperti kode di bawah ini:

Daftar Kode 3: sunrise.php


<?php if ( !defined( 'SUNRISE_LOADED' ) ) { define( 'SUNRISE_LOADED', 1 ); } if (defined( 'COOKIE_DOMAIN' ) ) { die( 'Konstanta “COOKIE_DOMAIN” didefinisikan (mungkin di wp-config.php). Harap hapus atau beri komentar pada baris define() itu.' ); } $wpdb->dmtable = $wpdb->base_prefix . 'pemetaan_domain';
$dm_domain = $_SERVER['HTTP_HOST'];

if ( ( $nowww = preg_replace( '|^www.|', ”, $dm_domain ) ) != $dm_domain ) {
$where = $wpdb->prepare( 'domain DI (%s,%s)', $dm_domain, $nowww );
} lain {
$where = $wpdb->prepare( 'domain = %s', $dm_domain );
}

$wpdb->suppress_errors();
$domain_mapping_id = $wpdb->get_var( “PILIH blog_id FROM {$wpdb->dmtable} WHERE {$where} ORDER BY CHAR_LENGTH(domain) DESC LIMIT 1” );
$wpdb->suppress_errors( false );
if ( $domain_mapping_id ) {
$current_blog = $wpdb->get_row( “PILIH * FROM {$wpdb->blogs} WHERE blog_id = '$domain_mapping_id' LIMIT 1” );
$current_blog->domain = $dm_domain;
$current_blog->path = '/';
$blog_id = $domain_mapping_id;
$site_id = $current_blog->site_id;

define( 'COOKIE_DOMAIN', $dm_domain );

$current_site = $wpdb->get_row( “PILIH * dari {$wpdb->site} WHERE id = '{$current_blog->site_id}' LIMIT 0,1” );
$current_site->blog_id = $wpdb->get_var( “SELECT blog_id FROM {$wpdb->blogs} WHERE domain='{$current_site->domain}' AND path='{$current_site->path}'” );
if ( function_exists( 'get_site_option' ) ) {
$current_site->nama_situs = get_site_option( 'nama_situs' );
} elseif ( function_exists( 'get_current_site_name' ) ) {
$current_site = get_current_site_name( $current_site );
}

define( 'DOMAIN_MAPPING', 1 );
}

/*
* 1) TAMBAH KODE MULITISIT
*/

// Filter domain yang ditampilkan/output ke dalam HTML
add_filter( 'pre_option_home', 'dev_pre_url_filter', 1 );
add_filter( 'pre_option_siteurl', 'dev_pre_url_filter', 1 );
add_filter( 'isi_konten', 'dev_content_filter', 100 );
add_filter( 'content_url', 'dev_content_url_filter', 100, 2 );
add_filter( 'post_thumbnail_html', 'dev_content_filter', 100 );
add_filter( 'wp_get_attachment_link', 'dev_content_filter', 100 );
add_filter( 'wp_get_attachment_url', 'dev_content_filter', 100 );
add_filter( 'upload_dir', 'dev_upload_dir_filter', 10 );

fungsi dev_pre_url_filter() {
global $wpdb, $path, $switched;
$url;
$switched_path;
$blog_id = get_current_blog_id();

jika ( ! $beralih ) {
$url = is_ssl() ? 'https://' : 'http://';
$url .= WP_DEVELOPMENT_DOMAIN;
jika ( ! is_main_site() ) {
$url .= rtrim( $path, '/' );
}

kembali $url;
} lain {
$switched_path = $wpdb->get_var( “PILIH jalur DARI {$wpdb->blogs} WHERE blog_id = {$blog_id} ORDER BY CHAR_LENGTH(path) DESC LIMIT 1” );
$url = is_ssl() ? 'https://' : 'http://';
$url .= WP_DEVELOPMENT_DOMAIN;
$url .= rtrim( $switched_path, '/' );

kembali $url;
}
}

fungsi dev_content_filter( $post_content ) {
global $wpdb;

$blog_details = get_blog_details();
$original_url = $wpdb->get_var( “PILIH domain DARI {$wpdb->dmtable} WHERE blog_id = {$blog_details->blog_id} ORDER BY CHAR_LENGTH(domain) DESC LIMIT 1” );
$dev_url = WP_DEVELOPMENT_DOMAIN . $blog_details->jalan;

if ( $original_url !== null ) {
$post_content = str_replace( $original_url . '/', $original_url, $post_content );
$post_content = str_replace( $original_url, $dev_url, $post_content );
}
// Ubah semua url untuk menunjuk ke staging (gambar, jangkar, apa pun di dalam konten posting)
$post_content = str_replace( WP_PRODUCTION_DOMAIN, WP_DEVELOPMENT_DOMAIN, $post_content );
// Ubah url untuk "unggahan" untuk mengarah ke produksi sehingga gambar terlihat
$post_content = str_replace( WP_DEVELOPMENT_DOMAIN . $blog_details->path . 'wp-content/uploads', WP_PRODUCTION_DOMAIN . $blog_details->path . 'wp-content/uploads', $post_content );

kembalikan $post_content;
}

/*
* Memfilter fungsi content_url – secara khusus mencari panggilan content_url('upload') di mana jalur memiliki unggahan dalam string
*
* Ditambahkan agar MU-Plugin dapat menggunakan content_url di DEV dan PROD
*/
fungsi dev_content_url_filter( $url, $path ) {
if ( ! kosong( $path ) && strpos( $path, 'uploads' ) !== false ) {
return str_replace( WP_DEVELOPMENT_DOMAIN, WP_PRODUCTION_DOMAIN, $url );
}

kembali $url;
}

fungsi dev_upload_dir_filter( $param ) {
$param['url'] = str_replace( WP_DEVELOPMENT_DOMAIN, WP_PRODUCTION_DOMAIN, $param['url'] );
$param['baseurl'] = str_replace( WP_DEVELOPMENT_DOMAIN, WP_PRODUCTION_DOMAIN, $param['baseurl'] );

kembali $param;
}

/*
* Pengganti /wp-includes/ms-load.php get_site_by_path
*/
function dev_get_site_by_path( $_site, $_domain, $_path, $_segments, $_paths ) {
global $wpdb, $path;

// Agar ada kemungkinan kecocokan di database, set $_domain menjadi WP_PRODUCTION_DOMAIN
$_domain = WP_PRODUCTION_DOMAIN;

// Cari situs yang cocok dengan domain dan segmen jalur pertama
$site = $wpdb->get_row( $wpdb->prepare( “PILIH * FROM $wpdb->blogs WHERE domain = %s dan path = %s”, $_domain, $_paths[0] ) );
$current_path = $_paths[0];

if ( $situs === null ) {
// Khusus untuk blog utama – jika situs tidak ditemukan maka muat blog utama
$site = $wpdb->get_row( $wpdb->prepare( “PILIH * FROM $wpdb->blogs WHERE domain = %s and path = %s”, $_domain, '/' ) );
$current_path = '/';
}

// Tetapkan jalur agar sesuai dengan segmen pertama
$path = $current_path;

kembali $situs;
}

add_filter( 'pre_get_site_by_path', 'dev_get_site_by_path', 1, 5 );

3. .htaccess (lokal)

Masukkan yang berikut ini ke dalam file .htaccess Anda (perhatikan bahwa direktori lokal telah dihapus dari baris akhir index.php RewriteRule):

Daftar kode 4: .htaccess


# MULAI WordPress
<IfModule mod_rewrite.c>;
Mesin Tulis Ulang Hidup
Basis Tulis Ulang /
Aturan Penulisan Ulang ^index.php$ – [L]

# tambahkan garis miring ke /wp-admin
Aturan Penulisan Ulang ^wp-admin$ wp-admin/ [R=301,L]

Tulis Ulang %{REQUEST_FILENAME} -f [ATAU]
Tulis Ulang %{REQUEST_FILENAME} -d
Aturan Penulisan Ulang ^ – [L]
Aturan Penulisan Ulang ^(wp-(konten|admin|termasuk).*) $1 [L]
Aturan Penulisan Ulang ^(.*.php)$ $1 [L]
Aturan Tulis Ulang . /index.php [L]
</JikaModul>;

# SELESAI WordPress

4. Host virtual

Siapkan host virtual sehingga Anda dapat mengetikkan nilai yang diberikan di wp-config.php (di atas) untuk WP_DEVELOPMENT_DOMAIN ke bilah alamat browser dan masuk ke situs. Biasanya Anda akan mengetik localhost, tetapi ini akan menimpanya.

Dalam kode contoh (di atas), host virtual diatur untuk mengambil "price-buckland" di bilah alamat dan langsung ke direktori yang berisi WordPress.

Proses penambahan virtual host di lingkungan MAMP adalah sebagai berikut:

1) Di terminal:

 $ sudo vi /etc/hosts

2) Tambahkan baris berikut, ganti sesuai dengan alamat yang ingin Anda ketikkan ke browser Anda:

 127.0.0.1 situs-lokal-domain saya

3) Selanjutnya, kami ingin mengaktifkan host virtual untuk lingkungan lokal Anda, jadi buka file berikut untuk diedit:

 $ sudo vi /Applications/MAMP/conf/Apache/httpd.conf

Temukan baris ini:

 # Host Virtual
# Sertakan /Applications/MAMP/conf/Apache/extra/httpd-vhosts.conf

Dan batalkan komentar pada baris "Sertakan", seperti:

 # Host Virtual
Sertakan /Applications/MAMP/conf/Apache/extra/httpd-vhosts.conf

4) Sekarang edit file berikut:

 $ sudo vi /Applications/MAMP/conf/Apache/extra/httpd-vhosts.conf

Dan tambahkan dua entri – pertama untuk mengizinkan 'localhost' di browser Anda dan, kedua, untuk menambahkan host virtual baru, memungkinkan Anda mengetikkan domain khusus ke browser Anda dan menjangkau server lokal Anda:

 DocumentRoot "/ Pengguna/nama pengguna/htdocs/"
    Nama Server localhost


    DocumentRoot "/Users/username/htdocs/mysite-local-directory"
    ServerName mysite-local-domain

5) Mulai ulang server apache. Dalam kasus saya, MAMP, tetapi dari baris perintah jalankan:

 apachectl restart

Jika semuanya berjalan dengan baik, Anda sekarang harus memiliki pengaturan kerja yang memungkinkan Anda membuat kode instalasi WordPress yang dihosting secara lokal, yang menggunakan database jarak jauh.

Anda juga harus dapat mendorong perubahan Anda ke server jarak jauh dan melihat salinan persisnya di situs jarak jauh.

Pemecahan masalah, peringatan, dan gotcha!

Sayangnya, banyak (banyak) hal yang bisa salah. Berikut beberapa gejala dan hal yang perlu dicoba:

    1. Halaman admin baik-baik saja, tetapi saya tidak dapat mengunjungi halaman front-end internal apa pun!
    2. .htaccess hilang atau belum diinisialisasi. Tambahkan file dan simpan kembali permalink Anda.
    3. Selebihnya datang segera!

Saat bekerja di situs lokal Anda, jika Anda pergi ke:

 Situs Saya > Admin Jaringan > Dasbor

Ini akan membawa Anda ke situs jarak jauh, yaitu:

 example.com/wp-admin/network

Ini mungkin bukan yang Anda inginkan, tetapi Anda dapat mengetik langsung ke bilah alamat dan tetap berada di lingkungan lokal, yaitu:

situs saya-lokal/wp-admin/jaringan

Kesimpulan

Jika semuanya berjalan dengan baik, Anda sekarang harus memiliki pengaturan kerja yang memungkinkan Anda membuat kode instalasi WordPress yang dihosting secara lokal, yang menggunakan database jarak jauh.

Anda juga harus dapat mendorong perubahan Anda ke server jarak jauh dan melihat salinan persisnya di situs jarak jauh.

Beri tahu kami bagaimana Anda mengikuti panduan langkah demi langkah ini ke WordPress multisite untuk pengembangan lokal dan jarak jauh di komentar di bawah!


Jika Anda memerlukan bantuan dengan Pengembangan Web Anda, jangan ragu untuk menghubungi kami.