مواقع ووردبريس متعددة المواقع للتطوير المحلي والبعيد
نشرت: 2021-07-19من الشائع استخدام البيئات المحلية والبعيدة عند التطوير للويب. في حالة مواقع WordPress الفردية ، يعمل هذا بشكل جيد. ومع ذلك ، فإن تثبيتات WordPress متعددة المواقع تعقد الأمور بشكل كبير.
عند البحث عن حل لمشكلة تثبيت WordPress Multisite ، صادفنا سلسلة من المقالات كتبها John Russel في Laubster Boy. في هذه المقالات ، حدد طريقة لحل هذه المشكلة لبيئات التطوير والإنتاج عن بُعد ، والتي كانت قريبة جدًا مما أردناه. مع بعض التعديلات ، تمكنا من فرز الأشياء بشكل أو بآخر. ومع ذلك ، منذ ذلك الحين ، كسرت بعض التحديثات على WordPress هذا الحل واضطررنا إلى إعادة النظر في المشكلة.
في هذه المقالة ، سأوضح لك كيف حللنا هذه المشكلة باستخدام موارد مختلفة وقليلًا من الإصلاح.
نية
نريد أن نكون قادرين على استضافة تثبيت محلي للموقع وتثبيت عن بعد للموقع يعمل كلاهما من نفس قاعدة البيانات (عن بعد).
مشكلة
تعيد إعدادات WordPress متعددة المواقع دائمًا التوجيه إلى التثبيت الأساسي ، في هذه الحالة: remote. هذا يجعل من الصعب العمل على كود تطوير من شأنه أن يعكس الموقع البعيد بالضبط.
للتغلب على هذا ، من الضروري تشغيل تثبيتين يستخدمان قواعد بيانات مختلفة. يمكن أن يؤدي هذا إلى حدوث تعارضات مربكة ومشكلات في المزامنة ، لأنه مع كل تعديل ، يجب دمج كل من التعليمات البرمجية وقواعد البيانات.
حل
سنستخدم المكون الإضافي WPMU Domain Mapping.
لاحظ أنه سيتم تحرير ملفين من هذا المكون الإضافي مباشرةً ، لذلك من المهم تذكر ذلك إذا قمت بتحديث المكون الإضافي لأي سبب من الأسباب!
تفترض هذه العملية أن لديك تثبيت WordPress متعدد المواقع في بيئاتك البعيدة والمحلية.
سيتم فصل الخطوات التالية لكل منها عن طريق المحلية والبعيدة ، حيث أنه من المهم أن يكون لديك إصدارات مختلفة من نفس الملفات في كل موقع.
لذلك ، بعد الانتهاء من إعداد الخلفية ، دعنا نبدأ بالخطوات!
بنية الدليل لمواقع ووردبريس المحلية والنائية المتعددة
كمرجع ، ستكون بنية الملف لهذا الإعداد ، في كل من البيئتين المحلية والبعيدة ، على النحو التالي:
+ - ملف wp-config.php | + - .htaccess | + - محتوى wp | | | + - شروق الشمس | | | + - الإضافات | | | + - خرائط وورد-مو-المجال | | | + - سجل التغيير. txt | | | + - domain_mapping.php | | | + - readme.txt | | | + - شروق الشمس | | | + - wordpress-mu-domain-mapping.php
1. بعيد
يقدم هذا القسم تفاصيل عن الملفات والإعدادات البعيدة.
1.1 ملف wp-config.php
لا ينبغي تغيير هذا على الخادم البعيد.
1.2 تعيين مجال WordPress MU (عن بُعد!)
قم بتنزيل المكون الإضافي WordPress MU Domain Mapping من هنا:
https://en-gb.wordpress.org/plugins/wordpress-mu-domain-mapping/
قم بالتثبيت في موقع بعيد و "تنشيط الشبكة" بحيث يكون نشطًا على جميع المواقع.
1.3 شروق الشمس. php
انسخ ملف sunrise.php من البرنامج المساعد wordpress-mu-domain-mapping مباشرةً إلى دليل wp-content ، بحيث يكون موجودًا هنا:
/wp-content/sunrise.php
1.4 إنهاء عمليات التحرير عن بُعد
لقد انتهيت الآن من تحرير الموقع البعيد. قم بزيارة بضع صفحات للتأكد من عدم كسر أي شيء ، وقد انتهينا هنا.
2. محلي
يوضح هذا القسم ما يجب القيام به على المضيف المحلي. تم تكرار بعض التعليمات البرمجية ، ولكن يتم عرض الكل للتأكد من اكتماله.
2.1 ملف wp-config.php
انسخ الكود أدناه والصقه في ملف wp-config.php. يمكنك بعد ذلك تحديثه بالتفاصيل من ملف wp-config.php البعيد (قاعدة البيانات ، إلخ)
ستحتاج إلى تحديث هذا بتفاصيل قاعدة البيانات الخاصة بك ، وما إلى ذلك ، لكننا سننتهي بمستند مشابه للمستند الموضح أدناه في " قائمة الكود 1: wp-config.php ".
قائمة الكود 1: wp-config.php
<؟ phpتعريف ("البيئة" ، "التنمية") ؛
تعريف ('WP_DEBUG_LOG' ، صحيح) ؛
تعريف ('WP_DEBUG_DISPLAY' ، صحيح) ؛
تعريف ('WP_DEBUG' ، صحيح) ؛/ * إعدادات MySQL * /
/ ** اسم قاعدة البيانات الخاصة بـ WordPress * /
تعريف ("DB_NAME" ، "mysite_db") ؛/ ** اسم مستخدم قاعدة بيانات MySQL * /
تعريف ('DB_USER'، 'mysite_user') ؛/ ** كلمة مرور قاعدة بيانات MySQL * /
تعريف ('DB_PASSWORD' ، '***********') ؛/ ** اسم مضيف MySQL * /
تعريف ("DB_HOST" ، "example.com") ؛/ ** محارف قاعدة البيانات لاستخدامها في إنشاء جداول قاعدة البيانات. * /
تعريف ('DB_CHARSET'، 'utf8') ؛/ ** نوع ترتيب قاعدة البيانات. لا تغير هذا إذا كنت في شك. * /
تعريف ("DB_COLLATE") ؛حدد ("AUTH_KEY" ، "***********") ؛
حدد ("SECURE_AUTH_KEY" ، "***********") ؛
حدد ('LOGGED_IN_KEY' ، '***********') ؛
حدد ("NONCE_KEY" ، "***********") ؛
حدد ("AUTH_SALT" ، "***********") ؛
حدد ('SECURE_AUTH_SALT' ، '***********') ؛
حدد ('LOGGED_IN_SALT' ، '***********') ؛
حدد ('NONCE_SALT' ، '***********') ؛table_prefix $ = 'wp_'؛
/ * متعدد المواقع * /
تعريف ('WP_ALLOW_MULTISITE' ، صحيح) ؛
تعريف ("متعدد المواقع" ، صحيح) ؛
تعريف ('SUBDOMAIN_INSTALL' ، خطأ) ؛
تعريف ("DOMAIN_CURRENT_SITE" ، "example.com") ؛
تعريف ('PATH_CURRENT_SITE'، '/') ؛
حدد ('SITE_ID_CURRENT_SITE'، 1) ؛
حدد ("BLOG_ID_CURRENT_SITE"، 1) ؛تعريف ('ADMIN_COOKIE_PATH'، '/') ؛
تعريف ("COOKIEPATH") ؛
تعريف ("SITECOOKIEPATH") ؛// WPMU شارك عناصر DB
حدد ('SUNRISE'، 'on')؛
تعريف ('WP_PRODUCTION_DOMAIN'، 'example.com')؛
تعريف ('WP_DEVELOPMENT_DOMAIN'، 'mysite-local-domain') ؛/ * هذا كل شيء ، توقف عن التحرير! تدوين سعيد. * /
/ ** المسار المطلق إلى دليل WordPress. * /
إذا (! المعرفة ("أبسبات")) {
عرّف ('ABSPATH'، dirname (__FILE__). '/') ؛
}/ ** إعداد متغيرات WordPress والملفات المضمنة. * /
need_once (ABSPATH. 'wp-settings.php') ؛
2.2 تعيين نطاق WordPress MU (محلي!)
أضف نفس المكون الإضافي إلى الموقع المحلي. قد تعتقد أن هذا ، وفقًا للموقع البعيد ، لكنك مخطئ!
افتح الملف domain_mapping.php في المحرر المفضل لديك وقم بتحرير الأسطر 708 و 709 بحيث تبدو جملة if بأكملها كما يلي:
قائمة الكود 2: domain_mapping.php
إذا ($ url && $ url! = untrailingslashit ($ protocol. $ current_blog-> domain. $ current_blog-> path)) {
$ redirect = get_site_option ('dm_301_redirect')؟ "301": "302" ؛
إذا ((مُعرَّفة ("VHOST") && ثابت ("VHOST")! = "نعم") || (مُعرَّفة ('SUBDOMAIN_INSTALL') && ثابت ('SUBDOMAIN_INSTALL') == false)) {
$ _SERVER ['REQUEST_URI'] = str_replace ($ current_blog-> path، '/'، $ _SERVER ['REQUEST_URI']) ؛
}
// header (“الموقع: {$ url} {$ _ SERVER ['REQUEST_URI']}”، true، $ redirect)؛
// خروج؛
}
2.3 شروق الشمس
أولاً ، انسخ ملف sunrise.php من البرنامج المساعد wordpress-mu-domain-mapping إلى دليل wp-content. قد يكون هناك بالفعل ملف sunrise.php هنا. لا تقلق - فقط اكتبه.
انسخ من هنا:
/wp-content/plugins/wordpress-mu-domain-mapping/sunrise.php
إلى هنا:
/wp-content/sunrise.php
بعد ذلك ، قم بتحرير ملف sunrise.php الجديد هذا ، مضيفًا سطورًا حول السطر 40 ، بحيث يبدو مثل الكود أدناه:
قائمة الكود 3: sunrise.php
<؟ php if (! المعرفة ('SUNRISE_LOADED')) {حدد ('SUNRISE_LOADED'، 1)؛ } إذا (تم تعريفه ('COOKIE_DOMAIN')) {die ('تم تعريف الثابت "COOKIE_DOMAIN" (ربما في wp-config.php). يرجى إزالة هذا التعريف أو التعليق عليه () سطر.') ؛ } $ wpdb-> dmtable = $ wpdb-> base_prefix. "domain_mapping" ؛
$ dm_domain = $ _SERVER ['HTTP_HOST'] ؛إذا (($ nowww = preg_replace ('| ^ www. |'، ”، $ dm_domain))! = $ dm_domain) {
$ where = $ wpdb-> تحضير ('domain IN (٪ s،٪ s)'، $ dm_domain، $ nowww)؛
} آخر {
$ حيث = $ wpdb-> تحضير ('المجال =٪ s'، $ dm_domain)؛
}$ wpdb-> suppress_errors () ؛
$ domain_mapping_id = $ wpdb-> get_var (“حدد blog_id من {$ wpdb-> dmtable} حيث {$ حيث} ORDER BY CHAR_LENGTH (المجال) DESC LIMIT 1”) ؛
$ wpdb-> suppress_errors (خطأ) ؛
إذا ($ domain_mapping_id) {
$ current_blog = $ wpdb-> get_row (“SELECT * من {$ wpdb-> blogs} WHERE blog_id = '$ domain_mapping_id' LIMIT 1”) ؛
$ current_blog-> المجال = $ dm_domain ؛
$ current_blog-> المسار = '/' ؛
$ blog_id = $ domain_mapping_id؛
$ site_id = $ current_blog-> site_id ؛تعريف ('COOKIE_DOMAIN'، $ dm_domain) ؛
$ current_site = $ wpdb-> get_row (“SELECT * من {$ 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}'”) ؛
إذا (function_exists ('get_site_option')) {
$ current_site-> site_name = get_site_option ('site_name') ؛
} elseif (function_exists ('get_current_site_name')) {
$ current_site = get_current_site_name ($ current_site) ؛
}![]()
حدد ("DOMAIN_MAPPING"، 1) ؛
}/ *
* 1) رمز MULITISITE المضافة
* /// يقوم بتصفية المجال الذي يتم عرضه / الإخراج إلى HTML
add_filter ('pre_option_home'، 'dev_pre_url_filter'، 1) ؛
add_filter ('pre_option_siteurl'، 'dev_pre_url_filter'، 1) ؛
add_filter ('the_content'، '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) ؛الوظيفة dev_pre_url_filter () {
العالمية $ wpdb، $ path، $ switched؛
عنوان url $؛
$ switched_path؛
$ blog_id = get_current_blog_id () ،إذا (! $ تبديل) {
$ url = is_ssl ()؟ 'https: //': 'http: //'؛
$ url. = WP_DEVELOPMENT_DOMAIN ؛
إذا (! is_main_site ()) {
$ url. = rtrim ($ path، '/')؛
}العودة $ url؛
} آخر {
$ switched_path = $ wpdb-> get_var (“SELECT path FROM {$ 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، '/')؛العودة $ url؛
}
}الدالة dev_content_filter ($ post_content) {
wpdb دولار عالمي ؛$ blog_details = get_blog_details () ؛
$ original_url = $ wpdb-> get_var (“تحديد المجال من {$ wpdb-> dmtable} حيث blog_id = {$ blog_details-> blog_id} ORDER BY CHAR_LENGTH (المجال) DESC LIMIT 1”) ؛
$ dev_url = WP_DEVELOPMENT_DOMAIN. $ blog_details-> المسار ؛إذا (original_url $! == خالية) {
$ post_content = str_replace ($ original_url. '/'، $ original_url، $ post_content)؛
$ post_content = str_replace ($ original_url، $ dev_url، $ post_content)؛
}
// قم بتغيير كل عناوين url للإشارة إلى التدريج (الصور ، المراسي ، أي شيء داخل محتوى المنشور)
$ post_content = str_replace (WP_PRODUCTION_DOMAIN، WP_DEVELOPMENT_DOMAIN، $ post_content)؛
// قم بتغيير عناوين url الخاصة بـ "التحميلات" للإشارة إلى الإنتاج حتى تكون الصور مرئية
$ post_content = str_replace (WP_DEVELOPMENT_DOMAIN. $ blog_details-> path. 'wp-content / uploads'، WP_PRODUCTION_DOMAIN. $ blog_details-> path. 'wp-content / uploads'، $ post_content) ؛إرجاع $ post_content؛
}/ *
* تقوم بتصفية وظيفة content_url - تبحث تحديدًا عن مكالمات content_url ("تحميل") حيث يوجد تحميلات للمسار في السلسلة
*
* تمت الإضافة بحيث يمكن لـ MU-Plugins استخدام content_url على DEV و PROD
* /
الدالة dev_content_url_filter ($ url، $ path) {
إذا (! blank ($ path) && strpos ($ path، 'uploads')! == false) {
إرجاع str_replace (WP_DEVELOPMENT_DOMAIN، WP_PRODUCTION_DOMAIN، $ url) ؛
}العودة $ url؛
}دالة dev_upload_dir_filter (بارام $) {
$ param ['url'] = str_replace (WP_DEVELOPMENT_DOMAIN، WP_PRODUCTION_DOMAIN، $ param ['url'])؛
$ param ['baseurl'] = str_replace (WP_DEVELOPMENT_DOMAIN، WP_PRODUCTION_DOMAIN، $ param ['baseurl']) ؛عودة بارام $؛
}/ *
* استبدال /wp-includes/ms-load.php get_site_by_path
* /
function dev_get_site_by_path ($ _site ، $ _domain ، $ _path ، $ _segments ، $ _paths) {
العالمية $ wpdb، $ path؛// حتى يكون هناك تطابق محتمل في قاعدة البيانات ، قم بتعيين $ _domain ليكون WP_PRODUCTION_DOMAIN
$ _domain = WP_PRODUCTION_DOMAIN ؛// ابحث عن موقع يطابق المجال ومقطع المسار الأول
$ site = $ wpdb-> get_row ($ wpdb-> تحضير (“SELECT * FROM $ wpdb-> blogs WHERE domain =٪ s and path =٪ s”، $ _domain، $ _paths [0]))؛
$ current_path = $ _paths [0] ؛إذا (موقع $ === فارغ) {
// خصيصًا للمدونة الرئيسية - إذا لم يتم العثور على موقع ، فقم بتحميل المدونة الرئيسية
$ site = $ wpdb-> get_row ($ wpdb-> تحضير (“SELECT * FROM $ wpdb-> blogs WHERE domain =٪ s and path =٪ s”، $ _domain، '/'))؛
$ current_path = '/' ؛
}// تعيين المسار لمطابقة الجزء الأول
المسار $ = $ current_path ؛عودة موقع $؛
}add_filter ('pre_get_site_by_path'، 'dev_get_site_by_path'، 1، 5) ؛
3. htaccess (محلي)
أدخل ما يلي في ملف htaccess الخاص بك (لاحظ أنه قد تمت إزالة الدليل المحلي من سطر RewriteRule index.php النهائي):
قائمة التعليمات البرمجية 4: htaccess
# ابدأ وورد
<IfModule mod_rewrite.c> ؛
أعد كتابة المحرك
إعادة كتابة القاعدة /
RewriteRule ^ index.php $ - [L]# إضافة شرطة مائلة إلى / wp-admin
RewriteRule ^ wp-admin $ wp-admin / [R = 301، L]RewriteCond٪ {REQUEST_FILENAME} -f [أو]
RewriteCond٪ {REQUEST_FILENAME} -d
أعد كتابة القاعدة ^ - [L]
RewriteRule ^ (wp- (content | admin | include). *) $ 1 [L]
أعد كتابة القاعدة ^ (. *. php) $ 1 [L]
أعد كتابة القاعدة. /index.php [L]
</IfModule> ؛# END WordPress
4. مضيفات افتراضية
قم بإعداد مضيفات افتراضية بحيث يمكنك كتابة القيمة الواردة في wp-config.php (أعلاه) لـ WP_DEVELOPMENT_DOMAIN في شريط عنوان المتصفح والوصول إلى الموقع. عادةً ما تكتب localhost ، لكن هذا سوف يتجاوز ذلك.
في مثال الكود (أعلاه) ، تم تعيين المضيف الظاهري ليأخذ "price-buckland" في شريط العنوان ويوجه إلى الدليل الذي يحتوي على WordPress.
تكون عملية إضافة مضيفين افتراضيين في بيئة MAMP كما يلي:
1) في المحطة:
sudo $ السادس / الخ / المضيفين
2) أضف السطر التالي ، واستبدل العنوان الذي تريد كتابته في متصفحك بالشكل المناسب:
127.0.0.1 mysite-local-domain
3) بعد ذلك ، نريد تنشيط المضيفات الظاهرية لبيئتك المحلية ، لذا افتح الملف التالي للتحرير:
sudo vi /Applications/MAMP/conf/apache/httpd.conf
ابحث عن هذه الخطوط:
# المضيفون الظاهريون # Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
وأزل التعليق عن سطر "التضمين" ، مثل:
# المضيفون الظاهريون تضمين /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
4) الآن قم بتحرير الملف التالي:
sudo vi /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
وأضف إدخالين - أولاً للسماح لـ "المضيف المحلي" في المستعرض الخاص بك ، وثانيًا ، لإضافة المضيف الظاهري الجديد ، مما يتيح لك كتابة مجال مخصص في متصفحك والوصول إلى الخادم المحلي الخاص بك:
DocumentRoot "/ Users / username / htdocs /"
اسم الخادم المضيف المحلي
DocumentRoot "/ Users / username / htdocs / mysite-local-directory"
اسم الخادم mysite-local-domain
5) أعد تشغيل خادم اباتشي. في حالتي ، MAMP ، ولكن من سطر الأوامر ، قم بتشغيل:
إعادة تشغيل apachectl
إذا سارت الأمور على ما يرام ، يجب أن يكون لديك الآن إعداد عمل يتيح لك ترميز تثبيت WordPress المستضاف محليًا ، والذي يستخدم قاعدة بيانات بعيدة.
يجب أن تكون أيضًا قادرًا على دفع تغييراتك إلى الخادم البعيد ومشاهدة نسخة طبق الأصل على الموقع البعيد.
استكشاف الأخطاء وإصلاحها والتحذيرات والمشاكل!
لسوء الحظ ، يمكن أن تسوء العديد من الأشياء. إليك بعض الأعراض والأشياء التي يجب تجربتها:
- صفحات الإدارة جيدة ، لكن لا يمكنني زيارة أي صفحات أمامية داخلية!
- .htaccess إما مفقود أو لم تتم تهيئته. أضف الملف وأعد حفظ الروابط الثابتة الخاصة بك.
- المزيد قادم قريبا!
عند العمل على موقعك المحلي ، إذا ذهبت إلى:
مواقعي> مسؤول الشبكة> لوحة التحكم
سينقلك إلى الموقع البعيد ، أي:
example.com/wp-admin/network
قد لا يكون هذا هو ما تريده ، ولكن يمكنك الكتابة مباشرة في شريط العناوين والبقاء في البيئة المحلية ، على سبيل المثال:
mysite-local / wp-admin / الشبكة
استنتاج
إذا سارت الأمور على ما يرام ، يجب أن يكون لديك الآن إعداد عمل يتيح لك ترميز تثبيت WordPress المستضاف محليًا ، والذي يستخدم قاعدة بيانات بعيدة.
يجب أن تكون أيضًا قادرًا على دفع تغييراتك إلى الخادم البعيد ومشاهدة نسخة طبق الأصل على الموقع البعيد.
أخبرنا كيف حصلت على هذا الدليل التفصيلي خطوة بخطوة إلى مواقع WordPress المتعددة للتطوير المحلي والبعد في التعليقات أدناه!
إذا كنت بحاجة إلى مساعدة في تطوير الويب الخاص بك ، فلا تتردد في الاتصال بنا.
