【问题标题】:WORDPRESS UPDATE DB method not get called没有调用 WORDPRESS UPDATE DB 方法
【发布时间】:2013-01-01 05:39:44
【问题描述】:

我正在制作一个 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 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
}

update_database() 方法是我添加的新方法,它试图更新数据库以获得额外的功能。但是当插件激活时它永远不会运行。

【问题讨论】:

  • 完全没有错误.....这就是我如此沮丧的原因。

标签: php mysql wordpress plugins


【解决方案1】:

你只想执行那个查询。

global $wpdb;
$wpdb->query($sql);

dbDelta 用于创建新表或更新现有表以符合更新的方案。简单地说,它接受CREATE TABLE 查询并在必要时将其转换为ALTER TABLE 查询。 The Codex 说:

dbDelta 函数检查当前表结构,比较它 到所需的表结构,并添加或修改表 必要时,因此它对于更新非常方便 [...] 请注意, 然而,dbDelta 函数相当挑剔。

【讨论】:

  • 嘿。好建议,我试过你的方法,事实上,我什至试过:$wpdb->query($wpdb->prepare(sql));也是。他们都不工作。该插件启动正常,没有错误,但似乎 sql 永远不会运行。(如果我通过 mysql 命令行运行它,它可以工作,所以语法是正确的)
  • 你确定update_database() 被调用了吗?您可以尝试在方法中添加 echodie 以查看它是否真的出现。
  • 嗨:好主意。我在 update_datebase() 方法的开头添加了一个骰子,并尝试激活我的插件:无法激活插件,因为它触发了致命错误。所以它被调用了。但只是没有显示任何错误也没有工作。
  • 如果我将我的 sql 查询更改为直接更改表,它将运行正常并且数据库被修改。但这个过程似乎不起作用。虽然它没有给我任何错误,并且从 mysql 命令行运行良好。
  • 我的想法已经不多了。 WordPress用于登录的数据库帐户是否具有创建和执行程序的适当权限?
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 2012-03-13
  • 2012-08-25
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
相关资源
最近更新 更多