Bagaimana saya bisa membuat basis data WordPress portabel dan mandiri?


9

Isu

Saya akan memulai beberapa pengembangan WordPress di lingkungan tim multi-orang. (3 orang atau lebih yang bekerja pada basis kode yang sama pada satu waktu, masing-masing berkembang secara lokal)

Dengan CMS lain yang telah bekerja sama dengan kami, semua orang telah menunjuk instalasi mereka di database yang sama dan karena bagaimana CMS / database itu bekerja, itu berarti kita semua dapat memiliki konten yang sama yang dimasukkan ke dalam instalasi kami (terletak di url berbeda) dari database yang sama tanpa banyak masalah (selain kadang-kadang harus menyinkronkan folder unggahan)

Pertanyaan saya adalah, dengan WordPress, apa yang mencegah kami menggunakan pendekatan yang sama ini dan bagaimana kami bisa menyelesaikan masalah ini?

misalnya. Tiga salinan WordPress semuanya lari dari database yang sama.

http: //dev.local/developer-a/
http: //dev.local/developer-b/
http: //dev.local/developer-c/

dll

Saya harap tak usah dikatakan bahwa ini hanya akan berada di lingkungan pengembangan sebelum diluncurkan.

Masalah utama

  1. Referensi ke url tertentu dalam database ( wp_postsdan wp_optionstampaknya tabel)
  2. Jika satu orang memasang plugin, yang lain tidak akan memilikinya dan akan menyebabkan masalah konkurensi dalam database
  3. Menyimpan folder unggahan dalam sinkronisasi

Solusi Saat Ini

Saat ini saya memiliki awal solusi untuk masalah pertama di tempat. Saya menempatkan berikut ini di file di folder mu-plugins saya.

Kode dasarnya memfilter konten posting saat masuk dan keluar dari database dengan mengganti setiap instance dari url dengan token unik.

<?php

define('PORTABILITY_TOKEN', '{_portable_}');

function portability_remove_home($content)
{
    $content = str_replace(get_option('home'), PORTABILITY_TOKEN, $content);

    return $content;
}

add_filter('content_save_pre', 'portability_remove_home');

function portability_add_home($content)
{
    $content = str_replace(PORTABILITY_TOKEN, get_option('home'), $content);

    return $content;
}

add_filter('the_content', 'portability_add_home');
add_filter('the_editor_content', 'portability_add_home');

Saya telah menetapkan opsi home dan siteurl via php menggunakan lingkungan tempat WordPress diinstal untuk menyelesaikannya. (Sekali lagi, ini hanya untuk pengembangan) Ini berarti bahwa untuk setiap individu menginstal konten posting WordPress akan terlihat seperti berjalan di url itu pada saat itu sampai ke klien.

<?php
if (!defined('WP_HOME'))
{
    // define WP_HOME (aka url of install) based on environment.
    // IF THIS ISN'T WORKING, DEFINE IT EARLIER.
    define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] . str_replace($_SERVER['DOCUMENT_ROOT'], '', dirname(__FILE__) ) );
}

if (!defined('WP_SITEURL'))
{
    // Assumes WordPress is in a separate directory called 'wp', relative to WP_HOME.
    // IF IT'S DIFFERENT, DEFINE IT EARLIER.
    define('WP_SITEURL', WP_HOME . '/wp');
}

Masalah kedua dan ketiga tampaknya dapat dipecahkan dengan symlink yang sesuai (semua berkembang pada mesin yang sama)

Pertanyaan Aktual

  1. Bisakah saya meningkatkan penanganan url yang berbeda? Apakah ada sesuatu yang saya lewatkan yang akan memiliki url hardcoded ke dalam database?

  2. Adakah gotcha yang harus saya ketahui dengan symlinking?

  3. Ada masalah lain yang bisa dipikirkan siapa pun?

Saya menyadari pertanyaan-pertanyaan ini sangat spesifik, jika ada yang tidak jelas, komentari ini dan saya akan mengubah / mengklarifikasi.

Terima kasih.

Jawaban:


2

Saya akan menjawab pertanyaan 2, perlu diketahui bahwa beberapa nilai dalam database disimpan dalam array serial. Misalnya, jika panjang string URL Anda berubah dan itu dalam array serial, maka Anda perlu memperbarui indeks untuk itu.

Anda dapat menggunakan skrip PHP ini untuk memperbarui semua nilai dalam array berseri, atau menjalankannya dari baris perintah dalam skrip Anda sendiri


Terima kasih terlambat untuk menunjukkan saya ke arah naskah PHP itu. Ini memecahkan beberapa masalah yang saya alami dengan tugas terkait WordPress lainnya.
navitronic

1

Pertanyaan 1: URL Anda masuk dan keluar dari database di lebih banyak tempat daripada hanya konten posting. Saya menemukan URL di *_postmeta,, *_commentsdan *_options(selain yang Anda tentukan). Ini tidak termasuk aktivitas plugin dan aktivitas Custom Meta Field .

Pertanyaan 2: Saya kadang-kadang juga akan menghubungkan plugin untuk kenyamanan, dan sebagian besar waktu berfungsi. Terkadang tidak. Saya tidak bisa memberi tahu Anda kondisi pasti yang menyebabkan masalah tetapi Javascript tampaknya menjadi faktor.

Pertanyaan 3: Saya akan mengharapkan masalah dengan *_optionsmeja jika ada. Hal-hal seperti plugin yang diaktifkan dan tema yang aktif disimpan di sana, di antara banyak informasi lainnya cukup spesifik untuk situs tertentu.


Anda benar pada pertanyaan 3, saya pikir ini terutama karena hal-hal yang disimpan dalam bentuk serial dalam tabel ini, yang dapat pecah jika Anda tidak hati-hati.
navitronic
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.