| کانال وردپرس |
前往频道在 Telegram
⭕️ کانال وردپرس دولوپیکس 💠 دولوپیکس | جامعه توسعهدهندگان ایرانی 💎 @Developix 🚀 Developix.ir 📌 پشتیبانی و تبلیغات: @DevelopixSupport
显示更多3 422
订阅者
无数据24 小时
-47 天
-1430 天
正在加载数据
吸引订阅者
十月 '2610月 '26
十月 '26
+347
在0个频道中
九月 '260
在0个频道中
Get PRO
八月 '260
在0个频道中
Get PRO
七月 '260
在1个频道中
Get PRO
六月 '260
在0个频道中
Get PRO
五月 '260
在0个频道中
Get PRO
四月 '260
在0个频道中
Get PRO
三月 '260
在0个频道中
Get PRO
二月 '260
在0个频道中
Get PRO
一月 '260
在0个频道中
Get PRO
十二月 '250
在0个频道中
Get PRO
十一月 '250
在0个频道中
Get PRO
十月 '250
在0个频道中
Get PRO
九月 '250
在0个频道中
Get PRO
八月 '250
在1个频道中
Get PRO
七月 '250
在0个频道中
Get PRO
六月 '250
在0个频道中
Get PRO
五月 '250
在0个频道中
Get PRO
四月 '250
在0个频道中
Get PRO
三月 '25
+181
在0个频道中
Get PRO
二月 '25
+203
在0个频道中
Get PRO
一月 '25
+281
在0个频道中
Get PRO
十二月 '24
+2 783
在0个频道中
| 日期 | 订阅者增长 | 提及 | 频道 | |
| 28 十月 | 0 | |||
| 27 十月 | 0 | |||
| 26 十月 | 0 | |||
| 25 十月 | +1 | |||
| 24 十月 | +1 | |||
| 23 十月 | 0 | |||
| 22 十月 | 0 | |||
| 21 十月 | +3 | |||
| 20 十月 | +1 | |||
| 19 十月 | +2 | |||
| 18 十月 | 0 | |||
| 17 十月 | 0 | |||
| 16 十月 | 0 | |||
| 15 十月 | 0 | |||
| 14 十月 | 0 | |||
| 13 十月 | 0 | |||
| 12 十月 | 0 |
频道帖子
🧩 یک اتفاق، چند واکنش مستقل
فرض کن در یک افزونه، پس از ثبت سفارش باید ایمیل بفرستی، گزارش بسازی و به یک سرویس خبر بدهی. اگر همه را در تابع ثبت سفارش بنویسی، آن تابع کمکم مسئول کارهایی میشود که ربطی به ذخیره سفارش ندارند.
الگوی Observer برای همین جنس مسئله است: یک بخش وقوع اتفاق را اعلام میکند و بخشهای دیگر به آن واکنش نشان میدهند. بخش اول لازم نیست نام و جزئیات همه دریافتکنندگان را بداند.
در وردپرس، اکشنها ابزاری آماده برای ساختن چنین ارتباطی هستند. این سازوکار به مدل انتشار و اشتراک هم نزدیک است؛ پس آن را نسخه دقیق و کلاسیک الگو ندان، اما ایده جداسازی در هر دو مشترک است.
🛠 یک نمونه کوچک
در مسیر ثبت سفارش، فقط پس از ذخیره موفق این رویداد را منتشر کن:
do_action('shop_order_saved', $order_id);
حالا بخش گزارش را جدا ثبت کن:
add_action('shop_order_saved', 'shop_log_order');
function shop_log_order($order_id) {
error_log('Saved order: ' . (int) $order_id);
}
برای افزودن ایمیل، یک callback دیگر به همین اکشن وصل میکنی؛ نه اینکه تابع ثبت سفارش را دوباره باز کنی و منطق تازه را داخل آن بریزی. این جداسازی، تغییر هر واکنش را سادهتر میکند و به کد اصلی اجازه میدهد روی کار خودش بماند.
⚠️ چند مرز مهم
اکشن وردپرس صف کار نیست. callbackها در همان درخواست اجرا میشوند؛ پس تماس کند با سرویس بیرونی میتواند پاسخ سایت را کند کند. برای کار سنگین، بهتر است شنونده فقط کار را به یک صف معتبر بسپارد.
به ترتیب اجرای شنوندهها هم وابسته نشو. اگر انجام یک کار شرط لازم برای کار بعدی است، آن وابستگی را صریح بنویس؛ زنجیره پنهان بین چند هوک، فهم و آزمون کد را سخت میکند.
نام رویداد و داده ورودی را مثل یک قرارداد ثابت نگه دار. تغییر بیخبر آنها ممکن است بخش دیگری از افزونه را خراب کند.
📚 مستندات رسمی اکشنهای وردپرس
🌱 از یک واکنش فرعی شروع کن؛ جدا کردن همان یک بخش، تمرین خوبی برای کد کموابستهتر است.
🔖 #Wordpress #وردپرس #Observer #WordPress #Design_Patterns #PHP
👤 Developix
💎 Channel: @DevelopixWordpress| 2 | 🔥 افزونه وردپرس: انتخاب خودکار دستهٔ مادر در وردپرس
وقتی برای یک نوشته دستهٔ فرزند را انتخاب میکنی، انتخاب دستی دستهٔ مادر راحت از قلم میافتد؛ مخصوصاً در سایتهایی با دستهبندی چندسطحی.
افزونهٔ Parent Category Toggler با انتخاب دستهٔ فرزند، دستههای بالادستی آن را هم خودکار تیک میزند. یک تغییر کوچک برای کمکردن انتخابهای تکراری هنگام دستهبندی نوشتهها؛ نه ابزاری برای بازطراحی ساختار دستهها.
اگر روال تحریریهتان ثبت نوشته در دستهٔ فرزند و مادر است، این افزونه را بررسی کنید.
⭐️ امتیاز: 96٪ از 15 رای
📥 نصب فعال: 10,000+
🔖 #Wordpress #وردپرس #وردپرس #افزونه_وردپرس #دستهبندی
💎 @DevelopixWordpress | 314 |
| 3 | راهاندازی WordPress + MariaDB با Docker Compose | ایمیج داکر آماده و پرتابل
در این ویدئو ایمیج داکر WordPress + MariaDB را معرفی میکنیم؛ یک استک سبک، قابلتنظیم و مناسب اجرا با Docker Compose برای راهاندازی سریع وردپرس روی محیط توسعه یا سرور. با استفاده از متغیرهای محیطی، میتوانید پورت، نام دیتابیس، کاربر و پسورد را بهراحتی تنظیم کنید. این ساختار از volumeهای پایدار برای نگهداری فایلهای وردپرس و دادههای MariaDB استفاده میکند و برای deploy سریع، بکاپگیری و مدیریت ساده بسیار کاربردی است.
https://github.com/a-sabagh/wordpress-mariadb-docker
https://www.aparat.com/v/vbrf8cw
🔖 #Wordpress #وردپرس
👤 ابوالفضل
💎 Channel: @DevelopixWordpress | 374 |
| 4 | 📰 افزونه محبوب وردپرس Rank Math هدف حمله زنجیره تأمین قرار گرفت
حملهای به زنجیره تأمین، افزونه سئوی وردپرس Rank Math PRO را هدف گرفته است. نسخه v3.0.123 که بین ۱۵ تا ۱۶ اکتبر دانلود شده، تحت تأثیر این حمله قرار دارد. بدافزار، درهای پشتی مخفی ایجاد کرده، دادههای حساس را افشا کرده و دسترسی ماندگار برقرار کرده است. Rank Math نسخه پاکسازیشده 3.0.124 را منتشر کرده است. به مدیران وبسایتهای آسیبدیده توصیه میشود فایلها را از نسخههای پشتیبان سالم بازیابی کنند، اسکنهای امنیتی انجام دهند و همه گذرواژهها، کلیدها و مقادیر سَلت خود را تغییر دهند.
🔖 #news
💎 @DevelopixWordpress | 429 |
| 5 | 🔗 یک دکمه لینک بساز؛ هرجا خواستی استفاده کن
گاهی یک لینک ثابت، مثل صفحه پشتیبانی یا دانلود راهنما، در چند نوشته تکرار میشود. با یک Shortcode کوچک میتوانی ظاهر لینک را یکدست نگه داری و بدون کپیکردن HTML، آن را داخل محتوا قرار بدهی.
🛠 کد را در یک افزونه کوچک نگه دار
در مسیر wp-content/plugins/site-link فایلی به نام site-link.php بساز و این کد را داخلش بگذار؛ بعد افزونه را از پیشخوان فعال کن:
<?php
/**
* Plugin Name: Site Link Shortcode
*/
if (!defined('ABSPATH')) {
exit;
}
add_shortcode('site_link', function ($atts) {
$atts = shortcode_atts([
'url' => '',
'text' => 'مشاهده صفحه',
], $atts, 'site_link');
$url = esc_url($atts['url']);
if ($url === '') {
return '';
}
return sprintf(
'%s',
$url,
esc_html($atts['text'])
);
});
حالا داخل بلوک «کد کوتاه» در ویرایشگر وردپرس، این نمونه را قرار بده:
[site_link url="https://wordpress.org/support/" text="راهنمای وردپرس"]
این آدرس واقعی است؛ برای سایت خودت، مقدار آن را با نشانی صفحه مقصد عوض کن. خروجی فعلاً یک لینک معمولی است. برای ظاهر دکمه، کلاس site-link را در CSS قالب یا بخش CSS اضافی استایل بده.
🔐 نکته مهم فقط ظاهر نیست
تابع shortcode_atts مقدارهای پیشفرض را مشخص میکند، اما جای بررسی امنیتی خروجی را نمیگیرد. برای آدرس از esc_url و برای متن از esc_html استفاده کردهایم تا ورودی به HTML ناخواسته تبدیل نشود.
داخل Shortcode باید نتیجه را return کنی، نه echo؛ وگرنه ممکن است خروجی در جای اشتباه نمایش داده شود. نگهداری کد در افزونه هم باعث میشود با تعویض قالب، قابلیت از دست نرود.
📚 مستندات رسمی Shortcode API
برای شروع، همین لینک را در یک نوشته آزمایشی اجرا کن؛ یک قابلیت کوچک و قابلاستفاده برای سایتت ساختهای. 🌱
🔖 #Wordpress #وردپرس #WordPress #Shortcode #PHP #امنیت #توسعه_افزونه
👤 Developix
💎 Channel: @DevelopixWordpress | 573 |
| 6 | آشنایی با REST API در وردپرس و ساخت Custom Route
در این مطلب به مفاهیم کلیدی REST API در وردپرس، ساختار Route و Endpoint، نحوه ثبت مسیرهای سفارشی با تابع register_rest_route و ارسال درخواست با توابع wp_remote پرداخته شده است.
برای مطالعه کامل این مطلب میتوانید به لینک زیر مراجعه کنید:
https://gnutec.net/wp-reset-api/
🔖 #Wordpress #وردپرس
👤 ابوالفضل
💎 Channel: @DevelopixWordpress | 624 |
| 7 | 🔥 افزونه وردپرس: دستهبندیهای سلسلهمراتبی در منو
اگر دستهبندیهای سایتتان چند سطح دارند، چیدن دستی آنها در منو میتواند وقتگیر باشد. افزونهٔ Automatically Hierarchic Categories in Menu برای نمایش خودکار دستهبندیها با ساختار والد و فرزند در منوی وردپرس ساخته شده است.
برای سایتهایی که مرتب دستهبندی تازه اضافه میکنند، ارزش بررسی دارد؛ پیش از استفاده در سایت اصلی، نتیجه را با قالب و ساختار منوی خودتان آزمایش کنید. سری به صفحهٔ افزونه بزنید.
⭐️ امتیاز: 92٪ از 13 رای
📥 نصب فعال: 2,000+
🔖 #Wordpress #وردپرس #وردپرس #افزونه_وردپرس #دستهبندی
💎 @DevelopixWordpress | 664 |
| 8 | یک راه ساده برای خلوتکردن تابعهای وردپرس: Guard Clause
وقتی تابعی چند شرط تودرتو دارد، مسیر اصلی کار بین آکولادها گم میشود. در روش Guard Clause، حالتهای نامعتبر را همان ابتدای تابع بررسی میکنیم و زود برمیگردیم؛ بعد، منطق اصلی بدون یک لایه تورفتگی اضافه اجرا میشود.
فرض کن یک درخواست AJAX قرار است عنوان یک نوشته را تغییر دهد. قبل از ذخیره، باید شناسه معتبر باشد، کاربر اجازه ویرایش داشته باشد و درخواست هم از نظر nonce تأیید شود. هرکدام از این شرطها که برقرار نباشد، ادامهدادن بیمعناست.
function save_post_title() {
check_ajax_referer( 'edit_title', 'nonce' );
$post_id = absint( $_POST['post_id'] ?? 0 );
if ( ! $post_id ) {
wp_send_json_error( 'Invalid post ID', 400 );
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
wp_send_json_error( 'Forbidden', 403 );
}
$title = sanitize_text_field(
wp_unslash( $_POST['title'] ?? '' )
);
if ( '' === $title ) {
wp_send_json_error( 'Title is required', 400 );
}
$result = wp_update_post( array(
'ID' => $post_id,
'post_title' => $title,
), true );
if ( is_wp_error( $result ) ) {
wp_send_json_error( 'Update failed', 500 );
}
wp_send_json_success( array( 'post_id' => $result ) );
}
🔎 نکته مهم: nonce جای بررسی دسترسی را نمیگیرد. ممکن است درخواست nonce معتبر داشته باشد، اما کاربر مجوز ویرایش همان نوشته را نداشته باشد. به همین دلیل، بررسی current_user_can جداگانه لازم است.
این سبک فقط برای خطاها نیست؛ هر پیششرطی که برقرار نبودنش ادامه تابع را نامعتبر میکند، میتواند یک Guard Clause باشد. البته افراط هم نکن: اگر تابع پر از بازگشتهای پراکنده شد، احتمالاً وقت جداکردن مسئولیتهای آن رسیده است.
✨ دفعه بعد که با شرطهای تودرتو روبهرو شدی، اول مسیرهای خروج زودهنگام را پیدا کن؛ خواندن مسیر اصلی خیلی راحتتر میشود.
🔖 #Wordpress #وردپرس #Guard_Clause #Clean_Code #WordPress #PHP #AJAX
👤 Developix
💎 Channel: @DevelopixWordpress | 637 |
| 9 | 🍋 چرا برای پیامک سایتت هزینه اضافه بدی؟!
با لیمو اس ام اس شروع کار کاملاً رایگانه 👇
✅ ثبتنام رایگان و بدون پرداخت هزینه
🎁 شارژ اولیه رایگان بعد از ثبتنام
💚 پنل پیامکی رایگان
🔥 تعرفه پیامک از فقط ۱۰۶ تومان
🧩 افزونههای وردپرس کاملاً رایگان برای:
• دیجیتس
• پیامک ووکامرس
• پیامک دکان
• پیامک بوکلی
• پیامک گرویتی فرم
یعنی میتونی بدون پرداخت هزینه برای پنل و افزونه، پیامکهای سایتت رو راهاندازی کنی و فقط هزینه پیامک مصرفی رو پرداخت کنی.
🚀 مناسب برنامهنویسها، سایتهای وردپرسی و کسبوکارهای آنلاین
👉 همین الان رایگان ثبتنام کن:
https://panel.limosms.com
📞 اطلاعات بیشتر:
09108303821 | 09001200800
https://limosms.com | 635 |
| 10 | 📌 کش استاتیک درست، روی سرعت وردپرس معجزه میکند؛ مخصوصاً برای فایلهای پوشه uploads مثل عکسها.
ایده این است که برای این فایلها هدر Cache-Control تنظیم شود تا مرورگر کاربر آنها را طولانیمدت نگه دارد و هر بار دوباره از سرور نگیرد. 🚀
اگر روی سرور Apache هست، در روت وردپرس (همان جایی که .htaccess هست) این تکه را اضافه کن:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/webp "access plus 30 days"
ExpiresByType text/css "access plus 7 days"
ExpiresByType application/javascript "access plus 7 days"
</IfModule>
⏱ عدد روزها را میتوان باتوجهبه میزان تغییر فایلها تنظیم کرد؛ برای تصاویر معمولاً ۳۰ روز یا بیشتر مناسب است.
این کار:
• درخواستهای تکراری به سرور را کم میکند ✅
• امتیاز PageSpeed را بهتر میکند ✅
برای جزییات بیشتر مستند رسمی وبسرور آپاچی درباره Expires و Cache-Control عالی است:
apache.org/docs/mod_expires
امتحانش روی یک سایت تست انجام شود و بعد روی سایت اصلی اعمال شود 😎
🔖 #Wordpress #وردپرس #WordPress #Caching #Performance #Apache #_htaccess #Speed
👤 Developix
💎 Channel: @DevelopixWordpress | 693 |
| 11 | 🔥 افزونه وردپرس: ابزارک هوشمند شبکههای اجتماعی Meks
برای نمایش لینک شبکههای اجتماعی در سایدبار، این افزونه یک ابزارک تمیز و سبک میدهد که با بیشتر قالبها خوب هماهنگ میشود.
میتوانی آیکن شبکههای مختلف را انتخاب و مرتب کنی، عنوان و استایل را عوض کنی و تعیین کنی لینکها در تب جدید باز شوند 🔗
برای جمعوجور کردن فوتر یا ستون کناری وبلاگ و مجلههای خبری وردپرس گزینهٔ خیلی مناسبی است. از مخزن وردپرس قابل نصب است:
Meks Smart Social Widget
⭐️ امتیاز: 92٪ از 10 رای
📥 نصب فعال: 10,000+
🔖 #Wordpress #وردپرس #وردپرس #افزونه_وردپرس #شبکههای_اجتماعی
💎 @DevelopixWordpress | 625 |
| 12 | پردازش پسزمینه در وردپرس
در این آموزش با مفهوم پردازش پسزمینه در وردپرس، اجرای وظایف زمانبر بدون متوقف کردن روند اصلی درخواست و بهبود عملکرد و تجربه کاربری آشنا میشوید.
برای مشاهده کامل آموزش، از لینک زیر استفاده کنید:
https://gnutec.net/background-proccessing-in-wp/
🔖 #Wordpress #وردپرس
👤 ابوالفضل
💎 Channel: @DevelopixWordpress | 513 |
| 13 | تو خیلی از پروژههای وردپرسی لازم میشود برای نوشتهها یا برگهها یک فیلد اضافه داشته باشیم؛ مثلا «مدت زمان مطالعه»، «قیمت»، «آدرس لوکیشن» و…
یکی از تمیزترین راهها استفاده از متاباکس (Meta Box) و add_meta_box است. 👇
۱️⃣ ایده اصلی
تو ادیتور نوشته، یک باکس جدید اضافه میکنیم به اسم مثلاً «اطلاعات سئو داخلی» یا «مدت مطالعه». داخلش یک input ساده است و مقدارش در post meta ذخیره میشود و بعد در قالب نمایش میدهیم.
این روش روی مستندات رسمی وردپرس هم هست:
Custom Meta Boxes – Developer Handbook
۲️⃣ کد نمونه: متاباکس مدت زمان مطالعه ⏱️
کد زیر را داخل فایل functions.php قالب فرزند (Child Theme) یا افزونه اختصاصیات بگذار.
<?php
// ثبت متاباکس
add_action( 'add_meta_boxes', 'wp_channel_add_readtime_metabox' );
function wp_channel_add_readtime_metabox() {
add_meta_box(
'wp_channel_readtime',
'مدت زمان مطالعه (دقیقه)',
'wp_channel_readtime_metabox_callback',
'post',
'side',
'default'
);
}
// خروجی HTML متاباکس
function wp_channel_readtime_metabox_callback( $post ) {
$value = get_post_meta( $post->ID, '_wp_channel_readtime', true );
wp_nonce_field( 'wp_channel_readtime_nonce', 'wp_channel_readtime_nonce_field' );
echo '<label for="wp_channel_readtime_field">مثلاً 5</label>';
echo '<input style="width:100%;" type="number" id="wp_channel_readtime_field" name="wp_channel_readtime_field" value="' . esc_attr( $value ) . '" />';
}
// ذخیره مقدار متاباکس
add_action( 'save_post', 'wp_channel_save_readtime_metabox' );
function wp_channel_save_readtime_metabox( $post_id ) {
if ( ! isset( $_POST['wp_channel_readtime_nonce_field'] ) ) {
return;
}
if ( ! wp_verify_nonce( $_POST['wp_channel_readtime_nonce_field'], 'wp_channel_readtime_nonce' ) ) {
return;
}
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( isset( $_POST['wp_channel_readtime_field'] ) ) {
$value = sanitize_text_field( $_POST['wp_channel_readtime_field'] );
update_post_meta( $post_id, '_wp_channel_readtime', $value );
}
}
بعد از ذخیره، کنار ویرایشگر نوشته یک باکس جدید میبینی که میتوانی عدد دقیقه را وارد کنی.
۳️⃣ نمایش در فرانت قالب 🖥️
برای نمایش، داخل single.php یا فایل نمایش نوشته، جایی که عنوان یا محتوا را نشان میدهی، این تکه کد را بگذار:
<?php
$readtime = get_post_meta( get_the_ID(), '_wp_channel_readtime', true );
if ( ! empty( $readtime ) ) {
echo '<p class="readtime">مدت زمان مطالعه: ' . esc_html( $readtime ) . ' دقیقه</p>';
}
?>
۴️⃣ چند نکته ریز ولی مهم ✅
• بهتر است این کار را داخل افزونه اختصاصی انجام بدهی تا با عوض شدن قالب، فیلدها از بین نرود.
• برای فیلدهای حساس، همیشه nonce و sanitize را فراموش نکن.
• اگر گوتنبرگ استفاده میکنی، متاباکسها هنوز در بخش «تنظیمات بیشتر» قابل استفاده هستند و کنار ادیتور نشان داده میشوند.
امتحانش کن روی یکی از نوشتههای تست، یک «مدت زمان مطالعه» بگذار و ببین چقدر صفحهت حرفهایتر میشود. 😎
برایت کدهای تمیزتر و مثالهای بیشتر وردپرسی در راه است، این ترفند را با دوستان وردپرسیات هم به اشتراک بگذار. 🚀
🔖 #Wordpress #وردپرس #WordPress #Meta_Box #Custom_Fields #توسعه_قالب #PHP
👤 Developix
💎 Channel: @DevelopixWordpress | 712 |
| 14 | 🧹 سبککردن دیتابیس وردپرس با محدودکردن Post Revision
خیلی وقتها دیتابیس وردپرس بهخاطر ذخیرهشدن نسخههای زیاد هر نوشته (Post Revision) سنگین میشود و روی سرعت سایت و بکآپگیری فشار میاندازد. خوشبختانه میتوان تعداد این نسخهها را خیلی راحت محدود کرد. ✨
فقط کافی است در فایل wp-config.php (قبل از خط /* That's all, stop editing! */) این کد را اضافه کنی:
define('WP_POST_REVISIONS', 5);
با این کار وردپرس حداکثر ۵ نسخه از هر نوشته را نگه میدارد و بقیه را بهمرور پاک میکند. برای غیرفعالکردن کامل Revisionها میتوان مقدار را false قرار داد، ولی معمولاً بهتر است چند نسخه برای مواقع اضطراری نگه داشته شود ✅
این کار مخصوصاً روی سایتهای قدیمی یا وبلاگهایی با تعداد پست زیاد، حجم دیتابیس را کم میکند و Queryها را سبکتر نگه میدارد.
📚 مرجع رسمی: Revisions در مستندات وردپرس
🏁 یکبار این تنظیم را انجام بده و از این به بعد دیتابیس تمیزتر و بکآپها کوچکتر خواهند بود.
برچسبها: سرعت، دیتابیس، بهینهسازی، وردپرس
🔖 #Wordpress #وردپرس #وردپرس #بهینهسازی #دیتابیس #Post_Revisions #سرعت
👤 Developix
💎 Channel: @DevelopixWordpress | 1 044 |
| 15 | Dependency Injection در پلاگینهای وردپرس 💉
خیلی وقتها توی توسعه پلاگین وردپرس، همهچیز را میبریم داخل یک کلاس بزرگ: queryها، لاگها، ارسال ایمیل، تنظیمات و…
نتیجه؟ کد سختخوان، سختتست و پر از وابستگی پنهان 🤕
یکی از راهحلهای جدی برای این مشکل در معماری نرمافزار، استفاده از Dependency Injection (DI) است.
Dependency Injection یعنی چی؟
بهجای اینکه یک کلاس خودش وابستگیها را بسازد، آنها را از بیرون دریافت میکند.
یعنی بهجای:
class My_Plugin {
private $mailer;
public function __construct() {
$this->mailer = new Wp_Mailer();
}
}
مینویسیم:
class My_Plugin {
private $mailer;
public function __construct( Wp_Mailer $mailer ) {
$this->mailer = $mailer;
}
}
حالا My_Plugin فقط از Wp_Mailer استفاده میکند، ولی مسئول ساختنش نیست. این یعنی coupling کمتر و تستپذیری بیشتر ✅
نمونه ساده در پلاگین وردپرس
فرض کن یک کلاس لاگگیر و یک سرویس سفارش داریم:
class Logger {
public function info( $message ) {
error_log( '[my-plugin] ' . $message );
}
}
class Order_Service {
private $logger;
public function __construct( Logger $logger ) {
$this->logger = $logger;
}
public function create( $data ) {
// logic...
$this->logger->info( 'Order created: ' . $data['id'] );
}
}
class My_Plugin_Bootstrap {
public function run() {
$logger = new Logger();
$order_service = new Order_Service( $logger );
add_action( 'init', function () use ( $order_service ) {
// استفاده از $order_service
} );
}
}
اینجا My_Plugin_Bootstrap نقش یک container خیلی ساده را دارد و وابستگیها را میسازد و تزریق میکند.
چرا برای وردپرس مفید است؟
• راحتتر میشود کلاسها را جداگانه تست کرد 🧪
• برای جایگزین کردن implementation (مثلاً یک Logger جدید) فقط نقطه ساخت را عوض میکنی
• کد کمتر به global و singletonهای سفتوسخت وابسته میشود
نکته عملی
برای پروژههای بزرگتر میتوان از containerهای آماده PHP مثل PHP-DI استفاده کرد، ولی در اکثر پلاگینهای وردپرسی همین container ساده با چند کلاس bootstrap کاملاً جواب میدهد.
قدمبهقدم اگر وابستگیها را تزریق کنی، معماری پلاگین تمیزتر، قابلگسترشتر و حرفهایتر میشود 💪
🔖 #Wordpress #وردپرس #Dependency_Injection #Wordpress #PHP #Clean_Code #Architecture
👤 Developix
💎 Channel: @DevelopixWordpress | 1 135 |
| 16 | با Migration Boost هاستایران، برای مهاجرت به سرور ابری دوباره هزینه ترافیک نده! 🚀
با خرید اولین سرور ابری غیرساعتی از **هاستایران**، بسته ترافیک هدیه مهاجرت بهصورت خودکار برای سرویس شما فعال میشود:
✅ حداقل ۱۰۰ گیگابایت ترافیک هدیه مهاجرت
✅ افزایش حجم هدیه متناسب با ظرفیت دیسک اولیه
✅ ترافیک آپلود رایگان
✅ بدون محدودیت زمانی
سرور ابری هاستایران را راهاندازی کنید و بکاپها، فایلها و پایگاه داده خود را بدون دغدغه هزینههای پنهان ترافیک منتقل کنید.
👇 مشاهده پلنهای سرور ابری هاستایران
hostiran.club/Migration
hostiran.club/Migration | 856 |
| 17 | ⚡️ بهینهسازی سرعت وردپرس با WP Super Cache
سرعت سایت وردپرسی مستقیماً روی سئو و تجربه کاربر تاثیر میگذاره. یکی از سادهترین و در عین حال حرفهایترین کارها، راهاندازی Page Cache با پلاگین معروف WP Super Cache ـه که توسط تیم رسمی WordPress.org توسعه داده میشه.
ایدهٔ اصلی اینه که بهجای اجرای مداوم PHP و کوئریهای سنگین MySQL، نسخهی HTML استاتیک صفحات برای کاربر سرو میشه. این یعنی لود خیلی سریعتر، مخصوصاً روی هاستهای اشتراکی.
۱️⃣ نصب و فعالسازی پلاگین
از بخش Plugins → Add New عبارت WP Super Cache رو جستوجو و نصب کن، بعد Activate.
سپس به Settings → WP Super Cache برو. در تب Easy گزینهٔ Caching On رو انتخاب کن و Save Changes رو بزن. همین یک کار ساده میتونه برای خیلی از سایتها یک تفاوت محسوس ایجاد کنه. 🌱
۲️⃣ فعالسازی حالت Expert برای کاربرهای جدیتر
اگر دسترسی به فایل .htaccess داری و با سرور Apache کار میکنی، از تب Advanced میتونی حالت Expert رو فعال کنی. این کار باعث میشه کش در سطح وبسرور مدیریت بشه و درخواست حتی قبل از رسیدن به PHP پاسخ بگیره.
در تب Advanced تیک گزینهٔ:
Use mod_rewrite to serve cache files
رو بزن و تنظیمات رو ذخیره کن. پلاگین خودش بهصورت خودکار کدهای لازم رو به .htaccess اضافه میکنه. نمونهای از این کد رو این پایین میبینی 👇
# BEGIN WPSuperCache
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{QUERY_STRING} =""
RewriteCond %{HTTP_COOKIE} !^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$
RewriteCond %{REQUEST_URI} !^/wp-admin/.*
RewriteCond %{REQUEST_URI} !^/wp-login.php
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}%{REQUEST_URI}index.html -f
RewriteRule ^(.*)$ /wp-content/cache/supercache/%{HTTP_HOST}%{REQUEST_URI}index.html [L]
</IfModule>
# END WPSuperCache
اگر هاست اجازهٔ ویرایش .htaccess رو نده، پلاگین پیام میده و میتونی این بخش رو دستی در روت وردپرس اضافه کنی. فقط حواست باشه قبل از هر تغییری یک بکاپ کوچک بگیری. 🧯
۳️⃣ تنظیمات مفید برای دنیای واقعی
🔹 در تب Advanced حتماً این گزینهها رو چک کن:
• Compress pages so they’re served more quickly to visitors → فعال کن تا Gzip روی فایلهای کش اعمال بشه.
• Don’t cache pages for known users → فعال باشه تا وقتی لاگین هستی، نسخه کششده رو نبینی و راحتتر دیباگ کنی.
• Clear all cache files when a post or page is published or updated → فعال باشه تا بعد از انتشار مطلب، کش قدیمی پاک بشه.
🔹 در تب Preload میتونی برای سایتهای شلوغ، Preload فعال کنی تا پلاگین بهصورت دورهای همه صفحات رو پیشکش کنه. این برای سایتهای پر ترافیک که تکیه زیادی روی سئو دارن، خیلی کاربردیه.
۴️⃣ تست سرعت بعد از فعالسازی
بعد از تنظیم کش، با ابزارهایی مثل PageSpeed Insights یا GTmetrix سرعت قبل و بعد رو مقایسه کن. معمولاً کاهش First Byte Time و Fully Loaded Time رو خیلی واضح میشه دید.
یک نکتهٔ کوچک: اگر روی سایت افزونههای Membership، WooCommerce یا هر چیزی که محتوای داینامیک per-user ارائه میده داری، حتماً تنظیمات عدم کش صفحات خاص (یا کوئری استرینگها) رو در WP Super Cache بررسی کن تا سبد خرید یا پنل کاربری اشتباه کش نشه.
در نهایت، همین یک تنظیم نسبتا ساده میتونه حس «سنگینی» وردپرس رو تا حد زیاد از بین ببره. امروز روی یک سایت تست کن و نتیجه رو مقایسه کن ⚙️🚀
🔖 #Wordpress #وردپرس #WordPress #Performance #WP_Super_Cache #Cache #Speed #وردپرس #Optimization
👤 Developix
💎 Channel: @DevelopixWordpress | 1 224 |
| 18 | 🏆آفرهای جام جهانی ۲۰۲۶ هاستایران فعال شد!
با کمپین «ترکیب برنده سایتت»، زیرساخت سایتت رو برای روزهای پرترافیک آماده کن:
🔥 ۲۵٪ تخفیف روی پلنهای ۳ ماهه هاست اشتراکی ایران
⚡ ۵۰٪ تخفیف روی پلنهای یکماهه سرویس ابری در دیتاسنترهای تهران، مشهد و اهواز
🧠 مشاوره رایگان زیرساخت توسط کارشناسان هاستایران
فرصت استفاده از تخفیفها و ثبت فرم مشاوره محدود است.
📌 برای کپی کدهای تخفیف و ثبتنام در فرم مشاوره، روی لینک زیر کلیک کنید:
📌صفحه فرم مشاوره
📌تلگرام هاستایران
📌بله هاستایران
#هاست_ایران #سرور_ابری_هاست_ایران #هاست_اشتراکی #دیتاسنتر #مشاوره_زیرساخت #جام_جهانی2026 | 1 052 |
| 19 | ساخت یک Custom Post Type برای «پورتفولیو» از اون چیزهاییه که فوراً وردپرسِ ساده رو تبدیل میکنه به یه سایت حرفهای 😎
فرض کن یه سایت شرکتی یا شخصی داری و میخوای نمونهکارها رو جدا از نوشتهها نشون بدی، با URL تمیز، آرشیو جدا و فیلدهای مخصوص خودش. اینجاست که Custom Post Type بهدرد میخوره.
این کاریه که خود تیم وردپرس هم توی داکیومنت رسمی پیشنهاد میده:
آموزش Register کردن Custom Post Type
تو این مثال، یه CPT به اسم portfolio میسازیم که:
• توی منوی Admin کنار «Posts» دیده میشه 🧭
• URL ش شبیه /portfolio/project-name باشه 🌐
• آرشیو داشته باشه (لیست همه نمونهکارها)
• پشتیبانی از عنوان، ادیتور، عکس شاخص و دستهبندیهای خودش
📌 کجا کد رو بذاریم؟
بهترین حالت برای شروع: داخل فایل functions.php در قالب Child Theme خودت. (یا تمیزترش: ساختن یه پلاگین سادهی اختصاصی، ولی برای شروع همون functions.php اوکیه.)
📦 کد آماده برای ساخت Custom Post Type «Portfolio»
function wp_channel_register_portfolio_cpt() {
$labels = array(
'name' => 'Portfolio',
'singular_name' => 'Project',
'menu_name' => 'Portfolio',
'name_admin_bar' => 'Project',
'add_new' => 'Add New',
'add_new_item' => 'Add New Project',
'edit_item' => 'Edit Project',
'new_item' => 'New Project',
'view_item' => 'View Project',
'search_items' => 'Search Projects',
'not_found' => 'No projects found',
'not_found_in_trash' => 'No projects in Trash'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array( 'slug' => 'portfolio' ),
'menu_position' => 5,
'menu_icon' => 'dashicons-portfolio',
'supports' => array( 'title', 'editor', 'thumbnail' ),
'show_in_rest' => true,
);
register_post_type( 'portfolio', $args );
}
add_action( 'init', 'wp_channel_register_portfolio_cpt' );
نکتهها 🛠
• show_in_rest => true باعث میشه این CPT توی Gutenberg و REST API هم قابل استفاده باشه؛ یعنی بعداً راحت میتونی با Blockهای اختصاصی یا Headless کار کنی.
• اگر بعد از اضافه کردن کد، URL ها 404 دادن، کافیه یه بار بری به:
Settings > Permalinks و بدون تغییر، روی Save بزنی تا rewrite rules ریفرش بشن.
• میتونی برای این CPT یه Template اختصاصی هم بسازی؛ مثلاً فایل archive-portfolio.php برای لیست همه پروژهها، و single-portfolio.php برای صفحهی هر پروژه.
استفادهی واقعی از این روش توی تقریباً هر سایت حرفهای وردپرسی دیده میشه: نمونهکار، دورهها، محصولات سفارشی، Event ها، Property ها و هر چیزی که «نوشتهی معمولی» نیست.
امتحانش کن، یه دوتا Project تستی بساز و توی منوی اصلی سایت لینک آرشیو /portfolio/ رو بذار؛ خیلی زود میبینی ساختار سایتت چقدر تمیزتر و قابلمدیریتتر میشه ✨
اگر مفید بود، برای همکار برنامهنویس یا طراح وردپرسیت هم بفرست تا اون هم از Custom Post Type استفاده کنه 🚀
🔖 #Wordpress #وردپرس #WordPress #Custom_Post_Type #Portfolio #functions_php #CPT #register_post_type
👤 Developix
💎 Channel: @DevelopixWordpress | 969 |
| 20 | Strategy Pattern برای منطق تخفیف در پلاگینهای وردپرس 🎯
وقتی روی پلاگین فروشگاهی یا افزونه سفارشی برای WooCommerce کار میشود، منطق تخفیف معمولاً اولین جایی است که تبدیل به spaghetti code میشود 😅
یک روز فقط «کد تخفیف ساده» داریم، چند هفته بعد:
• تخفیف مناسبتی (جمعه سیاه)
• تخفیف بر اساس نقش کاربر (VIP، همکار، …)
• تخفیف برای دستهبندی خاص محصول
اگر همه اینها داخل یک if / else غولآسا پیادهسازی شود، نگهداریاش عذاب است. اینجا Strategy Pattern بهکمک میآید.
ایده اصلی Strategy Pattern 🔧
منطق متغیر (مثلاً «چطور تخفیف را حساب کنیم») از بقیه کد جدا میشود و هر استراتژی در یک کلاس مستقل قرار میگیرد. کدی که قیمت را حساب میکند فقط با یک «اینترفیس» صحبت میکند، نه با جزئیات انواع تخفیف.
ساختار ساده در PHP (کاملاً قابل استفاده در پلاگین وردپرس)
<?php
interface DiscountStrategy {
public function calculate($price, $user, $cart): float;
}
class NoDiscount implements DiscountStrategy {
public function calculate($price, $user, $cart): float {
return $price;
}
}
class VipUserDiscount implements DiscountStrategy {
public function calculate($price, $user, $cart): float {
if (in_array('vip', (array) $user->roles, true)) {
return $price * 0.8; // 20% تخفیف
}
return $price;
}
}
class BlackFridayDiscount implements DiscountStrategy {
public function calculate($price, $user, $cart): float {
return $price * 0.7; // 30% تخفیف
}
}
class PriceCalculator {
private DiscountStrategy $strategy;
public function __construct(DiscountStrategy $strategy) {
$this->strategy = $strategy;
}
public function finalPrice($price, $user, $cart): float {
return $this->strategy->calculate($price, $user, $cart);
}
}
در وردپرس میتوان این استراتژی را بر اساس تنظیمات پنل ادمین یا فیلد option انتخاب کرد و سپس مثلاً در هوک woocommerce_before_calculate_totals استفاده کرد.
چند نکته کاربردی برای وردپرس 🧩
• هر Strategy را در فایل جدا (یا فولدر src/Discounts) نگهداری شود تا ساختار پروژه تمیز بماند.
• استراتژی پیشفرض (مثل NoDiscount) همیشه تعریف شود تا اگر تنظیمات پلاگین خراب شد، سایت دچار خطای fatal نشود.
• برای جلوگیری از Memory Leak یا لود بیمورد، فقط استراتژیهای لازم require یا autoload شوند.
منبع برای مطالعه بیشتر
Strategy Pattern - refactoring.guru
پیادهسازی Strategy Pattern در منطق تخفیف، هم کد را خواناتر میکند هم افزودن کمپینهای جدید را تبدیل به یک کار تمیز و کمخطر میکند. از پروژه بعدی، منطق متغیر را در Strategy جدا شود و از نتیجهاش لذت برده شود 🚀
🔖 #Wordpress #وردپرس #Strategy_Pattern #Design_Pattern #WordPress #WooCommerce #PHP #Clean_Code
👤 Developix
💎 Channel: @DevelopixWordpress | 1 202 |
