روزهای خط خطی  | مطالب برگزیده در وردپرس – قدم دوم

مطالب برگزیده در وردپرس – قدم دوم

محتوای این مطلب دنباله دار به شرح چگونگی اضافه کردن قابلیت کار با مطالب برگزیده در وردپرس می پردازد. هدف پیاده سازی این ویژگی کارآمد در وردپرس بدون استفاده از افزونه است. در قسمت نخست این مطلب چگونگی اضافه کردن یک بخش جهت انتخاب نوشته های برگزیده در صفحه ی ویرایش وردپرس مورد بررسی قرار گرفت. اکنون در این قسمت بنا داریم قسمتی مشابه در منوی «ویرایش سریع» وردپرس ایجاد کنیم. این قسمت از مطلب به نوبه ی خود دارای چند بخش می باشد که به قرار زیر می باشند:

  1. اضافه کردن یک ستون جدید در قسمت «نوشته ها»
  2. نمایش محتویات این ستون جدید که همان وضعیت نوشته بوده و دو حالت برگزیده و عادی دارد.
  3. ایجاد گزینه ی جدید در منوی «ویرایش سریع»
  4. ذخیره سازی اطلاعات مربوط به گزینه ی جدید اضافه شده
  5. نوشتن کد مربوط به بروزرسانی و نمایش اطلاعات نوشته در منوی ویرایش سریع

برای اضافه کردن یک ستون جدید در قسمت نوشته ها باید از فیلتر manage_posts_columns استفاده کنیم. این فیلتر متغیر حاوی اطلاعات مربوط به ستون های صفحه ی نمایش پست ها را برای تابع مورد نظر ارسال می کند و خروجی تابع را دریافت کرده و به جای متغیر مزبور قرار می دهد.


 PHP | 
 
 copy code |
?

1
<?php
2
//registering a new column
3
add_filter('manage_posts_columns', 'featured_post_column');
4
function featured_post_column($columns)
5
{
6
	$columns['featured_post'] = 'Status';
7
	return $columns;
8
}
9
?>

نام تابع ما در این قسمت featured_post_column است که یک ستون جدید با نام featured_post در آرایه ی columns که از طریق فیلتر دریافت کرده ایجاد می کند و مقدار Satus را در آن قرار می دهد. این مقدار (یعنی status) در واقع عنوان ستون جدید خواهد بود. در نهایت هم تابع آرایه ی column جدید را به فیلتر بر می گرداند.

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

 PHP | 
 
 copy code |
?

01
<?php
02
//displaying column contents
03
function featured_post_column_contents($name)
04
{
05
	global $post;
06
	if ($name == 'featured_post')
07
	{
08
		$meta = get_post_meta($post->ID, 'is_featured', True);
09
		echo $meta ? '<span style="color:#f00;">Featured Post</span>'
10
		: 'Normal Post';
11
	}
12
}
13
add_action('manage_posts_custom_column', 'featured_post_column_contents');
14
?>

تابع ما که featured_post_column_content نام دارد به این طریق عمل می کند که در گام نخست متغیر post را به عنوان متغیر عمومی تعریف می کند تا از این طریق به شیء post وردپرس دسترسی داشته باشد و بتواند اطلاعات مربوط به پست جاری را استخراج کند. در خط بعدی با یک دستور شرطی حساب ستون ‘featured post’ را از سایر ستون ها جدا می کند. داخل حلقه ی if نخست بررسی می شود که آیا پست جاری جزء «پست های برگزیده» هست یا نه و نتیجه در متغیر meta ذخیره می شود. این متغیر در ادامه در یک ساختار شرطی به کار رفته و سبب می شود که برای پست های «برگزیده» عبارت Featured Post به رنگ قرمز و برای پست های «عادی» عبارت Normal Post با رنگ پیش فرض نمایش داده شود. در پایان این مرحله صفحه ی نمایش پست ها به شکل زیر در خواهد آمد.

ستون جدید در صفحه ی نمایش پست ها

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

 PHP | 
 
 copy code |
?

01
<?php
02
//displaying custom box in quick edit menu
03
add_action( 'quick_edit_custom_box', 'featured_post_quick_edit', 10, 2);
04
 
05
function featured_post_quick_edit( $column_name, $post_type ) {
06
    $nonce = wp_create_nonce('featured_post_quick_nonce');
07
 
08
	if ($column_name == 'featured_post')
09
	{
10
		echo '<div style="direction:ltr; text-align:right;">';
11
		echo '<input type="hidden" name="featured_post_quick_nonce"
12
		value="' . $nonce . '" />';
13
		echo '<input type="checkbox" name="is_featured"
14
		id="is_featured" /> featured?';
15
		echo '</div>';
16
	}
17
}
18
?>

شایان ذکر است که این اکشن ID پست جاری را برای تابع ارسال نمی کند و از آنجا که در زمان اجرای این اکشن یک صفحه شامل تعدادی پست در حال نمایش است می توان نتیجه گرفت که شیء post وردپرس حاوی اطلاعات مربوط به آخرین پست در لیست بوده و در نتیجه تعریف متغیر عمومی post در تابع و استفاده از آن برای یافتن ID پست جاری موثر نخواهد بود. در نتیجه در خواندن مقدار meta مورد نظر و متعاقبا نمایش آن دچار مشکل خواهیم شد. این اشکال در ادامه با استفاده از javascript رفع خواهد شد.

کد بالا تقریبا شبیه همتای ارائه شده در قسمت ویرایش است که در قدم اول مطلب شرح داده شده است و تنها تفاوت عمده همین است که مقدار فعلی meta مربوطه خوانده نشده و نمایش نیز داده نشده است. استفاده از nonce با نام منحصر به فرد را هم نباید از یاد برد. این nonce در قسمت بعد برای ذخیره سازی اطلاعات استفاده خواهد شد. بعد از وارد کردن کد بالا منوی ویرایش سریع به صورت تصویر زیر خواهد بود.

اضافه کردن گزینه در منوی ویرایش سریع

در ادامه به نحوه ی ذخیره ی اطلاعات از طریق منوی ویرایش سریع خواهیم پرداخت.

 PHP | 
 
 copy code |
?

01
<?php
02
// Save data from quick edit
03
function save_featured_quick_edit($post_id)
04
{
05
	// verify nonce
06
	if (!wp_verify_nonce($_POST['featured_post_quick_nonce']
07
	, 'featured_post_quick_nonce'))
08
	{
09
		return;
10
	}
11
 
12
	// check permissions
13
	if (!current_user_can('edit_post' , $post_id))
14
	{
15
		return;
16
	}
17
 
18
	$old = get_post_meta($post_id, 'is_featured', true);
19
	$new = $_POST['is_featured'];
20
 
21
	if ($new && $new != $old)
22
	{
23
		update_post_meta($post_id, 'is_featured', $new);
24
	}
25
	elseif ('' == $new && $old)
26
	{
27
		delete_post_meta($post_id, 'is_featured', $old);
28
	}
29
}
30
add_action( 'save_post', 'save_featured_quick_edit' );
31
?>

کد مربوط به این قسمت هم تفاوت خاصی با کد ذخیره سازی صفحه ی ویرایش نوشته ندارد و تنها در دو قسمت دارای تفاوت های کوچک است. نخست در مورد nonce مورد استفاده است که دارای نام متفاوت است و اختلاف دیگر در مورد ذخیره سازی خودکار است. چون در منوی ویرایش سریع بحث ذخیره سازی خوکار مطرح نیست طبیعتا نیازی هم به کنترل آن نیست و کد مربوط به آن از تابع حذف شده است.

و اما در ادامه لازم است تا به اشکالی که پیشتر به آن اشاره کردیم بپردازیم. از آن جا که حین نمایش گزینه های مورد نظرمان در منوی ویرایش سریع به ID پست جاری دسترسی نداریم نمی توانبم مقدار فعلی این گزینه ها را از بانک اطلاعاتی بخوانیم و در منو نمایش دهیم. برای حل این مشکل راه حل های گوناگونی وجود دارد که همه ی آن ها مبتنی بر استفاده از javascript هستند. راه حلی که در پایین ارائه شده است یک راه حل ساده ی javascript با استفاده از کتابخانه ی jQuery است.

 Javascript | 
 
 copy code |
?

01
var id;
02
jQuery(document).ready(function(){
03
	jQuery('a.editinline').click(function(){
04
		post_tag_id = jQuery(this).parents('tr').attr('id').split('-');
05
		id = post_tag_id[1];
06
		featured_wait();
07
	});
08
});
09
 
10
function featured_wait()
11
{
12
	post = jQuery('#post-'+id);
13
	edit = jQuery('#edit-'+id);
14
	if(!edit.length)
15
		setTimeout(featured_wait, 10);
16
	else
17
	{
18
		status = post.find('.featured_post').text();
19
		if (status == 'Featured Post')
20
			edit.find('#is_featured').attr('checked',true);
21
		else
22
			edit.find('#is_featured').attr('checked',false);
23
	}
24
}

همانطور که می بینیم نخست باید یک متغیر عمومی با نام id تعریف کنیم تا پس از کشف ID پست جاری در آن ذخیره شود. نحوه ی کار به این صورت است که به محض کلیک روی لینک «ویرایش سریع» ID سطری از جدول که لینک در آن قرار داشته و به صورت post-1111 است خوانده شده و قسمت عددی که در واقع ID پست جاری است از آن جدا شده و در متغیر عمومی id ذخیره می شود. بعد از این مرحله هم تابع featured_wait فراخوانی می شود.

این تابع در بدو اجرا دو متغیر post و edit را می سازد که حاوی id دو سطر از جدول هستند که اولی همان سطری است که حاوی اطلاعات مربوط به پست است و دومی در واقع ستون جدیدی است که منوی ویرایش سریع را در بر دارد. این تابع صبر می کند تا منوی ویرایش سریع ظاهر شود و سپس مقدار مربوط به ستون Featured Post را می خواند. اگر پست جاری جزء پست های «برگزیده» باشد چک باکس مربوطه به حالت تیک خورده در می آید و در غیر این صورت از حالت تیک خورده در خواهد آمد. به این ترتیب موفق شدیم وضعیت فعلی پست را در منوی ویرایش سریع به درستی نمایش دهیم.

البته برای اجرای کد جاوااسکریپت مزبور لازم است آن را در یک فایل ذخیره کرده و با استفاده از تابع wp_enqueue_script و اکشن admin_print_scripts-edit.php فراخوانی کنیم. کد مربوط به این فراخوانی نیز در ادامه آمده است.

 PHP | 
 
 copy code |
?

01
<?php
02
//Adding javascript code
03
function featured_quick_edit_js()
04
{
05
	wp_enqueue_script( 'featured_quick_edit_js',
06
		get_bloginfo('stylesheet_directory') . '/quick_edit.js',
07
		'jquery', true );
08
}
09
add_action('admin_print_scripts-edit.php', 'featured_quick_edit_js' );
10
?>

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

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

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