提交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
相关产品推荐
相关产品推荐

