تابع wp_update_nav_menu_item در وردپرس
تابع wp_update_nav_menu_item() یکی از توابع مهم API منو در وردپرس است که برای ایجاد یا بهروزرسانی آیتمهای منو در دیتابیس استفاده میشود. این مقاله بهصورت جامع نحوه کار با این تابع، پارامترها، مثالهای عملی و نکات پیشرفته را توضیح میدهد تا بتوانید منوها را برنامهنویسیشده مدیریت کنید.
معرفی کوتاه و کاربرد
کاربرد اصلی این تابع اضافه یا ویرایش آیتمهای منو (menu items) است. معمولاً وقتی میخواهید از طریق کد یک آیتم منو اضافه کنید یا خاصیتهای آیتم را بهروزرسانی کنید—مانند متن، لینک، کلاسهای CSS یا اهداف—از این تابع استفاده میشود.
امضای تابع و پارامترها
wp_update_nav_menu_item( $menu_id, $menu_item_db_id, $menu_item_data );توضیح پارامترها:
- $menu_id (int): شناسه منویی که میخواهید آیتم داخل آن قرار گیرد.
- $menu_item_db_id (int): شناسه آیتم منو در دیتابیس. اگر برابر با 0 باشد، آیتم جدیدی ایجاد میشود و در غیر این صورت آیتم مربوطه بهروزرسانی میشود.
- $menu_item_data (array): آرایهای از فیلدهای مورد نیاز برای آیتم منو مانند menu-item-title, menu-item-url, menu-item-object-id و غیره.
فیلدهای رایج در $menu_item_data
| کلید | توضیح |
|---|---|
| menu-item-title | عنوان آیتم منو |
| menu-item-url | لینک سفارشی |
| menu-item-object | نوع شیء (مثلاً ‘post’, ‘category’, ‘custom’) |
| menu-item-object-id | شناسه شیء مرتبط (مثلاً شناسه نوشته) |
| menu-item-parent-id | شناسه والد برای سابمنو |
| menu-item-classes | آرایه یا رشته کلاسهای CSS |
| menu-item-xfn | rel یا XFN |
| menu-item-target | تارگت لینک (مثل _blank) |
مثال ساده: اضافه کردن آیتم منو
$menu_id = 3; // شناسه منو
$menu_item_db_id = 0; // 0 برای ایجاد آیتم جدید
$menu_item_data = array(
'menu-item-title' => 'صفحه نمونه',
'menu-item-url' => 'https://example.com/sample-page',
'menu-item-status'=> 'publish'
);
$new_item_id = wp_update_nav_menu_item( $menu_id, $menu_item_db_id, $menu_item_data );این کد یک آیتم منوی جدید با عنوان “صفحه نمونه” و آدرس مشخصشده داخل منویی با شناسه 3 ایجاد میکند. مقدار بازگشتی ($new_item_id) شناسه آیتم جدید یا خطا است.
توضیحات فنی و بررسی خطا
تابع در صورتی که موفق باشد شناسه آیتم را برمیگرداند و در صورت خطا ممکن است WP_Error بازگرداند. همواره باید مقدار بازگشتی را بررسی کنید و از قابلیتهای وردپرس (مانند current_user_can و nonce) برای امنیت استفاده کنید.
مثال پیشرفته: بهروزرسانی آیتم و اضافه کردن کلاس و والد
$menu_id = 3;
$existing_item_id = 45; // شناسه آیتمی که میخواهیم بهروزرسانی کنیم
$menu_item_data = array(
'menu-item-title' => 'عنوان جدید',
'menu-item-url' => 'https://example.com/updated',
'menu-item-parent-id' => 10, // قرارگیری بهعنوان زیرآیتم
'menu-item-classes' => 'custom-class another-class',
'menu-item-target' => '_blank',
'menu-item-status' => 'publish'
);
$result = wp_update_nav_menu_item( $menu_id, $existing_item_id, $menu_item_data );
if ( is_wp_error( $result ) ) {
error_log( 'Menu update error: ' . $result->get_error_message() );
} else {
// $result شناسه آیتم بهروز شده
}در این نمونه آیتمی با شناسه 45 بهروزرسانی میشود، کلاسها اضافه شده و بهعنوان زیرآیتم با والد 10 قرار میگیرد. در صورت خطا پیام در لاگ ثبت خواهد شد.
نکات امنیتی و بهینهسازی
- همیشه بررسی کنید کاربر جاری توانایی مدیریت منوها را داشته باشد؛ از current_user_can(‘edit_theme_options’) یا capability مناسب استفاده کنید.
- قبل از ذخیرهسازی دادهها را sanitize کنید؛ بهعنوان مثال esc_url_raw برای URL و sanitize_text_field برای عنوان.
- برای بهبود کارایی، تغییرات گروهی را در یک عملیات انجام دهید نه هربار فراخوانی تابع برای هر آیتم—بهخصوص در اسکریپتهای نصب یا ایمپورت.
- پس از تغییر منو cacheهای مرتبط را پاک کنید یا از توابعی مانند clean_post_cache استفاده کنید در صورت نیاز.
بهینهسازی کد: نمونه با پاکسازی ورودیها
$menu_id = intval( $menu_id );
$menu_item_data = array(
'menu-item-title' => sanitize_text_field( $title ),
'menu-item-url' => esc_url_raw( $url ),
'menu-item-status'=> 'publish'
);
$new_item_id = wp_update_nav_menu_item( $menu_id, 0, $menu_item_data );در این کد ورودیها با توابع sanitize و esc پاکسازی شدهاند تا از درج دادههای مخرب جلوگیری شود. همچنین شناسه منو با intval تبدیل به عدد شده است.
استفاده در پلاگینها و ایونتهای خودکار
این تابع معمولاً در:
- اسکریپتهای نصب/درونریزی (install scripts) برای ایجاد منوهای پیشفرض
- پلاگینهایی که منوهای داینامیک میسازند (مثلاً بر اساس تنظیمات کاربر)
- سرویسهای یکپارچه با API که لیستهای ناوبری را همگامسازی میکنند
جایگزینها و تعامل با REST API
اگر با REST API کار میکنید، میتوانید از endpoints مربوط به منو (در صورتی که از پلاگینهایی مانند WP REST API Menus استفاده کنید) استفاده کنید. اما در سمت سرور و درون پلاگین یا theme استفاده مستقیم از wp_update_nav_menu_item سادهتر و قابل کنترلتر است.
اشکالات رایج و راهحل
- آیتم ایجاد نمیشود: بررسی کنید $menu_id صحیح باشد و کاربر دسترسی کافی داشته باشد.
- فیلدهای سفارشی ذخیره نمیشوند: باید metaهای منو (wp_set_object_terms / update_post_meta روی آیتم منو) را بعد از ایجاد آیتم تنظیم کنید.
- ترتیب یا parent درست اعمال نمیشود: ترتیب منو با فیلد menu-item-position و parent با menu-item-parent-id مدیریت میشود—اطمینان حاصل کنید مقادیر صحیح هستند.
خلاصه و پیشنهادات نهایی
wp_update_nav_menu_item یک ابزار قدرتمند برای مدیریت برنامهنویسیشده منوها در وردپرس است. با درک فیلدهای ورودی، رعایت امنیت و پاکسازی دادهها و مدیریت cache میتوانید منوهای پویا و انعطافپذیری را پیادهسازی کنید. همیشه قبل از اجرا در محیط زنده، تغییرات را در محیط تست بررسی نمایید و خطاها را لاگ کنید.
آیا این مطلب برای شما مفید بود ؟




