Php 未调用WORDPRESS更新数据库方法
我正在制作一个wordpress插件,在主php文件中有函数:Php 未调用WORDPRESS更新数据库方法,php,mysql,wordpress,plugins,Php,Mysql,Wordpress,Plugins,我正在制作一个wordpress插件,在主php文件中有函数: <?php include_once "define.php"; include_once 'includes/form_processor.php'; include_once 'includes/email_subscriber.php'; include_once 'includes/options_page.php'; include_once 'includes/widget.php'; //register th
<?php
include_once "define.php";
include_once 'includes/form_processor.php';
include_once 'includes/email_subscriber.php';
include_once 'includes/options_page.php';
include_once 'includes/widget.php';
//register the plugin installation methods
register_activation_hook(__FILE__, 'install_simple_subscriber_plugin');
register_deactivation_hook(__FILE__, 'uninstall_simple_subscriber_plugin');
//register the plugin url
wp_enqueue_style('simple-email-subscriber-css', plugins_url('/simple_email_subscriber/stylesheets/style.css'));
function install_simple_subscriber_plugin(){
add_action('plugins_loaded', 'setup_plugin_actions');
email_subscriber::install_database();
email_subscriber::update_database();
}
function setup_plugin_actions(){
if(has_action('publish_post')){
$simple_email_subscriber = new email_subscriber();
//add action listener to post publication
add_action('publish_post', array($simple_email_subscriber, 'on_publish_post'));
add_action('publish__future_post', array($simple_email_subscriber, 'on_publish_post'));
}
//add the admin menu pages
$options_page = new options_page();
}
function uninstall_simple_subscriber_plugin(){
remove_action('plugins_loaded', 'setup_plugin_actions');
}
?>
在我的自定义类中,我有:
<?php
class email_subscriber{
/*
* Plugin Core Methods
* */
static function install_database() {
//define create table query
$sql = "CREATE TABLE IF NOT EXISTS ".SIMPLE_EMAIL_SUBSCRIBER_DB_NAME."(
id mediumint(9) NOT NULL AUTO_INCREMENT,
subscribe_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
email VARCHAR(55) NOT NULL,
UNIQUE KEY id (id)
);";
//update db and make it auto adjust
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
//HERE IS THE NEW BITS ADDED TO THE EXISTING PLUGIN THAT'S NOT GET CALLED
static function update_database(){
$sql=
"DELIMITER $$
CREATE PROCEDURE Alter_Table()
BEGIN
DECLARE _count INT;
SET _count = ( SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'email_subscription' AND
COLUMN_NAME = 'subscribe_all');
IF _count = 0 THEN
ALTER TABLE ".SIMPLE_EMAIL_SUBSCRIBER_DB_NAME."
ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;
END IF;
END $$
DELIMITER ;
CALL Alter_Table();
DROP PROCEDURE Alter_Table;
";
//update db and make it auto adjust
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
//add the options for db defination
add_option("ses_db_version", SES_PLUGIN_VERSION);
}
.................and other codes
}
您只想执行该查询
global $wpdb;
$wpdb->query($sql);
dbDelta
用于创建新表或更新现有表以符合更新的方案。简单地说,它接受createtable
查询,并在必要时将其转换为alterttable
查询。说:
dbDelta函数检查当前表结构,并对其进行比较
添加到所需的表结构,并添加或修改表
如有必要,它可以非常方便地进行更新[…]请注意
然而,dbDelta函数相当挑剔
一点错误都没有……这就是我为什么如此沮丧的原因。嘿。很好的建议,我试过你的方法,事实上,我甚至试过:$wpdb->query($wpdb->prepare(sql));也他们中没有人工作。这个插件一开始很好,没有错误,但sql似乎永远不会运行。(如果我通过mysql命令行运行它,那么语法是正确的)你绝对确定调用了update\u database()
?您可以尝试在方法中添加一个echo
或die
,看看它是否真的显示出来。嗨:好主意。我在update_datebase()方法的开头添加了一个骰子,并尝试激活我的插件:插件无法激活,因为它触发了一个致命错误。。所以它被称为。如果我把sql查询改成一个直接的alter表,它会正常运行,数据库也会被修改。但这一过程似乎不起作用。虽然它没有给我任何错误,而且它在mysql命令行中运行良好。我在这里已经没有想法了。WordPress用于登录的数据库帐户是否具有创建和执行过程的适当权限?