You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress插件设置页删除数据库行后触发提示信息的实现问题

在WordPress插件中实现删除数据库行后显示管理提示

问题原因

你之前通过检查表行数判断是否显示提示的逻辑存在缺陷:如果表原本为空,或者删除后用户又添加了数据,都会导致提示不准确。另外,admin_post_{$action}钩子执行后会立即重定向,无法直接在该上下文触发通知,必须通过重定向传递状态信息。

解决方案1:通过URL查询参数传递状态(简单直接)

1. 修改删除操作的回调函数

更新admin_post_my_delete_event钩子的回调,在重定向时添加删除状态的查询参数:

add_action( 'admin_post_my_delete_event', function () {
    global $wpdb;
    $table  = $wpdb->prefix . 'toa_tracking';
    $redirect_url = admin_url('admin.php?page=toa_settings&tab=tab1');

    if (!empty($_POST['delete_rows'])) {
        check_admin_referer( 'my_delete_event');
        // 执行清空表操作
        $delete_success = $wpdb->query("TRUNCATE TABLE $table");
        
        // 根据操作结果添加查询参数
        if ($delete_success) {
            $redirect_url = add_query_arg('toa_delete_status', 'success', $redirect_url);
        } else {
            $redirect_url = add_query_arg('toa_delete_status', 'error', $redirect_url);
        }
    }

    wp_redirect($redirect_url);
    exit;
});

2. 修改通知显示函数

更新admin_notices钩子的回调,检查URL中的状态参数并显示对应提示:

add_action( 'admin_notices', 'toa_notice' );
function toa_notice() {
    // 仅在目标设置页且存在状态参数时执行
    if (!isset($_GET['page']) || $_GET['page'] !== 'toa_settings' || !isset($_GET['toa_delete_status'])) {
        return;
    }

    $status = $_GET['toa_delete_status'];
    if ($status === 'success') {
        add_settings_error(
            'toa_delete_info',
            'delete_success',
            '所有行已成功删除',
            'success'
        );
    } elseif ($status === 'error') {
        add_settings_error(
            'toa_delete_info',
            'delete_error',
            '删除操作失败,请检查数据库权限后重试',
            'error'
        );
    }
    settings_errors( 'toa_delete_info' );
}

解决方案2:使用Transient存储状态(更安全)

如果担心用户手动修改URL参数触发提示,可以使用WordPress的Transient临时存储状态:

1. 修改删除操作的回调函数

add_action( 'admin_post_my_delete_event', function () {
    global $wpdb;
    $table  = $wpdb->prefix . 'toa_tracking';
    $redirect_url = admin_url('admin.php?page=toa_settings&tab=tab1');

    if (!empty($_POST['delete_rows'])) {
        check_admin_referer( 'my_delete_event');
        $delete_success = $wpdb->query("TRUNCATE TABLE $table");
        
        // 存储临时状态(30秒过期,避免持久显示)
        if ($delete_success) {
            set_transient('toa_delete_success', true, 30);
        } else {
            set_transient('toa_delete_error', true, 30);
        }
    }

    wp_redirect($redirect_url);
    exit;
});

2. 修改通知显示函数

add_action( 'admin_notices', 'toa_notice' );
function toa_notice() {
    if (!isset($_GET['page']) || $_GET['page'] !== 'toa_settings') {
        return;
    }

    // 检查并显示成功提示
    if (get_transient('toa_delete_success')) {
        add_settings_error(
            'toa_delete_info',
            'delete_success',
            '所有行已成功删除',
            'success'
        );
        delete_transient('toa_delete_success'); // 显示后立即删除
    } 
    // 检查并显示错误提示
    elseif (get_transient('toa_delete_error')) {
        add_settings_error(
            'toa_delete_info',
            'delete_error',
            '删除操作失败,请检查数据库权限后重试',
            'error'
        );
        delete_transient('toa_delete_error');
    }
    
    settings_errors( 'toa_delete_info' );
}

补充说明

  • TRUNCATE TABLE会清空表并重置自增ID,如果你只是想删除所有行但保留自增ID,可以替换为DELETE FROM $table。
  • 确保你的插件有足够的数据库权限执行TRUNCATE或DELETE操作。

内容的提问来源于stack exchange,提问作者timholz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 06:33:28