یک انجمن خیریه در قزوین سایتی دارد که یک داوطلب سهشنبهها بهروزش میکند. داوطلب یک جمله تایپ میکند؛ چهار تکه کد دیگر اجازه دارند پیش از اینکه کسی بخواندش عوضش کنند. همان چیدمان، تعریف یک سیستم مدیریت محتواست، و کل سازوکارش دوازده سطر است:
add_filter('matn_elan', fn($t) => str_replace('9 ta 1', '9 sobh ta 1', $t), 10);add_filter('matn_elan', fn($t) => $t . ' (انبار قزوین)', 20);
فیلتر تابعی است که هسته پیش از استفاده از یک مقدار، رویش صدا میزند. هسته رشته tozi shanbe, 9 ta 1 را رسم میکند؛ با آن دو ثبتشده، tozi shanbe, 9 sobh ta 1 (انبار قزوین) رسم میشود. هیچکدام از آن دو داوطلب سایت را ویرایش نکردند. هرکدام یک تابع نوشتند و گفتند کجا صدا زده شود، و به همین دلیل است که یک افزونه میتواند رفتاری را عوض کند که مالکش نیست و بهروزرسانی هسته کارشان را دور نمیریزد.
add_filter نام قلاب و تابع و یک اولویت را میگیرد، و اولویت ترتیب را تعیین میکند. فیلتری با اولویت ۵ پیش از فیلتری با اولویت ۱۰ اجرا میشود، به هر ترتیبی که ثبت شده باشند، و آن عدد تنها چیزی است که توالی را کنترل میکند.
کلمهها کجا هستند، و صفحه کجاست
ایده دوم جداییای است که یک سایت ایستا لازمش ندارد. محتوا در یک سطر جدول زندگی میکند و نمایش در یک فایل قالب، و آن دو لحظهای به هم میرسند که کسی صفحه را میخواهد. همین است که به داوطلب اجازه میدهد جمله را بدون دست زدن به فایل عوض کند و به طراح اجازه میدهد هر صفحه را بدون دست زدن به جمله عوض کند.
اینکه کدام قالب اجرا میشود را یک قاعده تعیین میکند نه یک تنظیم: سلسلهمراتب قالب مشخصترین فایلی را برمیدارد که وجود دارد. فایل مشخصتری اضافه کنید و بدون ثبت شدن جایی، کار را در دست میگیرد، که همان بخشی است که آدمها اولش تعجب میکنند و بعد هر روز رویش حساب میکنند. آن چیزی که سهم بزرگی از وب را میگرداند است.
این انتخاب درباره اجازه است نه درباره امکانات
انتخاب یک سیستم یعنی انتخاب اینکه چه کسی اجازه دارد چه چیزی را عوض کند، و هر تفاوت فنی روی جدولهای مقایسه از همین یک تصمیم درمیآید نه برعکس.
یک سیستم میزبانیشده، توانایی عوض کردن هر چیزی را با هرگز وصله نزدن معامله میکند. هیچکس در آن انجمن هرگز یک بهروزرسانی امنیتی نصب نمیکند، و هیچکس آنجا هرگز فیلدی اضافه نمیکند که فروشنده فکرش را نکرده. آن شکل صادقانه قالب، Liquid، و معامله میزبانیشده است. میزبانی روی سرور خودتان هر دو نیمه را برعکس میکند.
محور دیگر این است که ویرایشگر چقدر اجازه جابهجایی دارد. سیستمی که به یک داوطلب اجازه بدهد یک صفحه را از نو بچیند، سیستمی است که در آن یک داوطلب میتواند یک صفحه را خراب کند، و بستن این نه محدودیتی است که باید دورش زد بلکه دلیل دوام آوردن این چیدمان طی سه سال سهشنبه است. جایی که محتوا واقعاً ساختار دارد، آن ساختار کل استدلال محتوای ساختاریافته، برای سایتهایی که لازمش دارند و محتوا، ماژول و کامپوننت است. بیسر بودن یعنی محتوا از راه یک API گرفته میشود و جای دیگری رسم، که ویرایش را نگه میدارد و قالبها را میاندازد؛ آن معامله محتوا روی یک API، رسمشده جای دیگر است.
تصمیم واقعی
دو پرسشی که سیستم را برای شما انتخاب میکنند
نه امکانات. اینکه وقتی یک آسیبپذیری منتشر شد چه کسی وصلهاش میزند، و ویرایشگر چقدر اجازه جابهجایی دارد.
ویرایشگر کلمهها را عوض میکند
- نقشها محدود به ویرایش محتوا
- نه سروری، نه بهروزرسانیای، نه فیلدی که فکرش را نکرده باشند
ویرایشگر چیدمان را عوض میکند
- یک داوطلب میتواند صفحهای را از نو بسازد، و میتواند خرابش کند
- خروجی گرفتن، پرسشی است که باید پیش از ثبتنام پرسید
هیچ چیز اینجا نمیگوید کدام خانه بهتر است. آنکه خراب میشود انتخاب کردن یکی و بعد کار کردن مثل خانه دیگری است.
ابزار، و سالی که این حرف درست است
یک نسخه توسعه محلی اولین ابزار است و نسخههای رایگانش هست. جای ویرایش کردن فایلها روی سرور زنده را گرفت، که هنوز بخش بزرگی از این کار همانطور انجام میشود و دلیل این است که اینقدر از این سایتها فایلی به نام index-old.php دارند.
بهروزرسانی خودکار هسته و انتشارهای امنیتی رایگان است و در بیشتر سیستمها پیشفرض روشن است. جای این را گرفت که یک آدم یادش بماند، و دلیل اینکه اینجا بیشتر از جاهای دیگر اهمیت دارد این است که این سایتها از آدمهایی که ساختندشان عمر بیشتری میکنند: حملهها خودکار و علیه یک شماره نسخه میآیند، و وصلهاش ماهها پیش منتشر شده. یک نسخه آزمایشی با همگامسازی یککلیکی هم سومی است، رایگان در مقیاس کوچک، و جای آزمودن یک بهروزرسانی با اعمال کردنش را گرفت.
و حالا آنچه در ایران بیشترین اهمیت را دارد و در نسخه انگلیسی این صفحه اصلاً نیست. افزونه و قالب تجاری اینجا معمولاً از نسخههای کرکشده تهیه میشود، چون خرید مستقیم از فروشنده خارجی راه ندارد. آن فایلها همان چیزی هستند که رایجترین راه آلوده شدن یک سایت وردپرسی در ایران را میسازند، و مسئله اخلاقی نیست، مسئله فنی است: کدی که کسی برای برداشتن قفلش دستکاری کرده، کد دیگری هم میتواند داخلش باشد و هیچ بهروزرسانیای هم برایش نمیآید. دو راه صادقانهاش هم هست: نسخه رایگان همان افزونه از مخزن رسمی که برای بیشتر کارها کافی است، یا خرید از یک واسطه که پرداخت را انجام میدهد و شما فایل اصلی و بهروزرسانیها را میگیرید.
اشتباه: افزونهای که بیصدا یکی دیگر را از کار میاندازد
این همان خرابیای است که این معماری ممکنش میکند. داوطلب سومی یک فیلتر با اولویت ۵ اضافه میکند که اعلان را بزرگ مینویسد. خروجی میشود TOZI SHANBE, 9 TA 1 (انبار قزوین).
ببینید چه چیزی گم شد. فیلتر بزرگنویسی با اولویت ۵ باعث شد جایگزینی با اولویت ۱۰ دیگر تطبیق نکند، بیصدا: فیلتر زودتر متن را بزرگ کرد، پس فیلتر بعدی دنبال حالت کوچکش گشت، حالت بزرگ را پیدا کرد، و هیچ کاری نکرد. نه خطایی، نه هشداری، و ساعتها روی صفحه غلطاند.
شکل تقریباً هر اشکال مرموز سیستم مدیریت محتوا همین است: نه یک افزونه خراب، بلکه دو افزونه سالم در ترتیبی که کسی انتخابش نکرده. عادتی که کمک میکند این است که پیش از کد به ترتیب شک کنید، افزونهها را نصفنصف خاموش کنید تا رفتار عوض شود، و فیلتری را که روی متن دقیق تطبیق میکند از ساختار شکننده بدانید.
چیزی که این صفحه باز میگذارد این است که وقتی محتوا باید فروخته شود نه خوانده، چه اتفاقی میافتد. سازوکار زیر همهاش، یعنی یک درخواست که با کنار هم گذاشتن یک سطر و یک قالب جواب داده میشود، بکاند است، و زبانی که بیشتر این سیستمها با آن نوشته شدهاند PHP است، و همهاش زیر وب نشسته است.