web-dev-qa-db-fra.com

Créer un fichier plugin accessible via la réécriture d'URL?

Dans mon plugin WordPress, j'ai un fichier php qui génère des statistiques sur le blog et le sort sous forme de simple fichier texte. Pour accéder aux fonctions WordPress, j'ai ajouté ceci en haut du fichier:

define('WP_USE_THEMES', false);
require(dirname(__FILE__) . '/../../../wp-blog-header.php');

Maintenant, j'aimerais cacher l'URL réelle, car elle se trouve dans le répertoire wp-content/plugins et la remplacer par quelque chose de gentil et bref:

http://example.com/wp-content/plugin/data-fetcher/list-data.php

-> rewrite to http://example.com/list-data

J'ai ajouté ceci à .htaccess:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^list-data$ wp-content/plugins/data-fetcher/list-data.php [L]
</IfModule>

Le problème: lorsque j'accède à l'URL courte, je reçois une redirection 301 permanente déplacée avant de me retrouver sur la page. Cela signifie que l'URL wp-content/plugins/... est révélée dans le navigateur.

Je soupçonne que WordPress est en train d'initier cela. La règle de réécriture fonctionne très bien pour les images et les fichiers php simples (c’est-à-dire sans WP inclut/require).

Est-ce que mon hypothèse est correcte? Comment puis-je empêcher WordPress d'envoyer la redirection?

6
Mark

Marque,

Je déteste le dire, mais vous vous y prenez mal. PHP les fichiers de votre plug-in doivent _ accéder directement {jamais} _ de cette manière. Au lieu de cela, ils devraient être chargés à partir de WordPress, comme tout le reste.

Voici quelques chemins alternatifs que vous pourriez emprunter:

Crée une page d’administrateur qui affiche tes statistiques

Ceci est une page accessible à partir de WordPress par les utilisateurs authentifiés uniquement. Si vous utilisez la bonne API, cette page paraîtra très propre et affichera vos statistiques simples comme vous le souhaitez. Comme il se trouve dans WordPress pour commencer, vous aurez déjà accès à l'ensemble de l'API WP sans avoir à charger wp-blog-header.php directement.

Utilisez votre système existant, mais enregistrez la réécriture avec WordPress

Vous ne devriez jamais modifier votre fichier .htaccess directement. Ce fichier peut être modifié lorsque vous ajoutez de nouveaux plug-ins ou modifiez votre structure de lien permanent, ce qui signifie que vous perdrez vos personnalisations. Au lieu de cela, vous pouvez créer une réécriture personnalisée en effectuant un appel de fonction dans WordPress lui-même:

add_action( 'init', 'my_rewrite' );
function my_rewrite() {
    global $wp_rewrite;

    add_rewrite_rule('list-data/$', WP_PLUGIN_URL . '/data-fetcher/list-data.php', 'top');
    $wp_rewrite->flush_rules(true);  // This should really be done in a plugin activation
}

Cela ajoutera votre règle personnalisée en haut des règles de réécriture de WordPress et devrait ignorer toute autre correspondance de WordPress de redirection avec la regex.

Pour un excellent exemple de la façon dont vous pouvez implémenter ce type de réécriture simple dans un plug-in, consultez le tutoriel d'Ozh sur la redirection d'une jolie URL de connexion:

6
EAMann

Vous pouvez également définir une variable personnalisée dans WordPress lors de l'accès à votre URL. Vous pourrez ensuite vérifier plus tard cette variable et, si elle existe, faites ce que vous voulez.

Dans cet exemple, nous utiliserons wpse6891_stats comme notre variable.

// Register a URL that will set this variable to true
add_action( 'init', 'wpse6891_init' );
function wpse6891_init() {
    add_rewrite_rule( '^stats$', 'index.php?wpse6891_stats=true', 'top' );
}

// But WordPress has a whitelist of variables it allows, so we must put it on that list
add_action( 'query_vars', 'wpse6891_query_vars' );
function wpse6891_query_vars( $query_vars )
{
    $query_vars[] = 'wpse6891_stats';
    return $query_vars;
}

// If this is done, we can access it later
// This example checks very early in the process:
// if the variable is set, we include our page and stop execution after it
add_action( 'parse_request', 'wpse6891_parse_request' );
function wpse6891_parse_request( &$wp )
{
    if ( array_key_exists( 'wpse6891_stats', $wp->query_vars ) ) {
        include( dirname( __FILE__ ) . '/stats.php' );
        exit();
    }
}

Vous pouvez également faire la vérification plus tard, avec get_query_var( 'wpse6891_stats' ).

9
Jan Fabry