🚫 دیگه از شر پیام «تأیید ایمیل مدیر سایت» توی وردپرس خلاص شو!
🖌 اگر هر بار وارد پیشخوان میشی و با پیام تأیید ایمیل مدیر روبهرو میشی، فقط کد زیر رو داخل فایل functions.php قالب یا افزونه اختصاصیت قرار بده:
add_filter( 'admin_email_check_interval', '__return_false' );
یا
add_filter( 'admin_email_check_interval', function() {
return 0;
} );
✅ از این به بعد وردپرس دیگه هیچوقت ازت نمیخواد ایمیل مدیر رو تأیید کنی.
💙 اگر این آموزش برات مفید بود:
❤️ پست رو لایک کن.
📌 ذخیرهش کن که بعداً دنبالش نگردی.
📤 برای دوست برنامهنویس یا وردپرسیات بفرست.
➕ و حتماً قلب وردپرس رو دنبال کن؛ هر روز ترفندها، آموزشهای حرفهای، افزونهنویسی و کدهای کاربردی منتشر میکنیم که ساعتها از وقتت رو ذخیره میکنن.
#وردپرس #WordPress #PHP #افزونه_نویسی #برنامه_نویسی #توسعه_وردپرس #قلب_وردپرس
@wpheart
🚨 این ثابت (Constant) وردپرس میتونه مصرف رم سایتت رو نصف کنه!
فکر میکنی هر بار که وردپرس اجرا میشه، تمام فایلهای افزونهها و قالب فقط یک بار Load میشن؟
❌ اشتباهه...
وردپرس برای پیدا کردن مسیر فایلها، بارها از توابعی مثل:
plugin_dir_path()
plugin_dir_url()
get_template_directory()
get_stylesheet_directory()
استفاده میکنه.
اما یه راه حرفهایتر وجود داره...
━━━━━━━━━━━━━━
⚡ راهکار
به جای اینکه داخل حلقه یا توابع پرتکرار، هر بار این توابع رو صدا بزنی، یک بار مسیر رو داخل Constant ذخیره کن.
مثال:
define( 'WPHEART_PATH', plugin_dir_path( __FILE__ ) );
define( 'WPHEART_URL', plugin_dir_url( __FILE__ ) );
بعد همه جا فقط از:
WPHEART_PATH
WPHEART_URL
استفاده کن.
━━━━━━━━━━━━━━
🔥 چرا بهتره؟
✅ فراخوانی کمتر توابع
✅ خوانایی بیشتر کد
✅ نگهداری آسانتر پروژه
✅ بهینهتر برای افزونههای بزرگ
━━━━━━━━━━━━━━
⚠️ نکته
این تغییر به تنهایی قرار نیست سایتت رو از ۵ ثانیه به ۱ ثانیه برسونه؛ اما در افزونهها و پروژههای بزرگ، وقتی کنار دهها بهینهسازی دیگه استفاده بشه، باعث کد تمیزتر و کاهش سربار غیرضروری میشه.
همین تفاوتهای کوچیکه که کد یه برنامهنویس حرفهای رو از بقیه جدا میکنه. 😉❤️
@wpheart
❗️از اون پست هایی که منبعش ماییم 😜
🚨 افزونهای که هیچکس نمیتونه از پنل وردپرس غیرفعالش کنه!
🖌 فکر میکنی همه افزونههای وردپرس از مسیر:
wp-content/plugins
اجرا میشن؟
❌ نه! اشتباه فکر کردی.
وردپرس یک نوع افزونه ویژه داره به اسم:
Must-Use Plugin (MU Plugin)
که در مسیر:
wp-content/mu-plugins
قرار میگیره.
━━━━━━━━━━━━━━
🤔 چرا اسمش Must-Use هست؟
چون...
✅ به محض قرار گرفتن داخل پوشه mu-plugins، بهصورت خودکار فعال میشه.
و مهمتر اینکه...
❌ دکمه Deactivate نداره!
یعنی مدیر سایت از پنل وردپرس نمیتونه غیرفعالش کنه.
━━━━━━━━━━━━━━
🔥 MU Plugin چه کاربردی داره؟
✔️ کدهای امنیتی
✔️ محدود کردن کاربران
✔️ اتصال به سرویسهای سازمانی
✔️ لاگگیری
✔️ تغییرات سراسری روی همه سایتها
✔️ کدهایی که نباید هیچوقت غیرفعال بشن
━━━━━━━━━━━━━━
🚀 چرا شرکتهای بزرگ از MU Plugin استفاده میکنن؟
اگر یک کاربر تمام افزونههای سایت رو غیرفعال کنه
باز هم MU Plugin اجرا میشه!
به همین دلیل، برای قابلیتهای حیاتی انتخاب بسیار مناسبیه.
━━━━━━━━━━━━━━
⚠️ اما یه نکته مهم :
برخلاف افزونههای معمولی:
❌ فایل اصلی MU Plugin باید مستقیماً داخل پوشه mu-plugins قرار بگیره.
اگر افزونه چند فایل داره، معمولاً یک فایل Loader داخل mu-plugins قرار میدن که فایلهای اصلی رو از پوشه دیگری require میکنه.
━━━━━━━━━━━━━━
💎 قانون Seniorها
همه چیز رو افزونه معمولی ننویس...
بعضی قابلیتها باید همیشه فعال باشن، حتی اگر همه افزونههای سایت غیرفعال بشن.
━━━━━━━━━━━━━━
🔰 اینجا یه قدم از خیلی از برنامهنویسهای وردپرس جلوتری. 😉
@wpheart
🚨 این Hook مخفی قبل از ذخیره شدن هر Option اجرا میشه!
فکر میکنی فقط بعد از ذخیره تنظیمات میشه کاری انجام داد؟
❌ نه...
وردپرس قبل از اینکه هر Option داخل دیتابیس ذخیره بشه، یک Hook فوقالعاده قدرتمند اجرا میکنه.
pre_update_option_{$option}
🤔 این Hook چه کاری انجام میده؟
قبل از ذخیره شدن مقدار جدید، میتونی:
✅ مقدار رو تغییر بدی
✅ اعتبارسنجی کنی
✅ جلوی ذخیره شدنش رو بگیری
✅ دادهها رو رمزنگاری کنی
✅ مقدار قبلی و جدید رو با هم مقایسه کنی
🔥 مثال واقعی :
فرض کن نمیخوای عنوان سایت تغییر کنه.
add_filter('pre_update_option_site_name',
function( $new, $old ) {
return $old;
},
10,
2
);
نتیجه؟
هرچقدر هم کاربر ایمیل جدید وارد کنه...
هیچوقت داخل دیتابیس ذخیره نمیشه!
🚀 کاربردهای حرفهای :
✔️ جلوگیری از تغییر تنظیمات حساس
✔️ ثبت Log قبل از تغییر
✔️ اعتبارسنجی تنظیمات
✔️ جلوگیری از ورود داده اشتباه
✔️ همگامسازی با APIهای خارجی
✔️ رمزنگاری اطلاعات قبل از ذخیره
⚠️ چیزی که کمتر کسی میدونه...
اکثر برنامهنویسها بعد از ذخیره شدن اطلاعات سراغ update_option() میرن...
در حالی که حرفهایها قبل از ذخیره شدن داده رو کنترل میکنن.
💎 قانون Seniorها
همیشه بهترین زمان برای کنترل داده...
قبل از ورود به دیتابیسه، نه بعد از اون.
😏 شرط میبندم کمتر از ۵٪ برنامهنویسهای وردپرس از این Hook استفاده کردن.
@wpheart
🚨 هنوز جدول افزونهات رو با CREATE TABLE میسازی؟
اگر افزونهنویسی میکنی، این اشتباه میتونه موقع آپدیت افزونه، کاربرات رو به دردسر بندازه!
🤔 بیاید واقعی ببینیم
فرض کن نسخه 1.0 افزونهات رو منتشر کردی و این جدول رو ساختی:
global $wpdb;
$table = $wpdb->prefix . 'customers';
$sql = "CREATE TABLE $table (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);";
همه چیز عالیه
😐 اما مدتی بعد...
تصمیم میگیری شماره موبایل مشتری رو هم ذخیره کنی.
یعنی جدول باید این شکلی بشه:
phone VARCHAR(20) NOT NULL
حالا اگر دوباره همون CREATE TABLE رو اجرا کنی چی میشه؟
❌ جدول از قبل وجود داره.
❌ ستون جدید اضافه نمیشه.
❌ افزونه روی سایت هزاران کاربر ناقص کار میکنه.
✅ راهکار حرفهای وردپرس
به جای اجرای مستقیم SQL از:
dbDelta();
استفاده کن.
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta( $sql );
🔥 dbDelta() چه کار میکنه؟
اگر جدول وجود نداشته باشه:
✅ میسازه.
اگر ستون جدید اضافه کرده باشی:
✅ فقط همون ستون رو اضافه میکنه.
اگر Index جدید تعریف کرده باشی:
✅ اون رو هم اعمال میکنه.
بدون اینکه اطلاعات قبلی کاربران حذف بشه.
📌 مثال واقعی
نسخه 1.0
id
name
email
نسخه 1.1
id
name
email
phone
کافیه مقدار $sql رو تغییر بدی و دوباره:
dbDelta( $sql );
رو اجرا کنی.
وردپرس خودش تشخیص میده فقط ستون phone کم شده و همون رو اضافه میکنه.
⚠️ نکته مهم
dbDelta() فقط زمانی درست کار میکنه که SQL رو مطابق استاندارد وردپرس بنویسی.
مثلاً:
✔️ حتماً PRIMARY KEY با دو فاصله قبل از پرانتز نوشته بشه:
PRIMARY KEY (id)
و بهتره از:
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
قبل از فراخوانی dbDelta() استفاده کنی، چون این تابع بهصورت پیشفرض در همه درخواستها بارگذاری نشده است.
💎 قانون Seniorها
برنامهنویس حرفهای فقط به نصب افزونه فکر نمیکنه...
به این فکر میکنه که نسخه ۱.۵ افزونه روی سایت ۵۰ هزار کاربر، بدون از دست رفتن حتی یک رکورد، بهروزرسانی بشه.
😏 اگر تا امروز فقط از CREATE TABLE استفاده میکردی الان میدونی چرا تیم توسعه وردپرس dbDelta() رو ساخته. 😉
@wpheart
#اطلاع_رسانی ❗️فوری
سلام و عرض ادب، به یک نفر نیازمندیم برای طراحی یک صفحه معرفی افزونه و امکانات آن با المنتور
✅ سلیقه خوب
✅ رعایت کلیه نکات طراحی
✅ تسلط کافی به المنتور
جهت کسب اطلاعات بیشتر لطفا به آیدی @mim_da پیام بدید.
🚨میدونی که Nonce وردپرس «رمز یکبارمصرف» نیست!
خیلیها فکر میکنن وقتی اینو مینویسن:
wp_nonce_field( 'delete_product', 'my_nonce' );
دیگه عملیاتش کاملاً امن شده.
❌اما کاملا اشتباه!
Nonce در وردپرس احراز هویت نیست و بهتنهایی مجوز انجام عملیات نمیده.
پس Nonce دقیقاً چیکار میکنه؟
Nonce عمدتاً برای مقابله با CSRF استفاده میشه.
یعنی کمک میکنه بفهمیم:
این درخواست احتمالاً از همان سایت و جریان مورد انتظار ارسال شده؟
اما این به معنی این نیست که:
این کاربر اجازه انجام این عملیات را دارد.
❌ در مثال زیر یک کد ناقص رو میبینیم :
if ( wp_verify_nonce(
$_POST['my_nonce'],
'delete_product'
) ) {
wp_delete_post( $product_id );
}
اینجا فقط Nonce بررسی شده.
اما Capability کاربر بررسی نشده!
✅ روش حرفهای که در مثال زیر یک تکه کد کامل و اصولی رو میبینیم :
if ( ! current_user_can( 'delete_post', $product_id ) ) {
wp_die( 'Access denied' );
}
if ( ! wp_verify_nonce(
$_POST['my_nonce'] ?? '',
'delete_product'
) ) {
wp_die( 'Invalid request' );
}
wp_delete_post( $product_id );
اینجا دو موضوع جدا بررسی میشن:
Nonce → آیا درخواست معتبر/مورد انتظار است؟
Capability → آیا این کاربر اجازه انجام این کار را دارد؟
🤯 و یک نکته خفنتر که باید بدونید !
اسمش Nonce هست، اما در وردپرس الزاماً یکبارمصرف نیست!
Nonceهای وردپرس معمولاً در یک بازه زمانی قابل استفاده مجدد هستند و عمر پیشفرضشان حدود ۱۲ تا ۲۴ ساعت است؛ بنابراین نباید آن را با OTP یا Token یکبارمصرف اشتباه گرفت.
💎 قانون حرفهای وردپرس که توسعه دهنده ها باید بدونن :
Nonce = محافظت در برابر CSRF
Capability = کنترل دسترسی
Authentication = شناسایی کاربر
این سه تا را با هم قاطی نکن. 🔥
بیشتر بدون 👇👇👇
@wpheart
🚀🔥 دلیورس بالاخره منتشر شد!
اگه یه فروشگاه ووکامرسی داری و هنوز برای محاسبه هزینه ارسال، مدیریت پیک، محدوده سرویسدهی و آدرس مشتریها درگیری، این افزونه دقیقاً برای تو ساخته شده! 😎
معرفی میکنم:
#️⃣ افزونه دلیورس | سیستم حرفهای مدیریت ارسال ووکامرس
با دلیورس میتونی:
📍 محاسبه هوشمند هزینه ارسال بر اساس مسافت
🗺️ انتخاب آدرس مشتری روی نقشه نشان
🏪 مدیریت چند شعبه و مبدا ارسال
🚚 اتصال به سرویسهای پیک و درخواست آنلاین پیک
📦 تعیین محدوده قابل سرویسدهی
⏰ امکان تعیین بازههای زمانی ارسال
📱 ارسال پیامکهای اطلاعرسانی
📋 مدیریت و مشاهده سفارشها و وضعیت ارسال
👤 مدیریت آدرسهای مشتری
📊 امکانات مدیریتی برای کنترل بهتر ارسال سفارشات
یعنی بهجای اینکه سفارشها، آدرسها و ارسالها رو دستی مدیریت کنی،
دلیورس بخش بزرگی از فرآیند ارسال فروشگاهت رو یکجا مدیریت میکنه. 💪
━━━━━━━━━━━━━━
🔥🔥 تخفیف ویژه انتشار!
💥 الان دلیورس با ۷۰٪ تخفیف در راستچین عرضه شده!
اگه قصد داری سیستم ارسال فروشگاهت رو حرفهایتر کنی،
الان بهترین زمان خریدشه.
👇 همین الان ببینش و قبل از تموم شدن تخفیف
تهیهش کن:
🛒 افزونه دلیورس در راستچین
🚨 میتونی مقدار یک Option وردپرس رو بدون حتی یک Query تغییر بدی!
خیلیها برای تغییر مقدار یک تنظیم میرن سراغ:
update_option(
'my_setting',
'new_value'
);
اما وردپرس یک هوک خیلی خفن داره که میتونه قبل از اینکه get_option() سراغ دیتابیس بره مقدار رو برات برگردونه:
pre_option_{$option}
😳 مثال واقعی
فرض کن این Option رو داری:
get_option( 'my_api_url' );
میتونی بدون دست زدن به دیتابیس کاری کنی همیشه مقدار دلخواهت برگرده:
add_filter(
'pre_option_my_api_url',
function () {
return 'https://api.example.com/v2';
}
);
از این لحظه:
get_option( 'my_api_url' );
همین مقدار رو دریافت میکنه.
🔥 کاربردش کجاست؟
فرض کن یک افزونه قدیمی داری که داخل صدها جای مختلف نوشته:
get_option( 'my_plugin_mode' );
لازم نیست بری همه فایلها رو تغییر بدی.
میتونی مقدار Option رو از بیرون Override کنی:
add_filter(
'pre_option_my_plugin_mode',
function () {
return 'production';
}
);
بدون:
❌ تغییر دیتابیس
❌ تغییر کد افزونه
❌ اجرای update_option()
🤯 حتی جالبتر...
همین تکنیک برای بعضی Optionهای هسته وردپرس هم قابل استفاده است.
مثلاً:
add_filter(
'pre_option_blogname',
function () {
return 'قلب وردپرس ❤️';
}
);
حالا:
get_option( 'blogname' );
مقدار جدید رو برمیگردونه؛ در حالی که مقدار اصلی دیتابیس دست نخورده باقی مونده.
⚠️ ولی حواست باشه!
این تکنیک برای تغییر دائمی تنظیمات نیست.
اگر میخوای مقدار واقعاً در دیتابیس ذخیره بشه:
update_option()
راه درستشه.
pre_option_* بیشتر برای:
🔹 Override موقت
🔹 تست و Debug
🔹 Environmentهای مختلف
🔹 تغییر رفتار افزونه بدون دستکاری سورس
🔹 سیستمهای Multi-site / Multi-environment
استفاده میشه.
💎 نکتهای که خیلیها نمیدونن:
وردپرس فقط یک سیستم ذخیرهسازی نیست؛ خیلی از APIهای هسته قابل Intercept شدن هستن.
یعنی قبل از اینکه وردپرس کاری رو انجام بده، میتونی وارد جریانش بشی و نتیجه رو تغییر بدی.
این یعنی قدرت واقعی Hookهای وردپرس. 🔥
💬 حالا سؤال:
اگر قرار بود بدون تغییر دیتابیس، یکی از Optionهای سایتت رو Override کنی، کدوم Option رو انتخاب میکردی؟
جوابت رو کامنت کن 👇
📌 @wpheart
❤️ قلب
🚀🔥 دلیورس 1.1.0 منتشر شد!
نسخه جدید دلیورس با چند تغییر اساسی و مهم آمادهست! 😎
اگر دلیورس رو برای مدیریت ارسال فروشگاهت میخوای، این آپدیت رو از دست نده 👇
🏪 مدیریت نامحدود شعبهها
دیگه محدود به تعداد مشخصی شعبه نیستی!
هر تعداد شعبه که داری اضافه کن و اطلاعات هر شعبه رو مدیریت کن.
🗺️ نمایش شعب روی نقشه
شعبهها رو روی نقشه ببین، موقعیت هر شعبه مشخص باشه و اطلاعات شعبهها رو سریع و راحت در اختیار داشته باش. 📍
🏙️ محدود کردن فعالیت دلیورس به یک شهر
فروشگاهت فقط در یک شهر فعالیت میکنه؟
دلیورس رو فقط برای همون شهر فعال کن تا فرآیند ثبت آدرس و ارسال دقیقتر و کنترلشدهتر انجام بشه. 🎯
⚡ سرعت بیشتر، عملکرد بهتر
در نسخه 1.1.0 روی بهینهسازی درخواستها و عملکرد افزونه کار کردیم تا دلیورس سریعتر، روانتر و بهینهتر اجرا بشه.
━━━━━━━━━━━━━━
🔥 دلیورس فقط یک افزونه ارسال نیست؛
قراره مدیریت ارسال فروشگاه ووکامرسی رو حرفهایتر و سادهتر کنه. 🚚
🎁 و اگر هنوز تهیهش نکردی:
همین الان از راستچین تهیه کن! 🔥
👇 نسخه 1.1.0 رو ببین و دلیورس رو به فروشگاهت اضافه کن.
خرید افزونه از راستچین
#دلیورس #ووکامرس #وردپرس #افزونه_وردپرس #فروشگاه_اینترنتی #ارسال_سفارش #مدیریت_شعب #پیک #ووکامرس_فارسی
همین حالا به سایت راستچین مراجعه کنید و در نوار جستجو « دلیورس » رو پیدا کنید و با استفاده اد کد تخفیف
wpheart
با ۳۰ درصد تخفیف دلیورس رو داشته باشید 😉
امکانات جدید که به نسخه ۱.۱.۰ اضافه شده :
✅ محدودیت شهر فعال
✅ مدیریت نامحدود شعبه و نمایش اطلاعات شعبه بر روی نقشه
✅ محاسبه هزینه پیک و زمان ارسال از نزدیکترین شعبه به مشتری
📌و....
🚨 میخوای به کاربر یک لینک بدی که بدون لاگین فقط به همون اطلاعات دسترسی داشته باشه؟
مثلاً:
🔹 لینک دانلود فاکتور
🔹 مشاهده وضعیت سفارش
🔹 لینک لغو سفارش
🔹 لینک تأیید ایمیل
🔹 لینک دسترسی موقت به یک فایل
🔹 لینک مشاهده یک صفحه اختصاصی
لازم نیست برای هرکدوم یک سیستم عجیب احراز هویت بسازی!
یکی از الگوهای جالب وردپرس اینه که یک Nonce رو به URL یا درخواستت اضافه کنی و قبل از انجام عملیات اعتبارش رو بررسی کنی.
🎯 مثال واقعی: لینک لغو سفارش
فرض کن سفارش شماره 1520 داریم.
میخوایم مشتری با یک لینک مثل این:
example.com/?cancel_order=1520&_wpnonce=XXXX
بتونه سفارش خودش رو لغو کنه.
لینک رو اینطوری میسازیم:
$url = wp_nonce_url(
add_query_arg(
[
'cancel_order' => $order_id,
],
home_url()
),
'cancel_order_' . $order_id
);
حالا هنگام دریافت درخواست:
if (
! isset( $_GET['_wpnonce'] ) ||
! wp_verify_nonce(
$_GET['_wpnonce'],
'cancel_order_' . $order_id
)
) {
wp_die( 'لینک نامعتبر است.' );
}
اماااا... 😏
⚠️ اینجا یک اشتباه امنیتی خطرناک وجود دارد!
Nonce به معنی مجوز دسترسی نیست.
اگر لینک مربوط به سفارش شخصی باشد، باید علاوه بر Nonce بررسی کنیم که کاربر واقعاً مالک سفارش است:
if ( $order->get_user_id() !== get_current_user_id() ) {
wp_die( 'دسترسی غیرمجاز.' );
}
یعنی:
Nonce → درخواست معتبر است؟
Authorization → این شخص اجازه انجام این کار را دارد؟
این دو تا یکی نیستند.
🔥 مثال دوم: لینک دانلود خصوصی
فرض کن افزونهای ساختهای که بعد از خرید، به مشتری لینک دانلود میدهد.
بهجای اینکه فایل را مستقیم منتشر کنی:
/wp-content/uploads/file.zip
یک Endpoint میسازی:
/download-file/?order=1520&file=123&_wpnonce=XXXX
و قبل از ارسال فایل بررسی میکنی:
wp_verify_nonce(
$_GET['_wpnonce'],
'download_file_123'
);
بعد بررسی میکنی:
آیا این سفارش متعلق به کاربر است؟
آیا سفارش پرداخت شده؟
آیا فایل متعلق به همین محصول است؟
آیا لینک هنوز معتبر است؟
و فقط در صورت تأیید، فایل را تحویل میدهی.
💡 این الگو در سیستمهای دانلود، فاکتور، قرارداد و فایلهای خصوصی فوقالعاده کاربردی است.
🤯 مثال سوم: لینک تأیید بدون ل
#شریکو
محصول جدید ما بزودی در راستچین منتشر میشه 😉
کاربرد این افزونه به این صورت هستش که شما تعیین میکنید که محصول قابلیت خرید مشارکتی ( دنگی دنگی ) داشته باشه و کاربر در زمان خرید محصول میتونه درصدی از مبلغ محصول رو پرداخت کنه و برای باقی مانده هزینه دوستانش رو برای پرداخت دعوت کنه 😁
اینطوری فروشتون چندبرابر میشه چون :
توی خیلی گروه ها دیدم که مثلا برای خرید یک دوره دنبال فردی میگردن که شریکی بخرن اما خب بحث اعتماد میاد وسط و خرید کنسل میشه! اما به کمک #شریکو دیگه همچین داستانی نیست چون هر کاربر سهم خودش رو از لینک اختصاصی خودش پرداخت میکنه و با تکمیل مبلغ همه شرکا به محصول دسترسی دارن 😉😉😉
بزودی منتظر انتشار #شریکو باشید ❤️
جای چه افزونه و قالبی رو خالی میبینید توی وردپرس؟
بهمون بگید، ایده از شما پیاده سازی از ما، البته هدیه های محفوظ هم براتون داریم 😘🌹
🔥 is_admin() اصلاً یعنی کاربر ادمینه؟!
یکی از اشتباهات جالب توی وردپرس اینه که خیلیها فکر میکنن:
if ( is_admin() ) {
// کاربر ادمین است!
}
❌ کاملاً اشتباهه!
is_admin() اصلاً بررسی نمیکنه کاربر Administrator هست یا نه.
این تابع فقط میگه:
«آیا درخواست فعلی مربوط به محیط مدیریت وردپرسه؟»
مثلاً:
if ( is_admin() ) {
wp_enqueue_script( 'my-script' );
}
یعنی اسکریپت رو در صفحات /wp-admin/ لود کن.
اما اگر هدفت اینه که بفهمی کاربر دسترسی خاصی داره یا نه، باید Capability رو بررسی کنی:
if ( current_user_can( 'manage_options' ) ) {
// کاربر اجازه مدیریت تنظیمات را دارد
}
یا مثلاً:
if ( current_user_can( 'edit_posts' ) ) {
// کاربر اجازه ویرایش نوشتهها را دارد
}
🤯 حالا قسمت خطرناک ماجرا
فرض کن یه AJAX endpoint داری:
add_action( 'wp_ajax_delete_product', 'delete_product' );
function delete_product() {
if ( ! is_admin() ) {
wp_die( 'Access denied' );
}
// حذف محصول...
}
فکر میکنی امنه؟
❌ نه!
چون درخواستهای admin-ajax.php در ساختار مدیریت وردپرس پردازش میشن و is_admin() ممکنه true باشه؛ حتی اینکه کاربر واقعاً مجوز حذف محصول داشته باشه اصلاً بررسی نشده.
روش درست:
function delete_product() {
if ( ! current_user_can( 'delete_products' ) ) {
wp_send_json_error( 'Access denied', 403 );
}
// حذف محصول...
}
و اگر عملیات از سمت کاربر ارسال میشه، Nonce رو هم جداگانه بررسی کن:
check_ajax_referer( 'delete_product' );
if ( ! current_user_can( 'delete_products' ) ) {
wp_send_json_error( 'Access denied', 403 );
}
🧠 پس این سه تا رو قاطی نکن:
is_admin()
محل اجرای درخواست رو مشخص میکنه.
current_user_can()
بررسی میکنه کاربر اجازه انجام کار رو داره یا نه.
Nonce
بررسی میکنه درخواست از جریان مورد انتظار اومده و در برابر CSRF محافظت بشه.
یعنی:
Admin Context ≠، Admin User ≠، Authorization
این یکی از اون تفاوتهاییه که وقتی توی پروژههای واقعی بزرگتر میشی، اهمیتش رو میفهمی. 🔥
حالا با این تفاصیر، به نظرت این کد چه مشکلی داره؟
if ( is_admin() ) {
delete_user();
}
اولین ایرادی که به ذهنت میرسه رو کامنت ک
🔥 فقط current_user_can() کافی نیست!
مجوز هر پست میتونه متفاوت باشه!
فرض کن افزونهای ساختی که کاربر فقط باید بتونه سفارشهای خودش رو ویرایش کنه.
این کد:
if ( current_user_can( 'edit_post', $post_id ) ) {
// اجازه ویرایش
}
از این خیلی حرفهایتره:
if ( current_user_can( 'edit_posts' ) ) {
// اجازه ویرایش
}
چرا؟
چون:
edit_posts
فقط میگه کاربر بهطور کلی قابلیت ویرایش نوشتهها رو داره.
اما:
edit_post
با دادن ID یک پست، بررسی میکنه:
آیا این کاربر اجازه ویرایش همین پست مشخص رو دارد؟
مثلاً:
$post_id = 125;
if ( current_user_can( 'edit_post', $post_id ) ) {
wp_update_post(
array(
'ID' => $post_id,
'title' => 'عنوان جدید',
)
);
}
🤯 حالا یه سناریوی واقعی
فرض کن در افزونهات صفحهای داری که کاربر میتونه سفارش شماره 125 رو تغییر بده.
نباید فقط بگی:
current_user_can( 'edit_posts' )
چون ممکنه کاربر اصلاً صاحب سفارش 125 نباشه.
باید مجوز رو روی همون Object بررسی کنی.
👑 نکته خفنتر
وردپرس پشت پرده برای بعضی Capabilityها از مفهوم:
map_meta_cap()
استفاده میکنه.
یعنی یک Capability ظاهراً ساده مثل:
edit_post
میتونه با توجه به:
📌کاربر
📌 ID پست
📌نویسنده پست
📌وضعیت پست
📌 Capabilityهای کاربر
به یک یا چند مجوز واقعی تبدیل بشه.
پس وردپرس فقط نمیپرسه:
«این کاربر Editor هست؟»
بلکه میتونه بپرسه:
«این کاربر برای انجام این عملیات روی همین آبجکت مشخص مجوز داره؟»
🔥 این دقیقاً همون تفاوت بین Role-based permission و Object-level authorization ـه.
⚠️ قانون مهم
هیچوقت برای عملیات حساس فقط به این تکیه نکن:
if ( is_user_logged_in() ) {
// عملیات حساس
}
لاگین بودن ≠یا داشتن مجوز.
و حتی:
current_user_can( 'edit_posts' )
هم همیشه به معنی اجازه دستکاری هر پست دلخواه نیست.
💬 سوال از شما:
اگر کاربر فقط باید بتواند پستهایی که خودش ساخته را ویرایش کند، شما کدوم رو انتخاب میکنی؟
current_user_can( 'edit_posts' )
یا
current_user_can( 'edit_post', $post_id )
یا اصلاً روش دیگهای؟ 👇🔥
جوابتو بهمون بگو 😉
@wpheart
نسخه ۱.۲.۰ دلیورس منتشر شد ✨🎉🎉
در این نسخه تغییرات اساسی جدیدی صورت گرفته که از مهمترین آنها به موارد زیر اشاره میشه :
✅ اتصال به ربات بله برای ارسال اعلانات به منظور کاهش هزینه های پیامک
✅ امکان ارسال پیام همگانی به اعضای ربات بله از پنل افزونه، به همراه متن، عکس، دکمه
✅ امکان جابجایی محل نمایش نقشه در صفحه چک اوت بین فیلد های صفحه تسویه حساب
✅ رفع برخی ایرادات و بهبود عملکرد.
🔰 یک ماه از زمان انتشار دلیورس در راستچین نگذشته که این دومین میجر آپدیت دلیورس است 😊
🔆 همین حالا با کد تخفیف ۳۰ درصدی دلیورس رو از راستچین تهیه کنید
کد تخفیف : wpheart
خرید افزونه از راستچین
🚨 بزرگترین سوراخ امنیتی REST API وردپرس!
permission_callback رو حذف کنی، ممکنه API ـت برای همه باز بشه!
فرض کن یه endpoint ساختی برای نمایش اطلاعات سفارش:
register_rest_route(
'myplugin/v1',
'/orders',
array(
'methods' => 'GET',
'callback' => 'my_get_orders',
)
);
کد ظاهراً درسته...
اما یه قسمت مهم نداره:
'permission_callback'
❌ مشکل چیه؟
REST API باید علاوه بر اینکه بگه:
«وقتی این URL صدا زده شد، چه کدی اجرا بشه؟»
بدونه:
«چه کسی اجازه داره این کد رو اجرا کنه؟»
مثلاً:
register_rest_route(
'myplugin/v1',
'/orders',
array(
'methods' => 'GET',
'callback' => 'my_get_orders',
'permission_callback' => function () {
return current_user_can( 'manage_woocommerce' );
},
)
);
حالا فقط کاربری که این Capability رو داره میتونه endpoint رو صدا بزنه.
😈 قسمت خطرناکتر
این کد:
'permission_callback' => function () {
return is_user_logged_in();
}
یعنی:
هر کاربر لاگینشدهای اجازه داره.
نه اینکه ادمین باشه!
یا این:
'permission_callback' => '__return_true'
یعنی:
همه اجازه دارن.
اگر endpoint اطلاعات حساس بده یا عملیات مهمی انجام بده، این میتونه فاجعهساز بشه.
🔥 حتی برای GET هم مجوز مهمه
خیلیها فکر میکنن:
«GET که چیزی رو تغییر نمیده، پس Permission لازم نیست.»
اما ممکنه API اطلاعاتی مثل:
email
phone
address
order details
internal IDs
برگردونه.
پس خواندن اطلاعات هم Authorization میخواد.
👑 قانون طلایی REST API
هر endpoint باید حداقل این سه سؤال رو جواب بده:
1️⃣ Authentication
کاربر کیه؟
2️⃣ Authorization
اجازه انجام این کار رو داره؟
3️⃣ Validation
پارامترهایی که فرستاده معتبر هستن؟
مثلاً:
'permission_callback' => function () {
return current_user_can( 'manage_options' );
}
و بعد داخل callback:
function my_get_orders( WP_REST_Request $request ) {
$order_id = absint(
$request->get_param( 'order_id' )
);
if ( ! $order_id ) {
return new WP_Error(
'invalid_order',
'شناسه سفارش نامعتبر است.',
array
🚀 شریکو؛ افزونه خرید اشتراکی ووکامرس
فروش محصولات گرانقیمت را به یک خرید قابلدسترس برای چند نفر تبدیل کنید!
با شریکو امکان خرید اشتراکی محصولات را به فروشگاه ووکامرسی خود اضافه کنید؛
کاربران میتوانند در خرید یک محصول با یکدیگر شریک شوند و هرکدام سهم خود را پرداخت کنند.
💰 فروش بیشتر با یک روش متفاوت!
شریکو کمک میکند محصولات گرانقیمت را هم به شکل اشتراکی عرضه کنید و با کاهش مبلغ پرداختی هر کاربر، فرصت فروش و مشارکت بیشتری ایجاد کنید.
🔥 امکانات کلیدی شریکو :
✅ ایجاد خرید اشتراکی برای محصولات
✅ تعیین تعداد اعضای هر خرید
✅ مدیریت و پیگیری وضعیت خریدهای اشتراکی
✅ مدیریت سهم و پرداخت اعضا
✅ اطلاعرسانی وضعیت خرید به کاربران
✅ سیستم دعوت و مشارکت کاربران
✅ ارسال پیامکهای اطلاعرسانی
✅ اتصال به سامانههای پیامکی
✅ اطلاعرسانی از طریق ربات بله
✅ پنل مدیریتی و کنترل کامل فرآیند خرید
✅ نمایش وضعیت و مراحل خرید به کاربران
✅ طراحی شده برای افزایش مشارکت و فروش محصولات
🎯 مناسب برای فروش:
📱 موبایل و لوازم دیجیتال
💻 لپتاپ و کامپیوتر
🎮 کنسول و تجهیزات گیمینگ
🏠 لوازم خانگی
⌚ محصولات گرانقیمت و لوکس
🔰 هر محصولی که خرید کامل آن برای یک مشتری سختتر است.
🔥 فروش بیشتر؛ با شریکو
یک محصول را به یک خرید چندنفره تبدیل کنید، مشارکت کاربران را افزایش دهید و فرصتهای جدیدی برای فروش ایجاد کنید.
🛒 شریکو؛ افزونه خرید اشتراکی ووکامرس
محصول را بفروش، مشتریها را شریک کن!
💲 لینک خرید با تخفیف ۷۰ درصدی از راستچین
🔥 محصول گرونه؟ مشتری قدرت خریدش رو نداره؟ فروشنده هم فروش بیشتری میخواد؟
اینجاست که شریکو وارد میشه! 🚀
با «شریکو» میتونی امکان خرید دنگیدنگی محصولات رو به فروشگاه ووکامرسیات اضافه کنی؛ یعنی چند مشتری میتونن در خرید یک محصول با هم شریک بشن و هرکدوم سهم خودشون رو پرداخت کنن. 💳
نتیجه؟
🔹 کاهش فشار قیمت برای مشتری
🔹 افزایش شانس خرید محصولات گرانتر
🔹 جذب مشتریهای بیشتر
🔹 ایجاد یک مدل فروش متفاوت و جذاب
🔹 مدیریت ساده فرآیند خرید مشارکتی
🎙️ توی این ویس، کامل توضیح دادیم که شریکو چطور کار میکنه و چطور میتونه مدل فروش فروشگاهت رو تغییر بده.
اگر فروشگاه ووکامرسی داری و دنبال یک راه جدید برای افزایش فروش و جذب مشتری هستی، این ویس رو از دست نده. 👇
🛒 شریکو | خرید دنگیدنگی برای ووکامرس
✨ با ۳۰ درصد تخفیف تا ساعت ۱۲ امشب میتونید شریکو رو برای همیشه خریداری کنید و فروش سایتتون رو چندبرابر کنید 😉
❗️ از مهمترین ویژگی های شریکو 👇
✅ امکان خرید مشارکتی محصولات
✅ صفحه پرداخت اختصاصی
✅ مدیریت سفارشات اشتراکی
✅ افزایش قیمت پلکانی
✅ نرخ تبدیل فروش بالای محصولات
✅ اتصال به ربات بله و سامانه های پیامکی
✅ و...
🎉 کد تخفیف : wpheart
همین الان اقدام کن و فروش بیشتر محصولاتت رو تضمین کن 😉
برای مشاهده امکانات و خرید از راستچین :
https://www.rtl-theme.com/shariko-wordpress-plugin/