💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ مهدی فانی
رفع یک اشکال در سیستم روتینگ
جامعه وردپرس (برنامه نویسی) ایجاد شده در ۲۳ خرداد ۱۴۰۳

یک مشکل نسبتا مهم توی این سیستم روتینگ وجود داره که بهتره برطرفش کنین تا از تداخل جلوگیری بشه.
توی این روش فرقی نمیکنه که عبارت panel (آدرس بیس روتینگ شما) کجای request_uri میاد.
مثلا شما میخواین پنل شما برای این آدرس کار کنه:

example.com/panel/....

برای این آدرس پنل شما درست نمایش میده.
اما برای این آدرس‌ها هم سیستم روتینگ شما کار میکنه:

example.com/test/panel/....
example.com/category/panel/....
example.com/tags/panel/....

 

اما باید کاری کنین که این پنل تنها برای بیس آدرسی که میخواین فقط اجرا بشه و برای آدرس‌های ناخواسته ایگنور بشه.
یعنی مثلا فقط در صورتی اجرا بشه که فقط panel بعد از آدرس هوم پیج اومد. کافیه که یک شرط توی متدی که داره ریکوئست رو هندل میکنه اضافه کنین به این صورت:
 

if (preg_match('#^/panel#', $request_uri)) {
$this->dispatch_request( $request_uri );
}

 

این خط چک میکنه که اگر عبارت panel دقیقا بعد از آدرس سایت اومد سیستم روتینگ رو اجرا میکنه و دیگه اون آدرس‌های ناخواسته رو ایگنور میکنه.

کدهای این کلاس اینطوری میشه:

<?php
defined( 'ABSPATH' ) || exit;
class UppRouter {
public function __construct() {
add_action( 'init', [ $this, 'handle_routes' ] );
}
public function handle_routes() {
$request_uri = $_SERVER['REQUEST_URI'];
$request_uri = str_replace('-','_',$request_uri);
این بخشی هست که چک میکنه که عبارت بیس روت شما دقیقا بعد از هوم پیج اومده یانه.؟
if (preg_match('#^/dashboard#', $request_uri)) {
$this->dispatch_request( $request_uri );
}
}
private function dispatch_request( $request_uri ) {
if ( strpos( $request_uri, 'dashboard' ) === false ) {
return;
}
$handler = $this->parse_uri( $request_uri );
$handler_name = $this->format_handler_name( $handler );
if ( ! $this->is_handler_valid( $handler_name ) ) {
$this->display_error_page();
exit;
}
$handler_path = $this->get_handler_file( $handler_name );
require_once $handler_path;
$handlerInstance = new $handler_name;
$handlerInstance->index();
exit;
}
private function parse_uri( $uri ) {
اگر دوست دارین انتهای آدرس‌های روتینگ تون تریلینگ اسلش بزارین هم این کد رو جایگزین کنین.
$uri_parts = explode( '/', rtrim( strtok( $uri, '?' ), '/' ) );
return end( $uri_parts );
}
private function is_handler_valid( $handler ) {
$handler_file_path = $this->get_handler_file( $handler );
return file_exists( $handler_file_path ) && is_readable( $handler_file_path );
}
private function get_handler_file( $handler ) {
$handler_file_path = UPP_DIR . DIRECTORY_SEPARATOR . 'panel/controllers/' . $handler . '.php';
return $handler_file_path;
}
private function format_handler_name( $handler ) {
$formatted_handler = ucfirst( $handler ) . 'Controller';
return $formatted_handler;
}
private function display_error_page() {
include UPP_DIR . 'views/panel/error/error.php';
}
}


حتما این مورد لحاظ کنین تا تداخلی توی آدرس بندی هاتون ایجاد نشه. موفق باشین.

با سلام

از دقت شما و اینکه راه حل رو با بقیه به اشتراک گذاشتید متشکریم

قطعا دوستان استفاده می‌کنند.

موفق باشید

بهنام مرادی ۲۴ خرداد ۱۴۰۳، ۱۰:۰۹