J'ai un site WordPress installé à la racine du serveur Web: /
Je veux servir un fichier texte à partir d'ici: /.hiddendir/secondlevel/textfile
J'ai créé ce fichier et répertoire sur le serveur à ../wwwroot/.hiddendir/secondlevel/textfile
Lorsque j'essaie d'accéder, je reçois un 404 de wordpress.
La raison en est d’ajouter un fichier de "vérification" requis pour un service que je veux utiliser, il se base sur une URL pour vérifier que vous êtes le propriétaire du site Web (yahoo et google le font pour leurs divers services).
J'ai essayé d'ajouter le fichier texte à la médiathèque, mais l'URL ne peut pas être personnalisé. Je cherche un plugin, mais je ne peux pas en trouver un.
Vous pouvez utiliser add_rewrite_rule
pour créer un nouveau point de terminaison tel que http://example.com/api/files/xyz
, qui traite la demande et en rend le contenu. votre serveur. Cela vous permet de masquer l’origine du fichier mais d’accéder toujours à son contenu.
add_rewrite_rule
vous requiert flush_rewrite_rules
mais vous devez le faire seulement une fois à chaque fois vous apportez une modification à vos réécritures. Donc, essentiellement, laissez cette ligne à tester, mais supprimez-la pendant la production.
Une fois que vous avez déterminé que l’URL demande un fichier et quel fichier vous souhaitez présenter, effectuez une vérification rapide is_readable
pour vous assurer que le file exists
et vous avez accès au contenu.
À ce stade, vous pouvez écrire des en-têtes décrivant le fichier, lire le contenu et écrire dans le tampon de sortie avec readfile
.
Vous pouvez déposer ceci dans votre functions.php
ou dans un plugin pour autoriser l'accès quel que soit le thème.
Les descriptions sont dans les commentaires de code.
<?php
if ( ! class_exists( 'FileEndpoint' ) ):
class FileEndpoint {
const ENDPOINT_QUERY_NAME = 'api/files';
const ENDPOINT_QUERY_PARAM = '__api_files';
// WordPress hooks
public function init() {
add_filter( 'query_vars', array ( $this, 'add_query_vars' ), 0 );
add_action( 'parse_request', array ( $this, 'sniff_requests' ), 0 );
add_action( 'init', array ( $this, 'add_endpoint' ), 0 );
}
// Add public query vars
public function add_query_vars( $vars ) {
// add all the things we know we'll use
$vars[] = static::ENDPOINT_QUERY_PARAM;
$vars[] = 'file';
return $vars;
}
// Add API Endpoint
public function add_endpoint() {
add_rewrite_rule( '^' . static::ENDPOINT_QUERY_NAME . '/([^/]*)/?', 'index.php?' . static::ENDPOINT_QUERY_PARAM . '=1&file=$matches[1]', 'top' );
//////////////////////////////////
flush_rewrite_rules( false ); //// <---------- REMOVE THIS WHEN DONE
//////////////////////////////////
}
// Sniff Requests
public function sniff_requests( $wp_query ) {
global $wp;
if ( isset(
$wp->query_vars[ static::ENDPOINT_QUERY_PARAM ],
$wp->query_vars[ 'file' ] ) ) {
$this->handle_file_request(); // handle it
}
}
// Handle Requests
protected function handle_file_request() {
global $wp;
$file = $wp->query_vars[ 'file' ];
$filepath = '';
switch ( $file ) {
// example.com/api/files/xyz
case 'xyz':
$filepath = __DIR__ . '/filename.txt';
break;
}
if ( ! empty( $filepath ) ) {
// Make sure this is an accessible file
// If we can't read it throw an Error
if ( ! is_readable( $filepath ) ) {
$err = new WP_Error( "Forbidden", "Access is not allowed for this request.", 403 );
wp_die( $err->get_error_message(), $err->get_error_code() );
}
// We can read it, so let's render it
$this->serve_file( $filepath );
}
// Nothing happened, just give some feedback
$err = new WP_Error( "Bad Request", "Invalid Request.", 400 );
wp_die( $err->get_error_message(), $err->get_error_code() );
}
// Output the file
protected function serve_file( $filepath, $force_download = false ) {
if ( ! empty ( $contents ) ) {
// Write some headers
header( "Cache-control: private" );
if ( $force_download ) {
// Allow a forced download
header( "Content-type: application/force-download" );
header( "Content-disposition: attachment; filename=\"filename.txt\"" );
}
header( "Content-transfer-encoding: binary\n" );
header( "Content-Length: " . filesize( $filepath ) );
// render the contents of the file
readfile( $filepath );
// kill the request. Nothing else to do now.
exit;
}
// nothing happened, :(
return false;
}
}
$wpFileEndpoint = new FileEndpoint();
$wpFileEndpoint->init();
endif; // FileEndpoint