it-swarm.com.de

datenbankinteraktionen mit OOP

Ich entwickle ein WordPress-Plugin, das Daten in einer Datenbank speichert. Ich habe versucht, OOP für mein Plugin gemäß Boilerplate aus Best Practices zu starten: https://github.com/DevinVinson/WordPress-Plugin-Boilerplate/tree/master/plugin-name

Was ich nicht verstehen kann ist, wie man das Erstellen von Tabellen nur einmal aufruft - beim Plugin-Installationsereignis und um alle Interaktionen sicher zu machen. Außerdem möchte ich einige Ladeaufgaben über cron einplanen.

Ich habe herausgefunden, dass es zwei Möglichkeiten für das erste Tor gibt:

  • Machen Sie alle Methoden öffentlich statisch, damit die Klasse db loader nur noch ein Wrapper um die wpdb-Instanz wird. Aber es ist nicht sicher genug, nicht wahr?

  • Initialisieren Sie die DB Loader-Instanz jedes Mal, wenn das Plugin dies benötigt. (mit privaten Methoden und so weiter)

Die Frage ist, wie die Instanz der db loader-Klasse korrekt initialisiert werden kann, um alle Tabellen nur einmal zu erstellen und öffentliche statische Methoden zu vermeiden.

Dies ist Code von Boilerplate:

    /**
    * Core plugin class
    */
    require_once plugin_dir_path(__FILE__) . 'includes/class_my_plugin.php';


    function run_my_plugin() {
        $plugin = new my_plugin();
        $plugin->run();
    }

    run_my_plugin();

Es ist das Hauptbeispiel der Plugin-Klasse:

class my_plugin {

private
    $wpdb,
    $table_prefix,
    $charset_collate;


public function __construct() {
    global $wpdb;

    $this->wpdb = &$wpdb;
    $this->table_prefix = $this->wpdb->prefix . 'test_private_';
    $charset_collate = $this->wpdb->get_charset_collate();

}

public function run() {

    $table_name = $this->table_prefix . 'desks';


    $sql = "CREATE TABLE IF NOT EXISTS $table_name ( 
    some_id int(11) NOT NULL AUTO_INCREMENT,
    some_title VARCHAR(50) NOT NULL,
    PRIMARY KEY  (desk_id)
    ) $this->charset_collate;";

    dbDelta($sql);

}

}
1
powercat

Dies ist möglicherweise eine ziemlich komplizierte Frage, daher kann es sein, dass meine Antwort nicht streng genug ist, aber dies sollte Ihnen einen guten Einstieg beim Erstellen und Löschen von Tabellen ermöglichen.

Fügen Sie die folgenden Zeilen in die _construct () - Funktion Ihres Plugins von class_my_plugin.php ein:

if (is_admin()){
    //manage the the database tables when registering or deactivating
    register_activation_hook($loc, array($this, 'your_plugin_installation'));
    register_deactivation_hook($loc, array($this, 'your_plugin_unset'));
    register_uninstall_hook ($loc, 'your_plugin_uninstall');
}

Fügen Sie diese Funktionen in class_my_plugin.php in die Klasse selbst ein:

function your_plugin_installation() {
    create_data_tables();
}

function your_plugin_unset() {
    //do whatever here for users that deactivate the plugin
}

Fügen Sie außerhalb der Haupt-Plugin-Klasse die folgenden Funktionen hinzu:

function your_plugin_uninstall() {
    delete_db_tables();
    //add whatever else you need to do to clean up
}

function create_data_tables() {
    global $wpdb;
    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    $table_name = $this->table_prefix . 'desks';
    $charset_collate = $wpdb->get_charset_collate();
    if( $wpdb->get_var("SHOW TABLES LIKE '".$table_name."'") != $table_name ) {
       $sql = "CREATE TABLE IF NOT EXISTS ".$table_name;
       $sql .= " (some_id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, ";
       $sql .= "some_title varchar(31) NOT NULL DEFAULT '', ";
       $sql .= "PRIMARY KEY (some_id)) ".$charset_collate;
        dbDelta( $sql );
    }
    // repeat the if {} statement for each table you want to create
}

function delete_db_tables() {
    global $wpdb;
    $table_name = $this->table_prefix . 'desks';
    $wpdb->query( "DROP TABLE IF EXISTS ".$table_name );
    //delete your tables here
}

Beachten Sie, dass ich your_plugin_uninstall normalerweise außerhalb der Hauptklasse platziere, da Sie eine Fehlermeldung erhalten, wenn es sich innerhalb der Hauptklasse befindet, wenn ein Benutzer deinstalliert.

Auf diese Weise können Sie die Tabellen beim Installieren und Deinstallieren des Benutzers erstellen und löschen. Dies wird daher nur einmal vorkommen und die Funktionen werden ignoriert, es sei denn, die Installations- oder Deinstallations-Hooks werden ausgelöst.

Auf die Tabellen kann unter Verwendung der Standardfunktionalität WP leicht zugegriffen werden, z.

function so_get_some_title($id,) {
    global $wpdb;
    $id = (int) $id;
    $query = "SELECT some_id, some_title FROM ".$table_name." WHERE some_id = ".$id;
    $recs = $wpdb->get_results($query,ARRAY_A);
    }
    return $recs;
}

Ich hoffe, dass ich Ihre Frage richtig interpretiert habe und dass dies irgendwie hilft.

1
Clinton