Je suis un ingénieur en logiciel avec un site WordPress avec des centaines de pages, et cela fonctionne très bien.
Dans certains cas, cependant, j'aimerais pouvoir coder ma propre page avec non interaction avec/interférence du système WordPress (pas de thèmes, pas de styles, pas de javascript, etc.), mais toujours l'avoir situé sur ce même sous-domaine.
Comment définir https://example.com/special-page
pour afficher un fichier HTML chargé quelque part dans /wp-content/
?
Et en bonus, j'aimerais bien que cela fonctionne également avec un fichier PHP (qui générerait le code HTML).
Je voudrais faire ceci sans éditer manuellement le fichier .htaccess
.
Voici un exemple proche:
Le plugin LeadPages WordPress semble faire une variation de ce que j'espère. Il permet à un utilisateur de spécifier un "slug" (chemin relatif, tel que special-page
) et le contenu à afficher à cet endroit. Mais le contenu doit évidemment être hébergé sur LeadPages.net pour utiliser ce plugin.
Ce que j'espère, c'est héberger mon propre fichier HTML quelque part sur mon serveur (par exemple, dans un dossier accessible au public, tel que /wp-content/
), puis faire pointer un certain chemin relatif.
Regardez ce fichier .htaccess
que j'ai édité manuellement (et qui fonctionne comme je veux):
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
Options +FollowSymLinks
DirectoryIndex /wp-content/raw/book-sale.html [L]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteRule ^thanks$ /wp-content/raw/book-opt-in-thank-you.html [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
J'aurais bien aimé pouvoir spécifier depuis l'administrateur WordPress que la racine du site (/
) doit afficher le contenu de /wp-content/raw/book-sale.html
et que /thanks
doit afficher /wp-content/raw/book-opt-in-thank-you.html
(pour ne pas avoir à modifier le fichier .htaccess
directement.
Si vous souhaitez créer un thème enfant et y placer vos fichiers PHP, cette approche est relativement propre. Pour chaque fichier, créez une règle de réécriture dans laquelle vous spécifiez le chemin que vous souhaitez utiliser et le nom du fichier à charger. Dans l'exemple ci-dessous, /custom-path/
charge custom-file.php
à partir de la racine de votre répertoire de thèmes enfants et /custom-path-2/
charge custom-file-2.php
. N'oubliez pas de supprimer les permaliens après avoir ajouté des réécritures.
/*
* Set up a rewrite for each path which should load a file.
*/
function my_standalone_rewrites() {
add_rewrite_rule( '^custom-path/?', 'index.php?standalone=custom-file', 'top' );
add_rewrite_rule( '^custom-path-2/?', 'index.php?standalone=custom-file-2', 'top' );
}
add_action( 'init', 'my_standalone_rewrites' );
/*
* Make `standalone` available as a query var.
*/
function my_query_vars( $vars ) {
$vars[] = 'standalone';
return $vars;
}
add_filter( 'query_vars', 'my_query_vars' );
/*
* If `standalone` is set when parsing the main query, load the standalone file.
*/
function my_standalone_path( &$wp_query ) {
if ( $wp_query->is_main_query() && get_query_var( 'standalone', false ) ) {
// Load filename.php from your child theme root.
get_template_part( get_query_var( 'standalone' ) );
exit;
}
}
add_action( 'parse_query', 'my_standalone_path' );
Vous pouvez créer une page avec le slug souhaité et ajouter un champ personnalisé spécifiant le chemin d'accès HTML à la sortie (dans cet exemple, utilisez htmlfilepath
ou htmlurl
comme métakey):
add_action('wp','maybe_direct_html_output');
function maybe_direct_html_output() {
if (is_singular()) {
global $post;
$htmlfilepath = get_post_meta($post->ID,'htmlfilepath',true);
if ( ($htmlfilepath) && (file_exists($htmlfilepath)) ) {
echo file_get_contents($htmlfilepath); exit;
}
$htmlurl = get_post_meta($post->ID,'htmlurl',true);
if ($htmlurl) {
$html = wp_remote_get($html);
if (!is_wp_error($html)) {echo $html['body']; exit;}
}
}
}
Donc pas besoin de .htaccess
quand on le fait de cette façon ... J'ai juste remarqué que vous voulez utiliser wp-content
afin que vous puissiez simplement utiliser un chemin relatif et le simplifier (en utilisant htmlfile
metakey):
add_action('wp','maybe_direct_html_output');
function maybe_direct_html_output() {
if (is_singular()) {
global $post;
$htmlrelpath = get_post_meta($post->ID,'htmlfile',true);
if (!$htmlrelpath) {return;}
$htmlfilepath = WP_CONTENT_DIR.$htmlrelpath;
if (!file_exists($htmlfilepath)) {return;}
echo file_get_contents($htmlrelpath); exit;
}
}
En gardant à l'esprit que WP_CONTENT_DIR
ne comporte pas de barre oblique finale, vous devez donc entrer une valeur de champ personnalisé de chemin relatif pour la page, telle que /raw/book-sale.html
.