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

提交WordPress插件至WP仓库遇DirectDatabaseQuery错误求解决

解决WordPress插件仓库审核的DirectDatabaseQuery错误问题

提交插件到WordPress插件仓库时,多个PHP文件触发错误提示:

Use of a direct database call is discouraged WordPress.DB.DirectDatabaseQuery.DirectQuery

已尝试多种修复手段,遵循WPCS规范后错误仍存在;本地使用Plugin Check插件检测未发现该错误,现需解决方案以通过仓库审核。

相关代码片段:

global $wpdb;
$table_name = $wpdb->prefix . 'orgsmtp_logs';

// Define the data to insert
$data_to_insert = array(
    'recipient_email' => $email,
    'sender_name' => $options['gmail_smtp_from_name'],
    'subject'   => $subject,
    'reply_email' => $replyemail,
    'bcc_email' => $bccemail,
    'cc_email' => $ccemail,
    'message' => $message,
    'status' => 'failed'
);
//Insert the data into the database table
$wpdb->insert($table_name, $data_to_insert);

可行解决方案

  • 对齐WPCS版本检测:插件仓库使用的WPCS版本可能与本地不一致,建议本地安装最新稳定版WPCS重新检测,排除版本差异导致的误判。
  • 改用自定义帖子类型(CPT)存储数据:WordPress官方优先推荐用CPT替代自定义表存储这类日志数据,完全符合规范。示例代码:
// 先在插件初始化时注册CPT(示例)
function register_orgsmtp_log_cpt() {
    register_post_type('orgsmtp_log', array(
        'labels' => array('name' => 'SMTP日志'),
        'public' => false,
        'show_ui' => true,
        'capability_type' => 'post',
        'supports' => array('title', 'content')
    ));
}
add_action('init', 'register_orgsmtp_log_cpt');

// 插入日志数据
$log_post = array(
    'post_title'    => wp_strip_all_tags($subject),
    'post_content'  => $message,
    'post_status'   => 'publish',
    'post_type'     => 'orgsmtp_log',
    'meta_input'    => array(
        'recipient_email' => $email,
        'sender_name' => $options['gmail_smtp_from_name'],
        'reply_email' => $replyemail,
        'bcc_email' => $bccemail,
        'cc_email' => $ccemail,
        'status' => 'failed'
    )
);
wp_insert_post($log_post);
  • 添加WPCS豁免注释(临时方案):若必须使用自定义表,可在代码上方添加豁免注释,并在审核说明中阐述使用自定义表的必要性(如性能优化、特殊数据结构需求):
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- 说明:SMTP日志数据量较大,使用自定义表更利于查询性能
global $wpdb;
$table_name = $wpdb->prefix . 'orgsmtp_logs';

// 后续插入代码...
  • 规范自定义表创建逻辑:确保自定义表通过register_activation_hook触发创建,并使用dbDelta()函数执行建表语句,符合WordPress数据库操作标准,减少审核风险:
function create_orgsmtp_log_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'orgsmtp_logs';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        recipient_email varchar(255) NOT NULL,
        sender_name varchar(255) NOT NULL,
        subject text NOT NULL,
        reply_email varchar(255),
        bcc_email text,
        cc_email text,
        message longtext NOT NULL,
        status varchar(20) NOT NULL,
        created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
        PRIMARY KEY  (id)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
register_activation_hook(__FILE__, 'create_orgsmtp_log_table');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:04:56