با افزونه قالب های صفحه را به وردپرس اضافه کنید

با افزونه قالب های صفحه را به وردپرس اضافه کنید

به‌روزرسانی: کد اخیراً به‌روزرسانی شده است تا روی WordPress نسخه 4.7 و بالاتر کار کند

آیا تا به حال خواسته اید الگوهای صفحه خود را ایجاد کنید، اما به خود موضوع دسترسی نداشته باشید؟ من به عنوان یک نویسنده افزونه وردپرس، متوجه شدم که این مشکل در هنگام توسعه افزونه هایم آزار دهنده است. خوشبختانه راه حل بسیار ساده است! من قصد دارم شما را به سرعت از طریق چند خط کد که برای ایجاد پویا قالب های صفحه وردپرس به طور مستقیم از طریق PHP نیاز دارید، راهنمایی کنم.

الهام بخش این مقاله و نبوغ پشت راه حل کد از تام مک فارلین: من از نسخه ویرایش شده خود از کد اصلی او استفاده می کنم که می توانید آن را در GitHub او بیابید. من نظرات او را در آن نگه داشته ام (و همچنین برخی از نظرات خود را اضافه کرده ام) زیرا به نظرم برای توضیح آنچه در حال وقوع است بسیار مفید است – خودم بهتر از این نمی توانستم بگویم!

شما می توانید کد را به طور کامل و یک نمونه افزونه را در پایین این پست پیدا کنید.

آیا شروع کنیم؟

کد

ما تابع PHP خود را با استفاده از یک کلاس PHP ایجاد خواهیم کرد. برای کسانی از شما که به خوبی با کلاس های PHP آشنا نیستند، کلاس به عنوان یک شی تعریف می شود که شامل مجموعه ای از توابع و متغیرهایی است که با هم کار می کنند. معرفی PHP.net جزئیات بیشتر در مورد نحو و نظریه.

wrapper ما فقط به 3 متغیر نیاز دارد:

  1. Plugin Slug: این به سادگی به عنوان یک شناسه منحصر به فرد برای افزونه استفاده می شود.
  2. نمونه کلاس: همانطور که در حال اضافه کردن نمونه ای از این کلاس به سر وردپرس هستیم، بهتر است آن را ذخیره کنیم.
  3. آرایه الگو: همانطور که احتمالاً می توانید حدس بزنید، این آرایه ای است که نام ها و عناوین الگو را در خود جای داده است.

در اینجا آنها به صورت کد هستند:

class PageTemplater {

		/**
         * یک شناسه منحصر به فرد
         */
		 محافظت شده $plugin_slug;

        /**
         * ارجاع به نمونه ای از این کلاس.
         */
        private static $instance;

        /**
         * آرایه قالب هایی که این افزونه ردیابی می کند.
         */
        محافظت شده $templates;

دریافت نمونه کلاس

همانطور که قبلاً گفتم، ما نمونه ای از کلاس خود را با استفاده از تابع add_filter() به سربرگ وردپرس اضافه می کنیم. بنابراین ما به روشی نیاز خواهیم داشت که این نمونه را برای ما برگرداند (یا ایجاد کند).

برای این کار به یک روش ساده نیاز داریم که «get_instance» نامیده می‌شود. آن را در زیر بررسی کنید؛

/**
 * نمونه ای از این کلاس را برمی گرداند. 
 */
تابع استاتیک عمومی get_instance() {

	if( null == self::$instance ) {
		self::$instance = new PageTemplater();
	} 

	بازگشت خود::$instance;

}

این روشی خواهد بود که وقتی کلاس ما با استفاده از “add_action()” به سر وردپرس اضافه می‌شود، فراخوانی می‌شود.

فیلترهای وردپرس

اکنون روش “get_instance” را مرتب کرده‌ایم، باید بررسی کنیم که وقتی واقعاً نمونه‌سازی شود چه اتفاقی می‌افتد.

ما از تابع داخلی add_filter() وردپرس برای اضافه کردن نمونه ای از کلاس خود به نقاط کلیدی در امتداد جدول زمانی راه اندازی اولیه وردپرس استفاده خواهیم کرد. با استفاده از این روش، داده‌های قالب‌های صفحه خود را در اسلات‌های مربوطه قرار می‌دهیم، مانند اینکه به وردپرس می‌گوییم هنگام فراخوانی صفحه از چه فایلی به عنوان الگو استفاده کند، و عنوانی که در منوی کشویی در ویرایشگر صفحه نمایش داده شود.

برای این کار باید از روش ‘__construct’ استفاده کنیم (این روش زمانی اجرا می‌شود که کلاس نمونه‌سازی شود).

/**
 * پلاگین را با تنظیم فیلترها و عملکردهای مدیریتی اولیه می کند.
 */
تابع خصوصی __construct() {

	$this->templates = array();

	// یک فیلتر به متاباکس ویژگی ها اضافه کنید تا قالب را به کش تزریق کنید.
	if ( version_compare( floatval( get_bloginfo( 'نسخه' ) ), '4.7', '<' ) ) {

		// 4.6 و بالاتر
		افزودن_فیلتر(
			'page_attributes_dropdown_pages_args'،
			آرایه ($this، 'register_project_templates')
		)

	}دیگر {

		// یک فیلتر به متاباکس ویژگی های نسخه wp 4.7 اضافه کنید
		افزودن_فیلتر(
			'theme_page_templates'، آرایه ($this، 'add_new_template')
		)

	}

	// یک فیلتر به پست ذخیره اضافه کنید تا قالب را به کش صفحه تزریق کنید
	افزودن_فیلتر(
		'wp_insert_post_data'، 
		آرایه ($this، 'register_project_templates') 
	)

	// یک فیلتر به قالب اضافه کنید تا مشخص شود آیا صفحه ما را دارد یا خیر 
	// قالب اختصاص داده شد و مسیر آن را برگردانید
	افزودن_فیلتر(
		'شامل_شامل'، 
		آرایه ($this، 'view_project_template') 
	)

	// قالب های خود را به این آرایه اضافه کنید.
	$this->templates = array(
		'goodtobebad-template.php' => 'بد بودن خوب است',
	)

}

4 چیز مختلف در اینجا وجود دارد (با نادیده گرفتن ‘$this->templates = array(;’، که فقط متغیر را برای استفاده آماده می کند)؛

  1. خطوط 9 تا 13: این فیلتر «رجیستر_پروژه_الگوها» را به قلاب «page_attributes_dropdown_pages_args» اضافه می‌کند. این کار کش وردپرس را با قالب‌های جدید پر می‌کند و وردپرس را فریب می‌دهد تا این باور را داشته باشد که فایل‌های قالب صفحه واقعاً در فهرست قالب وجود دارند. این الگوهای صفحه را به لیست کشویی در کادر متا ویژگی های صفحه در ویرایشگر صفحه اضافه می کند.
  2. خطوط 16 تا 20: در اینجا ما اساساً مانند بلوک کد قبلی عمل می کنیم، با این تفاوت که این بار الگوی صفحه خود را (در صورت انتخاب) به داده های پست ذخیره شده نیز اضافه می کنیم.< /li>
  3. خطوط 23 تا 28: این فیلتر عبارت “template_include” را به قلاب “view_project_template” اضافه می کند. این یک عملکرد بسیار مهم است. این به وردپرس می گوید که فایل قالب صفحه شما در واقع کجاست. وردپرس از مسیر ارائه شده توسط این برای ارائه صفحه نهایی استفاده می کند.
  4. خط 31 تا 34: اگرچه این ساده است، اما بسیار مهم است. اینجا جایی است که شما الگوهای صفحه‌ای را که می‌خواهید اضافه شوند و مسیر مربوط به فایل را که فایل الگوی صفحه در آن قرار دارد، مشخص می‌کنید (مثلاً ‘something.php’). من یک مثال آورده ام (که در افزونه مثال استفاده خواهد شد). برای مثال کلی زیر را بررسی کنید:
$this->templates = array(
	'FILE_PATH_AND_NAME' => 'TEMPLATE_TITLE'،
	'wesome-template.php' => 'عالی'،
	'templates/organised-template.php' => 'سازماندهی شده'،
);

(خوردن، خوابیدن،) کد، در صورت لزوم تکرار کنید.

register_project_templates()

من قبلاً به این روش اشاره کرده ام. بیایید ببینیم واقعا چه کار می کند.

اساساً، هدف از این روش دستکاری کش وردپرس، درج داده های مربوطه در مورد قالب های صفحه ما در مکان های مناسب است. ابتدا به کد نگاهی بیندازید، و بعداً در مورد آن با شما صحبت خواهم کرد.

عملکرد عمومی register_project_templates( $atts ) {

	// کلید مورد استفاده برای کش تم ها را ایجاد کنید
	$cache_key = 'page_templates-' . md5( get_theme_root() . '/' . get_stylesheet() );

	// لیست کش را بازیابی کنید. 
	// اگر وجود ندارد یا خالی است یک آرایه آماده کنید
	$templates = wp_get_theme()->get_page_templates();
	if ( خالی ( $templates ) ) {
		$templates = array();
	} 

	// کش جدید، بنابراین کش قدیمی را حذف کنید
	wp_cache_delete ($cache_key , 'themes');

	// اکنون قالب خود را با ادغام قالب ها به لیست قالب ها اضافه کنید
	// با آرایه الگوهای موجود از کش.
	$templates = array_merge( $templates, $this->templates );

	// کش اصلاح شده را اضافه کنید تا به وردپرس اجازه دهید آن را برای فهرست برداری انتخاب کند
	// قالب های موجود
	wp_cache_add($cache_key, $templates, 'themes', 1800);

	بازگشت $atts;

}

در آن زمان. خط 4 اولین جایی است که باید نگاه کرد. همانطور که ممکن است حدس بزنید، ما در حال تولید یک “کلید کش” هستیم. این به عنوان یک شناسه منحصر به فرد برای داده های الگوی صفحه ما استفاده می شود. استفاده از تابع md5() به سادگی یک شناسه رشته منحصر به فرد ایجاد می کند تا از هرگونه درگیری جلوگیری شود.

بعد، در خط 8، ما کش الگوی صفحه را جستجو و بازیابی می کنیم (اگر قبلاً وجود داشته باشد): این آرایه ای از مسیرها و عناوین را برمی گرداند. در خطوط 9-11 بررسی می کنیم که آیا خروجی از کوئری کش وجود دارد یا خیر. اگر بله عالیه اگر نه، یک آرایه محلی ایجاد کنید تا داده‌هایی را که در حافظه پنهان ادغام می‌کنیم نگه دارد.

مرحله بعدی بسیار مهم است. در خط 14، حافظه پنهان الگوی صفحه موجود را حذف می کنیم. نگران نباشید، هیچ داده ای از بین نمی رود – در متغیر $templates ذخیره می شود.

در خط 18، حافظه پنهان قالب‌های صفحه موجود را با ورودی‌های جدید خود ادغام می‌کنیم، و در خط 22، کل حافظه پنهان قالب صفحه را مجدداً در سیستم وردپرس وارد می‌کنیم.

ساده!

view_project_template ()

اکنون به روش نهایی خود رسیده ایم. اینجا جایی است که به وردپرس می‌گوییم فایل قالب صفحه واقعی کجاست.

/**
 * بررسی می کند که آیا الگو به صفحه اختصاص داده شده است
 */
عملکرد عمومی view_project_template ( $template ) {
	
	// دریافت پست جهانی
	جهانی $post;

	// اگر پست خالی است، الگو را برگردانید
	if ( ! $post ) {
		بازگشت $template;
	}

	// اگر قالب سفارشی تعریف نشده باشد، الگوی پیش فرض را برگردانید
	if ( !isset($this->templates[get_post_meta( 
		$post->ID، '_wp_page_template'، درست است 
	)]))) {
		بازگشت $template;
	} 

	$file = plugin_dir_path(__FILE__). get_post_meta( 
		$post->ID، '_wp_page_template'، درست است
	)

	// فقط برای ایمن بودن، ابتدا بررسی می کنیم که آیا فایل وجود دارد یا خیر
	if ( file_exists ( $file ) ) {
		بازگرداندن $file;
	}دیگر {
		echo $file;
	}

	// الگوی بازگشت
	بازگشت $template;

}

بسیار خوب، این روش با متغیر جهانی $post (خط 6) بررسی می شود. بررسی می کند که آیا یک الگوی صفحه ( ‘_wp_page_template’ ) برای پست تنظیم شده است (به این معنی که باید یک صفحه باشد). اگر نه، پس مهم نیست – غیر صفحه‌ها نمی‌توانند الگوهای صفحه داشته باشند.

خط 16 محل فایل قالب صفحه را مشخص می کند. همانطور که در بالا توضیح دادم، فایل قالب صفحه مشخص شده را در فهرست اصلی افزونه شما بررسی می کند. (هر چند این را می توان به راحتی تغییر داد؛ به زیر مراجعه کنید.)

// فقط تغییر مسیر الگوی صفحه
// وردپرس اکنون به دنبال قالب های صفحه در زیر پوشه 'templates' می گردد،
// به جای ریشه
$file = plugin_dir_path(__FILE__). 'templates/' .get_post_meta( 
	$post->ID، '_wp_page_template'، درست است 
);

بعد از این، در خطوط 21 تا 24، ما فقط کمی اعتبار داریم که بررسی می کند آیا فایل واقعا وجود دارد یا خیر. اگر بله، عالی است! اگر نه، اوه عزیز… اگر وردپرس نتواند فایل قالب یا حتی یک صفحه خالی را پیدا کند، به احتمال زیاد یک پیغام خطای PHP دریافت خواهید کرد. اگر هر یک از این علائم آشنا به نظر می رسد، فقط با چاپ متغیر $file روی صفحه، مسیر فایل الگو را بررسی کنید.

اگر قصد دارید از این کد به صورت تجاری استفاده کنید (که در انجام آن آزاد هستید – نسخه کد من بدون مجوز ارائه می شود، بنابراین می توانید هر طور که می خواهید با آن کار کنید)، من واقعاً توصیه می کنم به اشتباه کمی وقت بگذارید. دست زدن به حداکثر قابلیت اطمینان.

همین است. با تکمیل کلاس ما، تنها یک کار باقی مانده است – آن را به سر وردپرس اضافه کنید.

add_action( 'plugins_loaded', array( 'PageTemlater', 'get_instance' ) ); پیش>

تبریک می‌گویم اگر تا آخر راه را پشت سر گذاشتید! امیدوارم مطالبی را که گفتم مفید بوده باشید و در آینده از آن بهره مند شوید!

کل کد

در زیر کل کد افزونه برای کپی و جایگذاری آسان است.

templates = array();


		// یک فیلتر به متاباکس ویژگی ها اضافه کنید تا قالب را به کش تزریق کنید.
		if ( version_compare( floatval( get_bloginfo( 'نسخه' ) ), '4.7', '<' ) ) {

			// 4.6 و بالاتر
			افزودن_فیلتر(
				'page_attributes_dropdown_pages_args'،
				آرایه ($this، 'register_project_templates')
			)

		}دیگر {

			// یک فیلتر به متاباکس ویژگی های نسخه wp 4.7 اضافه کنید
			افزودن_فیلتر(
				'theme_page_templates'، آرایه ($this، 'add_new_template')
			)

		}

		// یک فیلتر به پست ذخیره اضافه کنید تا قالب را به کش صفحه تزریق کنید
		افزودن_فیلتر(
			'wp_insert_post_data'، 
			آرایه ($this، 'register_project_templates') 
		)


		// یک فیلتر به قالب شامل اضافه کنید تا مشخص شود آیا صفحه ما را دارد یا خیر 
		// قالب اختصاص داده شد و مسیر آن را برگردانید
		افزودن_فیلتر(
			'شامل_شامل'، 
			آرایه ($this، 'view_project_template') 
		)


		// قالب های خود را به این آرایه اضافه کنید.
		$this->templates = array(
			'goodtobebad-template.php' => 'بد بودن خوب است',
		)
			
	} 

	/**
	 * الگوی ما را به صفحه کشویی نسخه 4.7+ اضافه می کند
	 *
	 */
	تابع عمومی add_new_template( $posts_templates ) {
		$posts_templates = array_merge( $posts_templates, $this->templates );
		$posts_templates را برگردانید.
	}

	/**
	 * قالب ما را به کش صفحات اضافه می کند تا وردپرس را فریب دهد
	 * به این فکر کنید که فایل الگو در جایی وجود دارد که واقعاً وجود ندارد.
	 */
	تابع عمومی register_project_templates($atts) {

		// کلید مورد استفاده برای کش تم ها را ایجاد کنید
		$cache_key = 'page_templates-' . md5( get_theme_root() . '/' . get_stylesheet() );

		// لیست کش را بازیابی کنید. 
		// اگر وجود ندارد یا خالی است یک آرایه آماده کنید
		$templates = wp_get_theme()->get_page_templates();
		if ( خالی ( $templates ) ) {
			$templates = array();
		} 

		// کش جدید، بنابراین کش قدیمی را حذف کنید
		wp_cache_delete ($cache_key , 'themes');

		// اکنون با ادغام قالب ها، قالب خود را به لیست قالب ها اضافه کنید
		// با آرایه الگوهای موجود از کش.
		$templates = array_merge( $templates, $this->templates );

		// کش اصلاح شده را اضافه کنید تا به وردپرس اجازه دهید آن را برای فهرست برداری انتخاب کند
		// قالب های موجود
		wp_cache_add($cache_key, $templates, 'themes', 1800);

		بازگشت $atts;

	} 

	/**
	 * بررسی می کند که آیا الگو به صفحه اختصاص داده شده است
	 */
	عملکرد عمومی view_project_template ( $template ) {
		
		// دریافت پست جهانی
		جهانی $post;

		// در صورت خالی بودن پست، الگو را برگردانید
		if ( ! $post ) {
			بازگشت $template;
		}

		// اگر قالب سفارشی تعریف نشده باشد، الگوی پیش فرض را برگردانید
		if ( ! isset($this->templates[get_post_meta( 
			$post->ID، '_wp_page_template'، درست است 
		)]))) {
			بازگشت $template;
		} 

		$file = plugin_dir_path( __FILE__). get_post_meta( 
			$post->ID، '_wp_page_template'، درست است
		)

		// فقط برای ایمن بودن، ابتدا بررسی می کنیم که آیا فایل وجود دارد یا خیر
		if ( file_exists ( $file ) ) {
			بازگرداندن $file;
		}دیگر {
			echo $file;
		}

		// الگوی بازگشت
		بازگشت $template;

	}

} 
add_action('plugins_loaded', array('PageTemplater', 'get_instance' ) );

افزونه

همچنین می‌توانید کد کامل را به‌عنوان افزونه در Github بارگیری کنید.

نزدیک ویرایشگر پست

در اینجا یک نمای نزدیک از این افزونه در حال اجرا است. الگوی صفحه اضافه شده در قسمت ویژگی های صفحه را ببینید؟

خروج از نسخه موبایل