مقاله وردپرس

PHP 8.5 برای وردپرس‌کارها؛ pipe، clone with و وقت درست ارتقا

PHP 8.5 حالا رسماً با وردپرس ۶.۹ به بعد سازگار است. این‌جا ویژگی‌هایی را مرور می‌کنم که واقعاً به کد افزونه و قالب می‌آیند، چیزهایی که منسوخ شده‌اند، و ترتیبی که من برای ارتقای سرور مشتری پیشنهاد می‌کنم.

حمید اعراب توسعه‌دهنده ارشد بک‌اند وردپرس و ووکامرس
انتشار
زمان مطالعه
۵ دقیقه مطالعه

حمید اعراب ۲۷ مهر ۱۴۰۵ ۵ دقیقه مطالعه

جلد پیکسلی: براکت‌های کد و عملگر pipe در PHP 8.5
فهرست مطالب (6)

PHP 8.5 در ۲۰ نوامبر ۲۰۲۵ منتشر شد. در ماه‌های اول، جواب کوتاه به سؤال «سایت را ببرم روی ۸.۵؟» این بود: «هنوز نه». تا اینکه تیم هستهٔ وردپرس در مه ۲۰۲۶ اعلام کرد وردپرس ۶.۹ و ۷.۰ به‌طور کامل از PHP 8.5 پشتیبانی می‌کنند. برچسب «پشتیبانی آزمایشی» را هم برای همیشه کنار گذاشت.

پس هسته آماده است. سؤال واقعی حالا این است که افزونه‌ها و کد خود شما آماده‌اند یا نه، و چه چیزی در ۸.۵ ارزش استفاده دارد.

عملگر pipe: خواناتر، نه جادویی

مهم‌ترین تغییر ظاهری ۸.۵ عملگر |> است. مقدار سمت چپ را به callable سمت راست می‌دهد و می‌شود زنجیره ساخت. مثال کلاسیکش ساختن slug از یک عنوان است:

$slug = $title
	|> trim(...)
	|> ( fn( $s ) => str_replace( ' ', '-', $s ) )
	|> strtolower(...);

در کد وردپرس، جایی که بیشتر به کار می‌آید، زنجیره‌های پاک‌سازی و تبدیل داده است. مثلاً تمیز کردن یک ورودی قبل از ذخیره:

$clean_tags = $raw_tags
	|> ( fn( $s ) => explode( ',', $s ) )
	|> ( fn( $a ) => array_map( 'sanitize_text_field', $a ) )
	|> ( fn( $a ) => array_filter( $a ) )
	|> array_values(...);

سه محدودیت مهم هم دارد:

  • فقط یک پارامتر اجباری: هر callable در زنجیره باید دقیقاً یک پارامتر اجباری بگیرد، و مقدار همیشه به‌عنوان اولین آرگومان داده می‌شود.
  • بدون پارامتر ارجاعی: توابعی که پارامترشان by-reference است، مثل array_pop، در زنجیره مجاز نیستند.
  • ناسازگاری با نسخه‌های قبل: کدی که |> دارد روی PHP 8.4 و قبل‌تر اصلاً parse نمی‌شود. یعنی در افزونه‌ای که برای عموم منتشر می‌کنید، هنوز وقتش نیست. حداقل PHP وردپرس 7.4 است و کاربران شما روی همه‌جور سروری هستند. در پروژه‌های اختصاصی که سرورش دست خودتان است، مشکلی نیست.

clone with: پایان متدهای with دست‌ساز

اگر با شیءهای readonly کار می‌کنید، مثلاً value objectها در یک افزونهٔ پرداخت، clone حالا می‌تواند هم‌زمان چند ویژگی را عوض کند:

final readonly class Money {
	public function __construct(
		public int $amount,
		public string $currency,
	) {}

	public function withAmount( int $amount ): self {
		return clone( $this, array( 'amount' => $amount ) );
	}
}

قبلاً برای این کار یا باید سازنده را دوباره با همهٔ آرگومان‌ها صدا می‌زدید، یا با Reflection ور می‌رفتید.

چیزهای کوچکی که هر روز به کار می‌آیند

  • **array_first() و array_last():** اولین و آخرین مقدار آرایه را می‌دهند و برای آرایهٔ خالی null برمی‌گردانند. با ?? خیلی تمیز ترکیب می‌شوند. دیگر لازم نیست reset() و end() اشاره‌گر داخلی آرایه را جابه‌جا کنند.
  • **#[\NoDiscard]:** اگر خروجی تابعی که با این attribute علامت خورده استفاده نشود، PHP هشدار می‌دهد. برای توابعی که یک شیء تغییریافته برمی‌گردانند و همه فکر می‌کنند خود شیء را تغییر داده‌اند، عالی است.
  • افزونهٔ URI: کلاس Uri\Rfc3986\Uri آدرس‌ها را مطابق RFC 3986 و استاندارد WHATWG تجزیه می‌کند. برای اعتبارسنجی redirectها و webhookها، از parse_url قابل‌اعتمادتر است.
  • backtrace برای خطاهای fatal: خطاهایی مثل تمام شدن زمان اجرا حالا رد کامل اجرا را نشان می‌دهند. برای دیباگ cronهای سنگین ووکامرس، همین یک مورد ارزش ارتقا را دارد.

چه چیزهایی منسوخ شده

این‌ها را در افزونه‌های قدیمی، به‌خصوص کدهایی که چند دست چرخیده‌اند، زیاد می‌بینید:

  • نام‌های غیراستاندارد cast: (boolean)، (integer)، (double) و (binary) منسوخ شده‌اند. به‌جایشان (bool)، (int)، (float) و (string) بنویسید.
  • عملگر backtick: استفاده از آن به‌جای shell_exec() منسوخ شده. اگر در افزونه‌ای چنین چیزی دیدید، احتمالاً مشکل امنیتی بزرگ‌تری هم در کار است.
  • null به‌عنوان کلید آرایه: استفاده از null به‌عنوان کلید آرایه یا در array_key_exists() منسوخ شده.
  • پایان case با نقطه‌ویرگول: پایان دادن case با ; به‌جای : منسوخ شده.
  • **__sleep() و __wakeup():** این دو soft-deprecated شده‌اند و جایگزینشان __serialize() و __unserialize() است.
  • هشدارهای تازه: تبدیل float به int وقتی قابل‌نمایش نیست، و destructuring مقدار غیرآرایه، حالا هشدار می‌دهند.

هیچ‌کدام سایت را از کار نمی‌اندازد، ولی لاگ را پر می‌کند. لاگ پر هم یعنی خطای واقعی بعدی را دیر می‌بینید.

ترتیبی که من برای ارتقا پیشنهاد می‌کنم

  1. اول بدانید روی چه نسخه‌ای هستید. از «ابزارها › سلامت سایت › اطلاعات» نسخهٔ PHP را ببینید. حداقل نسخهٔ پیشنهادی وردپرس هنوز 8.3 است. اگر زیر آن هستید، اول به 8.3 یا 8.4 بروید.
  2. روی staging با هشدارهای کامل تست کنید. WP_DEBUG و WP_DEBUG_LOG را روشن کنید. مسیرهای حساس را از اول تا آخر اجرا کنید: پرداخت، ثبت‌نام، cronها و webhookها. بعد لاگ را بخوانید.
  3. اسکن خودکار سازگاری بگیرید. ابزار PHPCompatibility روی PHPCS، با تنظیم نسخهٔ هدف ۸.۵، بیشتر موارد منسوخ را پیش از اجرا پیدا می‌کند.
  4. افزونه‌های تجاری را جدا بررسی کنید. به‌خصوص افزونه‌هایی که کدشان رمزگذاری شده؛ این‌ها معمولاً آخرین چیزی‌اند که با PHP تازه سازگار می‌شوند.
  5. ارتقای PHP را جدا از ارتقای وردپرس و افزونه‌ها انجام دهید. وقتی سه چیز با هم عوض شوند و چیزی بشکند، نمی‌دانید تقصیر کدام بوده.

PHP 8.5 یک نسخهٔ انقلابی نیست، ولی پر از چیزهای کوچکی است که کد را تمیزتر و دیباگ را راحت‌تر می‌کند. اگر پروژه‌تان اختصاصی است و سرور دست خودتان است، الان وقت خوبی برای امتحانش روی staging است. اگر افزونهٔ عمومی می‌نویسید، از ویژگی‌های تازه‌اش فعلاً فقط در شاخه‌هایی استفاده کنید که Requires PHP آن‌ها را واقعاً ۸.۵ گذاشته‌اید.

منابع

$ ./request_review

همین مشکل را در فروشگاه خودتان دارید؟

توسعه‌دهنده ارشد WordPress و WooCommerce برای معماری، اتصال سیستم‌ها و حل مسائل پیچیده production.

درخواست بررسی فنی

دیدگاه‌ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *