تابع wp_delete_nav_menu در وردپرس
تابع wp_delete_nav_menu() یکی از توابع هسته وردپرس برای حذف برنامهای (programmatically) یک منوی ناوبری است. در این مقاله به صورت کامل کاربرد، پارامترها، مثالهای عملی و نکات ایمنی مرتبط با این تابع را بررسی میکنیم تا بتوانید با اطمینان از آن در پلاگینها یا توابع قالب خود استفاده کنید.
چیست و چه کاری انجام میدهد
تابع wp_delete_nav_menu() منوی ناوبری (که در واقع یک ترم از taxonomy به نام nav_menu است) را حذف میکند. در فرایند حذف، آیتمهای منو (post type = nav_menu_item) نیز حذف میشوند و ارجاعات مربوط به آنها از پایگاهداده پاک میگردد. این تابع یک حذف کامل از منوی مشخص را انجام میدهد و در صورت موفقیت مقدار true و در صورت شکست false یا WP_Error بازمیگرداند.
پارامترها و مقدار بازگشتی
| پارامتر | نوع | شرح |
|---|---|---|
| menu | int | object | string | شناسه ترم منو (term_id) یا شیء منو یا اسلاگ/نام منو که مشخص میکند کدام منو حذف شود. |
| مقدار بازگشتی | bool | WP_Error | در صورت موفقیت true، در صورت شکست false یا یک WP_Error برمیگردد. |
مثالهای کاربردی
حذف منو با شناسه (term_id):
<?php
$menu_id = 12; // شناسه منو
$result = wp_delete_nav_menu( $menu_id );
if ( is_wp_error( $result ) ) {
error_log( 'خطا در حذف منو: ' . $result->get_error_message() );
} elseif ( $result === false ) {
error_log( 'حذف منو موفقیتآمیز نبود.' );
} else {
error_log( 'منو با موفقیت حذف شد.' );
}
?>این قطعه کد منویی با شناسه 12 را حذف میکند و نتیجه را لاگ میگیرد. در محیط واقعی بهتر است از چکهای قابلیت کاربر هم استفاده کنید.
حذف منو بر اساس نام یا اسلاگ (در صورتی که نام منو را دارید):
<?php
$menu_obj = wp_get_nav_menu_object( 'primary' ); // 'primary' میتواند اسلاگ یا نام باشد
if ( $menu_obj ) {
wp_delete_nav_menu( $menu_obj->term_id );
}
?>در این مثال ابتدا شیء منو با استفاده از wp_get_nav_menu_object() گرفته شده و سپس با استفاده از شناسه آن حذف میشود.
مثال امن برای استفاده در پنل مدیریت یا AJAX
<?php
// فرض: پردازش یک درخواست AJAX در سمت سرور
add_action( 'wp_ajax_delete_custom_menu', function() {
if ( ! current_user_can( 'edit_theme_options' ) ) {
wp_send_json_error( 'دسترسی کافی ندارید.' );
}
check_admin_referer( 'delete-menu-nonce', 'nonce' );
$menu_id = isset( $_POST['menu_id'] ) ? intval( $_POST['menu_id'] ) : 0;
if ( ! $menu_id ) {
wp_send_json_error( 'شناسه منو نامعتبر است.' );
}
$result = wp_delete_nav_menu( $menu_id );
if ( is_wp_error( $result ) ) {
wp_send_json_error( $result->get_error_message() );
} elseif ( $result === false ) {
wp_send_json_error( 'حذف موفقیتآمیز نبود.' );
} else {
wp_send_json_success( 'منو حذف شد.' );
}
} ); ?>در این مثال بررسیهای مربوط به توانایی کاربر و nonce انجام شده و سپس حذف منو انجام میشود تا از سوءاستفاده جلوگیری گردد.
نکات و بهترینروشها (Expert Tips)
- بررسی مجوزها: همیشه قبل از حذف منو، قابلیت مناسب کاربر را با توابعی مانند
current_user_can('edit_theme_options')چک کنید. - پشتیبانگیری: حذف منو دائمی است و آیتمها پاک میشوند؛ قبل از عملیات، مخصوصاً در سایتهای زنده، از پایگاهداده پشتیبان بگیرید.
- استفاده از nonces: در درخواستهای AJAX یا فرمهای مدیریتی از nonce برای جلوگیری از CSRF استفاده کنید.
- بررسی وابستگیها: برخی قالبها یا افزونهها ممکن است به وجود منوها وابسته باشند؛ پیش از حذف، اطمینان حاصل کنید که حذف باعث شکستن ساختار قالب نمیشود.
- پاکسازی مکانها (Locations): پس از حذف منو ممکن است گزینههای تخصیص مکان (nav_menu_locations) به منو اشاره کنند؛ بررسی و آپدیت آنها میتواند از ارجاعات نامعتبر جلوگیری کند.
نمونه کد برای پاکسازی موقعیتهای منو
<?php
// حذف ارجاعات به منوی حذفشده در option 'nav_menu_locations'
function cleanup_nav_menu_locations_after_delete( $menu_id ) {
$locations = get_nav_menu_locations();
$changed = false;
foreach ( $locations as $loc => $assigned_id ) {
if ( intval( $assigned_id ) === intval( $menu_id ) ) {
$locations[ $loc ] = 0;
$changed = true;
}
}
if ( $changed ) {
set_theme_mod( 'nav_menu_locations', $locations );
}
}
// استفاده: پس از wp_delete_nav_menu( $menu_id );
cleanup_nav_menu_locations_after_delete( $menu_id );
?>این تابع مقادیر گزینه تخصیص منوها را چک کرده و هر مکان (location) که به منوی حذفشده اشاره دارد را پاک میکند تا هنگام فراخوانی منوهای موقعیتی ارجاع به ترم ناموجود نداشته باشیم.
موارد استفاده (Use Cases)
- حذف منوهای نمونه یا دمو هنگام فعالسازی قالب در فرآیند setup قالب.
- ساخت پنل مدیریت سفارشی برای مدیریت منوها و حذف آنها از طریق AJAX یا فرمهای اختصاصی.
- اتوماسیون پاکسازی منوها هنگام لغو نصب افزونهای که منوهای اختصاصی ساخته است.
- اسکریپتهای مهاجرت یا پاکسازی داده که نیاز به حذف منوهای خاص دارند.
جمعبندی
تابع wp_delete_nav_menu() ابزار ساده و مفیدی برای حذف برنامهای منوها در وردپرس است، اما به دلیل اثر دائمی آن باید با احتیاط و پس از بررسی دسترسیها، پشتیبانگیری و در صورت نیاز پاکسازی مکانهای منو استفاده شود. ترکیب این تابع با بررسیهای امنیتی (capabilities و nonces) و پاکسازی پس از حذف به شما کمک میکند عملیات پاکسازی منو را بدون ایجاد مشکلات جانبی اجرا کنید.
آیا این مطلب برای شما مفید بود ؟




