توابع پوسته

توابع پوسته به اون توابعی گفته می‌شه که به تهیه‌کننده پوسته امکان استفاده از اون‌ها رو با فراخوانی‌شون می‌ده. مثلاً the_title یه تابع هست که عنوان نوشته رو برمی‌گردونه؛ افزونه نظرسنجی وردپرس توابعی رو برای نمایش نظرسنجی در مکان دلخواه در پوسته فراهم کرده. برای معرفی توابع کافیه اون‌ها رو در فایل افزونه‌تون تعریف کنید و بعد اون توابع در دسترس پوسته‌ها هستند.
یه مثال کاربردی: می‌دونید که برای افزودن فرم جستجو به پوسته، یه فایل با محتویات زیر با نام مثلاً searchform.php ساخته می‌شه و بعد در سایر فایل‌های پوسته، include می‌شه.

فایل searchform.php

[php]
<form method="get" id="searchform" action="<?php echo $_SERVER['PHP_SELF'];

?>">
<div>
<input type="text" value="<?php echo wp_specialchars($s, 1); ?>" name="s" id="s"

/>
<input type="submit" id="searchsubmit" value="جستجو" />
</div>
</form>
[/php]

نحوه چپاندن فرم جستجو در فایل‌های پوسته:

[php]
<?php include (TEMPLATEPATH . "/searchform.php"); ?>
[/php]

حالا، بیاید یه تابع بسازیم تا بتونیم فرم جستجو رو با فراخوانی search یا search_form نمایش بدیم. فایل افزونه رو باز کنید و کدهای زیر رو توش قرار بدید:

[php]
<?php

function search_form() { ?>
<form method="get" id="searchform" action="<?php echo $_SERVER['PHP_SELF'];

?>">
<div>
<input type="text" value="<?php echo wp_specialchars($s, 1); ?>" name="s" id="s"

/>
<input type="submit" id="searchsubmit" value="جستجو" />
</div>
</form>
<?php } ?>

[/php]

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

[php]
<?php search_form(); ?>
[/php]

این از این. حالا، وردپرس امکان گذاشتن کد برای اجرا لابه‌لای نوشته‌ها رو نمی‌ده (هرچند افزونه برای این موجوده). راه حل ارائه شده استفاده از shortcodeهاست. این‌ها ساختاری شبیه این دارند:

[shortcode param1="value" param2="value"]

مثلاً برای گذاشتن یه فرم نظرسنجی در نوشته از shortcodeها استفاده می‌شه. نیز shortcodeهای فراهم شده توسط خود وردپرس: (فوق‌العاده مفید)

[audio]: converts a link to an mp3 fle into an audio player
[digg]: embeds a voting button for your link on Digg
[fickr]: embeds a Flickr video
[googlemaps]: embeds Google Maps
[googlevideo]: embeds a Google Video
[livevideo]: embeds a video from LiveVideo
[odeo]: embeds an Odeo audio fle
[podtech]: embeds audio or video from the PodTech Network
[polldaddy]: embeds a PollDaddy poll(use without the space)
[redlasso]: embeds a video from Redlasso
[rockyou]: embeds a slideshow from RockYou
[slideshare]: embeds a slideshow from Slideshare.net
[sourcecode][/sourcecode]: preserves the formatting of source code
[splashcast]: embeds Splashcast media
[vimeo]: embeds a Vimeo video
[youtube]: embeds a YouTube video
(منبع: کتاب Wordpress 2.7 Cookbook)

نحوه ساخت این shortcodeها بدین صورت هست که باید یه تابع بسازید و به وردپرس بگید می‌خواید این تابع با چه shortcodeی اجرا بشه. برای این‌کار از تابع add_shortcode استفاده می‌کنیم. این تابع دو پارامتر می‌گیره، پارامتر اول نام shortcode و پارامتر دوم نام تابع هست:

[php]
add_shortcode(’search’, ’search_form’);
[/php]

الان تابع search_form ما با [search] فراخوانی می‌شه.
برای گرفتن پارامتر از shortcodeها ابتدا باید تو بخش تعریف آرگومان‌های تابع (بین پرانتزها) یه متغیر رو برای دسترسی به پارامترهای ارسالی مشخص کرد. یعنی:

[php]
function search($atts) {
[/php]

حالا باید دریافت‌شون کنیم:

[php]
extract(shortcode_atts(array(
‘dir’ => ”,
), $atts));
[/php]

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

[php]
echo $dir."Hello!";
[/php]

dead easy!

در قسمت بعد راجع به تعریف ابزارک بحث می‌کنیم.

تا این‌جا ما یک افزونه ساختیم که عملاً هیچ کاری انجام نمی‌ده. باید به وردپرس بگیم که کدهای ما رو در چه زمانی اجرا کنه. این‌کارو به دو صورت می‌شه انجام داد: قلاب‌های افزونه (Plugin Hooks) و توابع پوسته (Template Tags).

قلاب‌های افزونه
وردپرس موقعی که می‌خواد کاری انجام بده ابتدا بررسی می‌کنه که آیا تابعی خودشو به این تابعی که الان می‌خواد اجرا بشه متصل کرده یا نه. در این صورت اون تابع رو اجرا می‌کنه. یک مثال. حتماً تا به حال موقع ساخت پوسته متوجه فراخوانی توابع wp_head و wp_footer در لابه‌لای تگ‌های HTML قالب شدید. دلیل فراخوانی این توابع اینه که اگر افزونه‌ای نیاز داشت اطلاعاتی در هدر یا فوتر بنویسه (مثلاً چسبوندن شیوه‌نامه خودش و یا نمایش اطلاعات) خودش رو بچسبونه به این توابع تا در زمانی که وردپرس مشغول رندر صفحه برای نمایش به کاربر هست اون توابع رو اجرا کنه.
تقریبا برای هر عملیاتی که وردپرس که انجام می‌ده قلاب‌های مناسب وجود داره. مثلاً وقتی که یه کاربر در سایت ثبت نام می‌کنه، وقتی یک مطلب جدید نوشته یا حذف می‌شه، وقتی دیدگاهی ارسال می‌شه، و… این قلاب‌ها این انعطاف‌پذیری رو به نویسنده‌ی افزونه می‌دن تا بتونه کدهای خودش رو در زمان مناسب اجرا کنه و تغییرات دلخواه رو در هسته وردپرس بدون دستکاری مستقیم فایل‌ها انجام بده.
لیستی از قلاب‌ها رو در این‌جا ببینید: http://codex.wordpress.org/Plugin_API

حالا، ما دو نوع قلاب داریم: Action و Filter. با استفاده از فیلترها وردپرس از توابع ما انتظار داره بعد از اجرای کدهاشون مقداری رو برگردونند (دستور return) ولی در اکشن‌ها نیازی به برگرداندن مقدار نیست. مثلا، می‌دونید که تابع the_content که درون حلقه وردپرس استفاده می‌شه محتوای نوشته‌ها رو برمی‌گردونه. ما می‌تونیم یه تابع بنویسیم و متصلش کنیم به این تابع the_content، کدهای مورد نظر رو روی محتوا اجرا کنیم (مثلاً ویرایش، تبدیل کاراکترها، اضافه کردن متنی به نوشته و…) و بعد باید خود محتوا رو دوباره به وردپرس برگردونیم.

تئوری کافیه! فایل افزونه‌ای که در آموزش قبلی ایجاد کردید رو باز کنید و کدهای زیر رو توش کپی کنید:

[php]
&lt;?php

add_filter(’the_content’, ‘bigbang’);

function bigbang($content) {

}
?&gt;
[/php]

اتصال تابع مورد نظر به یکی از توابع وردپرس با دستور add_filter انجام می‌شه. پارامتر اول تابعی هست که می‌خوایم بهش متصل شیم و پارامتر دوم تابع ما هست که عملیات پردازش رو انجام می‌ده. خیلی ساده، یه تابع با نام بیگ‌بنگ! معرفی کردیم تا زمان اجرای تابع the_content (که مسئول فرستادن محتوای نوشته به مرورگر هست) اجرا بشه.
الان با مرورگر خود به مسیر وردپرس‌تون برید. چی می‌بینید؟ بوم! محتوای پست‌ها نمایش داده نمی‌شه! این به این دلیل هست که همان‌طور که گفتیم فیلترها از توابع ما انتظار دارند مقداری رو برگردونیم. در واقع، با معرفی متغیر $content به عنوان پارامتر تابع سفارشی ما، می‌تونیم به محتوای ارسال شده از طرف وردپرس به تابع‌مون دسترسی داشته باشیم، روش عملیات انجام بدیم و در نهایت مقدار پردازش شده رو برگردونیم. با برنگردوندن مقدار وردپرس هیچی رو نمایش نمی‌ده.
وسط براکت‌های تابع دستور return $content; رو اضافه کنید. دوباره سایت رو ببینید: محتوا بدون تغییر نمایش داده می‌شه.
ایده رو گرفتید؟ کافیه متغیر $content رو ویرایش کنید و دوباره برش گردونید.
علاوه بر تابع add_filter، تابع add_action رو هم داریم که می‌تونیم به یه اکشن متصل بشیم. مثلا، گفتیم که تابع wp_head رو در بخش head فایل header.php فراخوانی می‌کنیم. می‌تونیم با add_action به اون تابع متصل بشیم و اطلاعات مورد نیازمون رو در بخش هدر سند تولید شده توسط وردپرس بنویسیم:

[php]
function dolly_css() {
echo &quot;
&lt;style type=’text/css’&gt;
#dolly {
position: absolute;
top: 4.5em;
margin: 0;
padding: 0;
}
&lt;/style&gt;&quot;;

}

add_action(’wp_head’, ‘dolly_css’);
[/php]

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

این‌ها رو داشته باشید تا در قسمت بعدی چندین افزونه مفید بنویسیم!

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

بخش اول: مقدمات

افزونه چیست؟
Codex وردپرس، افزونه را این‌گونه تعریف می‌کند:
افزونه وردپرس برنامه یا مجموعه‌ای از یک یا چندین تابع است که با زبان PHP نوشته شده باشند و به امکانات و یا سرویس‌هایی را به وردپرس می‌افزایند. این‌کار به کمک واسط برنامه‌نویسی افزونه وردپرس (Plugin Application Program Interface) صورت می‌گیرد. +

مشخصا، برای دنبال کردن مطالب شما باید آشنایی اولیه با PHP و نیز خود سیستم وردپرس داشته باشید (کتابچه راهنمای کامل وردپرس فارسی را ببینید).

ابتدا باید یک ایده‌ی کلی از آن‌چه افزونه شما می‌خواهد انجام دهد داشته باشید و سپس باید یک نام (که ترجیحاً منحصر به‌فرد باشد) برای آن انتخاب کنید. برای اطمینان از یکتایی نام، مخازن (Repository) افزونه‌ها را بررسی کنید و یا از گوگل کمک بگیرید.
به شاخه wp-content/plugins بروید و یک فایل php با نام دلخواه ایجاد کنید. کدهای افزونه می‌توانند در یک یا چندین فایل قرار بگیرند و خود افزونه نیز ممکن است تعدادی فایل‌های جانبی (تصاویر، کدهای جاوااسکریپت، شیوه‌نامه‌ها، فایل‌های زبان و…) داشته باشد. در چنین شرایطی برای ممانعت از شلوغ‌بازی در /plugins یک دایرکتوری مجزا برای افزونه درست کرده و فایل‌های افزونه را در آن‌جا قرار می‌دهیم.
می‌دانید که برای شناسایی پوسته‌ها توسط وردپرس باید اطلاعاتی را به ابتدای فایل style.css خود اضافه کنیم تا وردپرس آن را به عنوان یک پوسته شناسایی کند. برای افزونه‌ها نیز این مطلب صدق می‌کند. فایل php اصلی افزونه خود را باز کرده و اطلاعات زیر را در آن قرار دهید:

[php]
<?php
/*
Plugin Name: Name Of The Plugin
Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates
Description: A brief description of the Plugin.
Version: The Plugin’s Version Number, e.g.: 1.0
Author: Name Of The Plugin Author
Author URI: http://URI_Of_The_Plugin_Author
*/
?>
[/php]

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

پی‌نوشت. لحن نوشته رسمی بود. فکر نکنم اصلاً از این جور نوشتن خوشم بیاد! در آموزش‌های بعدی لحن رو عوض می‌کنم. |)

۸ راه برای این‌که وردپرس را برای مشتریانتان خوشایندتر کنید. اگر شما از وردپرس به عنوان یک CMS (سیستم مدیریت محتوا) برای ساخت وبگاه مشتریانتان استفاده کرده باشید، احتمالاً با این مشکل مواجه شده‌اید: استفاده از وردپرس برای افراد عادی مشکل است. بله، محیط آن کاربر پسند است، ولی گویا نه به اندازه کافی برای کسانی که برای باز کردن پیوندها دوبار کلیک می‌کنند یا برای ورود به وب‌سایت‌ها آدرس آن‌ها را در گوگل وارد می‌کنند. برای آن‌که نگه‌داری وبگاه توسط خود مشتریان را برایشان راحت‌تر کنید، از پیشنهادات زیر کمک بگیرید:

  1. نصب یک نسخه توسعه یافته از ویرایشگر پیشرفته
    برای جلوگیری از پرسش‌های مانند «فلان دکمه کجاست؟» این افزونه را نصب کنید. این افزونه یک صفحه تنظیمات نیز برای مدیریت دکمه‌های قابل نمایش در اختیارتان می‌گذارد.
  2. افزودن ویرایشگر بصری برای ابزارک‌ها
    می‌دانید چه اتفاقی می‌افتد وقتی مشتری شما برای اولین بار سعی می‌کند تصویری را به سایدبار اضافه کند؟ با شما تماس می‌گیرد، غالبا آن‌هم زمانی که مشغول کاری بس مهم‌تر هستید. wordpress plugin to add rich-text widgets به محیط ویرایش متن ابزارک‌ها، ویرایشگر بصری اضافه می‌کند.
  3. مدیریت صفحات را آسان‌تر سازید
    مدیریت صفحات در وردپرس برای کاربران عادی مشکل است. این افزونه واسط آسانی با قابلیت بکش و ولش (drag n drop) برای کاربران فراهم می‌کند.
  4. به آن‌ها امکان مدیریت ناوبری (navigation) بدهید
    برای وب‌سایت‌های کوچک‌تر چندان ضروری به نظر نمی‌رسد ولی اگر منوی راهبری و ناوبری شما ترکیبی از صفحات و شاخه‌ها باشد، این افزونه امکان مدیریت آن‌ها را در یک واسط کاربری آسان فراهم می‌کند.
  5. اختیارات آن‌ها را محدود کنید.
    احتمالا، مشتریان شما از تعدادی از قابلیت‌های وردپرس هرگز استفاده نمی‌کنند، پس چرا به آن دسترسی داشته باشند؟ Adminize می‌تواند سطح دسترسی به بخش‌های مختلف محیط مدیریت را محدود کند. این به نوبه خود امکان خراب کردن و بهم ریختن محیط مدیریت را کاهش می‌دهد.
  6. واسط کاربری محیط مدیریت را ساده کنید.
    افزونه Admin Trim Interface می‌تواند واسط کاربری محیط مدیریت وردپرس را خلوت‌تر و در نتیجه امکان یافتن آن‌چه کاربران به دنبالش هستند را برای آن‌ها ساده نماید.
  7. به آن‌ها امکان مدیریت فرم‌های تماس را بدهید.
    یکی از افزونه‌های زیر را امتحان کنید:

    • cforms II مدیریت آسانی دارد ولی اگر به این نکته اهمیت می‌دهید، امکان ارتقا خودکار ندارد.
    • Contact Form 7
  8. به آن‌ها امکان دسترسی به آمار را از درون محیط مدیریت بدهید
    به این دلیل ساده: اکثر مشتریان به مدیریت چندین حساب کاربری برای سرویس‌های مختلف آشنایی ندارند. افزونه‌های پیشنهادی:

    • Google Analyticator که سرویس Google Analytics را به محیط مدیریت می‌آورد.
    • Feed stats آمار Feebburner را با محیط وردپرس مجتمع می‌کند.

منبع

بعد از فعال کردن افزونه، (اگر درحال حاضر پوسته از pageNavi پشتیبانی نمی‌کنه) باید فایل‌های پوسته رو ویرایش کرد و در محلی که می‌خوایم لینک‌های ناوبری رو نمایش بدیم افزونه رو با تابع wp_pagenavi() فراخوانی کنیم.

برای فراخوانی افزونه از روش ایمن فراخوانی توابع افزونه‌ها استفاده میکنیم، یعنی به وردپرس می‌گوییم اگر این افزونه فعال بود از آن استفاده کن و در غیراین صورت از همان شیوه قدیمی نوشته قبلی نوشته بعدی استفاده کن:

[php]
<?php if(function_exists(’wp_pagenavi’)) { // if PageNavi is activated ?>
<?php wp_pagenavi(); // Use PageNavi ?>
<?php } else { // Otherwise, use traditional Navigation ?>
<div class="navigation">
<div class="nav-previous"><?php next_posts_link(’&laquo; مطالب پیشین’) ?></div>
<div class="nav-next"><?php previous_posts_link(’مطالب جدیدتر &raquo;’) ?></div>
</div>
<?php } // End if-else statement ?>
[/php]

در این صورت اگر قالب را منتشر کردیم یا به هر دلیلی افزونه در دسترس نبود، خطا دریافت نمی‌کنیم.

تغییر ظاهر
برای تغییر ظاهر منوهای پیمایشگر تولید شده، باید فایل pagenavi-css.css را که در داخل پوشه افزونه قرار دارد ویرایش کنیم. مشکلی که با دستکاری مستقیم فایل‌ها وجود داره اینه که در صورت ارتقای افزونه به نسخه جدید، این تغییرات از بین می‌ره و باید از ابتدا تغییرات را اعمال کنیم.
راه بهتر اینه که در شیوه‌نامه پوسته‌مان، دستورات فایل pagenavi-css.css رو بازنویسی کنیم.
مثلاً

[css]
.wp-pagenavi a, .wp-pagenavi a:link, .wp-pagenavi a:active {
color: red !IMPORTANT;
}
[/css]

اون IMPORTANT! رو برای این گذاشتیم چون pagenavi-css.css در کد HTML تولید شده وردپرس، بعد از فایل شیوه‌نامه پوسته‌مان می‌آید. (برای آشنایی بیشتر با !IMPORATNT نوشته علیها با عنوان «یک آموزش کوتاه و مهم در سی اس اس: important چیست؟» رو بخونید.)

این هم مجموعه انتخابگر (Selector)های شیوه‌نامه PageNavi، آماده برای بازنویسی کردن:

[css]
.wp-pagenavi a, .wp-pagenavi a:link, .wp-pagenavi a:active {
}
.wp-pagenavi a:hover {
}
.wp-pagenavi span.pages {
}
.wp-pagenavi span.current {
}
.wp-pagenavi span.extend {
}
[/css]

همین!

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

Google Sitemap Generator: این افزونه تنها با یه کلیک نقشه سایت می‌سازه، به‌روز رسانی خودکار نقشه سایت و اطلاع رسانی خودکار به موتورهای گوگل، یاهو، بینگ و Ask از مهم‌ترین مزیت‌هاش هست. دانلود نسخه ۳٫۱٫۴ پارسی، صفحه مرتبط با افزونه در دایرکتوری وردپرس

WP-PageNavi: این افزونه به شما اجازه می‌ده به‌جای منوهای کلاسیک «نوشته‌های قبلی» «نوشته‌های بعدی» نوشته‌های وبگاه‌تون رو صفحه‌بندی شده نشون بدید. خوبیش اینه که آدرس‌های تولید شده توسط این، کاملاً SE friendly هستند. در نوشتار بعدی راجع به چگونگی تغییر ظاهر منوهای تولید شده توسط این افزونه بدون دستکاری مستقیم فایل‌ها خواهم نوشت. دانلود افزونه  Wp-pagenavi نسخه ۲٫۵۰، صفحه مرتبط در دایرکتوری وردپرس

WP-ContactForm: از اسمش معلومه! از آسان‌ترین افزونه‌ها برای ساخت فرم تماس. می‌شه هم در پست‌ها قرارش داد و هم در نوشته‌ها. دانلود نسخه ۱٫۵٫۱ فارسی، صفحه مرتبط با افزونه