web-dev-qa-db-fra.com

Accéder à la base de données à partir d'un plug-in en dehors des crochets d'action

Je travaille sur un plug-in qui fournit un point de terminaison pour la gestion de l'autorisation OAuth2 sur un serveur distant, stocke certaines informations de ce serveur dans la base de données Wordpress et redirige l'utilisateur vers une page du site Wordpress.

Afin de stocker les données, le plug-in utilise la fonction wpdb, pratique que je comprends bien.

Par exemple.:

# 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
    )
);

La version actuelle du plugin est hébergée sur github ici .

Cependant, lorsque j'ai soumis le plugin au répertoire du plugin Wordpress, j'ai reçu cette réponse:

Appel de fichiers de chargement de base directement

Inclure wp-config.php, wp-blog-header.php, wp-load.php ou à peu près tout autre fichier de base WordPress que vous devez appeler directement via une inclusion n'est pas une bonne idée et nous ne pouvons pas approuver un plugin le fait sauf s'il a une très bonne raison de charger le (s) fichier (s). Il est sujet aux échecs car toutes les installations de WordPress n’ont pas exactement la même structure de fichier.

Les plugins incluent généralement wp-config.php ou wp-load.php afin d'accéder aux fonctions de base de WordPress, mais il existe de bien meilleures façons de le faire. Il est préférable de lier vos fonctions de traitement (celles qui ont besoin mais qui n’ont pas accès aux fonctions principales) dans un hook d’action, tel que "init" ou "admin_init".

C'est tout à fait sensé, mais je ne sais pas comment procéder.

Parce que le noeud final ne fait pas partie de l'interface d'administration Wordpress, il n'y a pas de crochets pour l'envelopper (je pense?).

J'ai essayé d'exiger la version "allégée" de wp-load, par exemple.

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

mais cela a généré une erreur Call to undefined function trailingslashit() lorsque j'exécute une requête de base de données en utilisant wpdb comme ci-dessus, ce qui semble être une limitation connue d'utilisation de la version SHORTINIT de wp-load.

Existe-t-il une autre méthode pour accéder à la base de données, qui devrait fonctionner dans ce contexte et qui serait acceptable pour les responsables de la maintenance du répertoire du plug-in?

1
Hugh Stimson

Amorcer WordPress à partir d’un accès direct au fichier PHP n’est pas une bonne idée en général, les responsables du référentiel ont raison. Il est assez simple d'ajouter un point de terminaison personnalisé à l'aide de Rewrite API , il n'y a donc aucune raison de ne pas le faire.

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
    }
} );

Maintenant, appuyez sur https://votresite.com/votre/custom/path/ WordPress se chargera et appellera votre code.

Une méthode encore plus simple consisterait à utiliser un paramètre $_GET.

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

Et puis appuyez sur https://votresite.com/?custom_action=1

Votre choix, selon que vous souhaitiez une URL Nice ou que vous soyez satisfait d’un paramètre GET moins intéressant.

1
soulseekah