web-dev-qa-db-fra.com

Comment afficher une page HTML brute (en contournant le thème WordPress, les scripts, etc.)

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.

LeadPages 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.

5
Ryan

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' );
1
Scott Nelle

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.

0
majick