[wp-hackers] Plugin Questions

Owen Winkler ringmaster at midnightcircus.com
Thu May 12 15:21:56 GMT 2005


Scott Merrill wrote:
> Bill Smith wrote:
> 
>>1) I'm working on a small plugin that requires an additional database
>>table. Currently I'm using a query like
>>
>>SHOW TABLES LIKE 'wp_mytable'
> 
> Here's what I do in my subscribe2 plugin, which uses a custom table:
> ///////////////////////
> function s2_install() {
> // include upgrade-functions for maybe_create_table;
> if (! function_exists('maybe_create_table')) {
>         require_once(ABSPATH . '/wp-admin/upgrade-functions.php');
> }

maybe_create_table() also uses SHOW TABLES, which is fine, but doesn't 
avoid that query if that's the intent.

Here's what I do:

class MyPlugin {
  $table_version = 1;
  function MyPlugin() {
   $this->settings = get_settings('MyPlugin');
   if($this->settings['table_version'] < $this->$table_version)
    $this->make_tables();
   //These also go here:
   // add_action('admin_menu', array(&$this, 'admin_menu'));
  }
  function make_tables() {
   global $table_prefix;
   if(!require_once(ABSPATH . 'wp-admin/upgrade-functions.php')) {
    die('Foolish plugin has added its own maybe_upgrade* functions');
   }
   $qry = "CREATE TABLE {$table_prefix}mytable (
    mytable_id BIGINT(11) NOT NULL AUTO_INCREMENT,
    PRIMARY KEY  (mytable_id)
    );
    ";
   dbDelta($qry);
   $this->settings['table_version'] = $this->table_version;
   update_option('MyPlugin', $this->settings);
  }
}
$myplugin = new MyPlugin();

What benefit has all this?  If you change the table structure in an 
upgrade (add a field, change a field type, add an enum value, etc.), you 
simply increment the $table_version and the plugin will automatically 
upgrade the table.  Plus it's one less database hit if the options info 
is already cached.

 >> 2) This may be more of a php question. There are occasions where I
 >> would like to perform a longer running task in the background (in
 >> terms of a minute or two, not hours).

I've been considering this type of thing myself, but my process is a 
series of repetitious function calls, each of which could take some 
length of time.  I'm considering adding a client-side reload hack for 
this issue, since the methods to extend allowed execution time for PHP 
executed from the web are not reliable enough for me, and provide no 
user feedback for the process.

>>3) Last one... for the moment. :) In certain parts of my plugin, I'd
>>like to restrict access to either the admin or users of a certain level.
>>Is there a call that can tell me the users credentials so I can
>>determine what they are allowed to do?
> 
> get_currentuserinfo() usually works; though there might be some
> complication now with the "pluggable functions" recently introduced.

get_currentuserinfo() works inside of functions that are executed from 
plugin hooks.  Do not attempt to call get_currentuserinfo() before all 
plugins are loaded.

It doesn't seem like the pluggable functions list is in the Codex.  Here 
it is:  get_currentuserinfo, get_userdata, get_userdatabylogin, wp_mail, 
wp_login, auth_redirect, wp_redirect, wp_setcookie, wp_clearcookie, 
wp_notify_postauthor, wp_notify_moderator

Calling any of those functions before all plugins are loaded will cause 
you problems.  This I know all too well.

Owen






More information about the wp-hackers mailing list