webentwicklung-frage-antwort-db.com.de

Zugriff auf die Datenbank von einem Plugin außerhalb von Aktions-Hooks

Ich arbeite an einem Plugin, das einen Endpunkt für die Behandlung der OAuth2-Autorisierung für einen Remoteserver bereitstellt, bei erfolgreicher Autorisierung einige Informationen von diesem Server in der Wordpress-Datenbank speichert und den Benutzer auf eine Seite auf der Wordpress-Site umleitet.

Um die Daten zu speichern, benutzt das Plugin die Funktion wpdb, die ich als empfohlene Vorgehensweise verstehe.

Z.B.:

# Require wp-load.php in order to access $wpdb.
require_once(dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'wp-load.php');

global $wpdb;
$table_name = $wpdb->prefix . 'placespeak';
$query_array = [$app_id];
$client_info = $wpdb->get_row(
    $wpdb->prepare(
        "SELECT * FROM " . $table_name . " WHERE id = %d",
        $query_array
    )
);

Die aktuelle Version des Plugins ist hier auf github gehostet .

Als ich das Plugin jedoch an das Wordpress-Plugin-Verzeichnis übermittelte, erhielt ich folgende Antwort:

Core-Ladedateien direkt aufrufen

Das Einfügen von wp-config.php, wp-blog-header.php, wp-load.php oder so ziemlich jeder anderen WordPress-Kerndatei, die Sie direkt über ein Include aufrufen müssen, ist keine gute Idee, und wir können ein Plugin nicht genehmigen tut dies, es sei denn, es gibt einen sehr guten Grund, die Datei (en) zu laden. Es ist fehleranfällig, da nicht alle WordPress-Installationen exakt dieselbe Dateistruktur haben.

Normalerweise enthalten Plugins wp-config.php oder wp-load.php, um Zugriff auf die wichtigsten WordPress-Funktionen zu erhalten. Es gibt jedoch viel bessere Möglichkeiten, dies zu tun. Am besten binden Sie Ihre Verarbeitungsfunktionen (die Funktionen, die Kernfunktionen benötigen, aber keinen Zugriff darauf haben) in einen Aktions-Hook wie "init" oder "admin_init".

Das ist durchaus sinnvoll, aber ich weiß nicht, wie ich vorgehen soll.

Da der Endpunkt nicht Teil der Wordpress-Administrationsoberfläche ist, gibt es keine Hooks, mit denen er umschlossen werden kann (glaube ich?).

Ich habe versucht, die "abgespeckte" Version von wp-load zu benötigen, z.

define( 'SHORTINIT', true );
require_once(dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'wp-load.php');

dies führte jedoch zu einem Call to undefined function trailingslashit()-Fehler, wenn ich eine Datenbankabfrage mit wpdb wie oben ausgeführt habe. Dies scheint eine bekannte Einschränkung der Verwendung der SHORTINIT-Version von wp-load zu sein.

Gibt es eine andere Methode für den Zugriff auf die Datenbank, die in diesem Zusammenhang funktionieren sollte und die von den Betreuern des Plug-in-Verzeichnisses akzeptiert wird?

1
Hugh Stimson

Das Booten von WordPress von einem direkten PHP -Dateitreffer ist im Allgemeinen keine gute Idee, die Repository-Betreuer haben Recht. Es ist ziemlich einfach, einen benutzerdefinierten Endpunkt mit der Rewrite-API hinzuzufügen. Es gibt also keinen Grund, warum Sie dies nicht tun sollten.

add_action( 'init', function() {
    /** Add a custom path and set a custom query argument. */
    add_rewrite_rule( '^your/custom/path/?$', 'index.php?custom_action=1', 'top' );
} );

add_filter( 'query_vars', function( $query_vars ) {
    /** Make sure WordPress knows about this custom action. */
    $query_vars []= 'custom_action';
    return $query_vars;
} );

add_action( 'wp', function() {
    /** This is an call for our custom action. */
    if ( get_query_var( 'custom_action' ) ) {
        // your code here
    }
} );

Nun drücken Sie https://yoursite.com/your/custom/path/ WordPress lädt und ruft Ihren Code auf.

Eine noch einfachere Möglichkeit wäre die Verwendung eines $_GET-Parameters.

add_action( 'init', function() {
    if ( !empty( $_GET['custom_action'] ) ) {
        // your code here
    }
} );

Und dann drücke https://yoursite.com/?custom_action=1

Ihre Wahl, je nachdem, ob Sie eine Nice-URL wünschen oder mit einem weniger schönen GET-Parameter zufrieden sind.

1
soulseekah