ویژگی تصویر

آموزش تابع wp_delete_nav_menu() در وردپرس و کاربرد آن

  /  وردپرس   /  تابع wp_delete_nav_menu در وردپرس
بنر تبلیغاتی الف
wp - wordpress - وردپرس

تابع wp_delete_nav_menu() یکی از توابع هسته وردپرس برای حذف برنامه‌ای (programmatically) یک منوی ناوبری است. در این مقاله به صورت کامل کاربرد، پارامترها، مثال‌های عملی و نکات ایمنی مرتبط با این تابع را بررسی می‌کنیم تا بتوانید با اطمینان از آن در پلاگین‌ها یا توابع قالب خود استفاده کنید.

چیست و چه کاری انجام می‌دهد

تابع wp_delete_nav_menu() منوی ناوبری (که در واقع یک ترم از taxonomy به نام nav_menu است) را حذف می‌کند. در فرایند حذف، آیتم‌های منو (post type = nav_menu_item) نیز حذف می‌شوند و ارجاعات مربوط به آن‌ها از پایگاه‌داده پاک می‌گردد. این تابع یک حذف کامل از منوی مشخص را انجام می‌دهد و در صورت موفقیت مقدار true و در صورت شکست false یا WP_Error بازمی‌گرداند.

پارامترها و مقدار بازگشتی

پارامترنوعشرح
menuint | 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) و پاکسازی پس از حذف به شما کمک می‌کند عملیات پاکسازی منو را بدون ایجاد مشکلات جانبی اجرا کنید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: