Je veux servir une page Wordpress spécifique pour plusieurs URL. En gros, je veux pointer toutes les URL d'un format spécifique sur une page connue:
/some-prefix-* => /target-page
Et en accédant à /some-prefix-and-here-something
, il devrait charger /target-page
.
Comment faire ça?
Remarque: je souhaite pas rediriger l'utilisateur, mais pouvoir servir une page existante à plusieurs URL.
Le .htaccess
ressemble à ceci:
# BEGIN s2Member GZIP exclusions
RewriteEngine On RewriteRule ^prefix-*$ some/path/to/directory-$1 [NC,L]
<IfModule rewrite_module>
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} (^|\?|&)s2member_file_download\=.+ [OR]
RewriteCond %{QUERY_STRING} (^|\?|&)no-gzip\=1
RewriteRule .* - [E=no-gzip:1]
</IfModule>
# END s2Member GZIP exclusions
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
DirectoryIndex index.php index.html
J'ai pensé qu'en ajoutant RewriteEngine On RewriteRule ^prefix-*$ some/path/to/directory-$1 [NC,L]
, je servirai /prefix-*
à partir de some/path/to/directory-$1
. Par exemple: lors de l'accès à example.com/prefix-foo
devrait être identique à example.com/some/path/to/directory-foo
(qui se résout en example.com/some/path/to/directory-foo/index.html
).
De plus, s’il existe déjà une page Wordpress portant le nom prefix-bar
, /prefix-bar
doit pas charger example.com/some/path/to/directory-bar/index.html
.
Vous pouvez utiliser template_include
, mais avant de vous connecter à ce filtre, vous devez suivre les étapes suivantes:
Créer un modèle de page. par exemple: page-target.php
<?php
/**
* Template Name: Page Target
*/
...
Interrogez manuellement le contenu de target-page
sur le modèle page-target.php
, car le $post
global fera référence à votre page some-prefix-*
.
Page Target
à votre /target-page
à partir des attributs de page.Ajoutez ensuite les éléments suivants à votre fichier functions.php
add_filter('template_include', function($template) {
global $post;
$prefix = 'some-prefix-'; // Your prefix
$prefixExist = strpos($post->post_name, $prefix) !== false;
if ($prefixExist) {
return locate_template('page-target.php'); //Your template
}
return $template;
});
Le filtre ci-dessus remplacera le modèle par page-target.php
si la condition est remplie, sinon la valeur par défaut
Je pense avoir trouvé un meilleur moyen de résoudre ce problème en utilisant add_rewrite_rule
function custom_rewrite_basic() {
$page_id = 123; //Your serve page id
add_rewrite_rule('^some-prefix-.*', 'index.php?page_id=' . $page_id, 'top');
}
add_action('init', 'custom_rewrite_basic');
IMPORTANT: N'oubliez pas de vider et de régénérer la base de données de règles de réécriture après avoir modifié les règles. À partir des écrans d’administration de WordPress, sélectionnez Paramètres -> Permaliens et cliquez simplement sur Enregistrer les modifications sans aucune modification.
Remarque que moteurs de recherche _ pourrait ne pas aimer plusieurs chemins d'accès au même contenu!
Ici, je suppose que vous voulez par exemple:
example.tld/some/path/to/painting-orange
example.tld/painting-blue
example.tld/painting-red
example.tld/painting-yellow
se comporter comme si c'était cette page:
example.tld/paintings
mais pas pour des chemins comme:
example.tld/painting-white/painting-brown/large
example.tld/painting-brown/small
La règle ici est de faire correspondre le préfixe à gauche de basename( $path )
.
Voici un petit hack avec le filtre request
, pour vérifier si le nom de la page actuelle est correctement préfixé:
<?php
/**
* Plugin Name: Wildcard Pages
*/
add_filter( 'request', function( $qv )
{
// Edit to your needs
$prefix = 'painting-';
$target = 'paintings';
// Check if the current page name is prefixed
if( isset( $qv['pagename'] )
&& $prefix === substr( basename( $qv['pagename'] ), 0, strlen( $prefix ) )
)
$qv['pagename'] = $target;
return $qv;
} );
Modifiez cela selon vos besoins. Créez ensuite le fichier de plugin /wp-content/plugins/wpse-wildcard-pages/wpse-wildcard-pages.php
et activez le plugin à partir du backend.
Nous pourrions également ajouter une vérification avec get_page_by_path()
sur la page cible, juste pour nous assurer qu'elle existe. Nous pourrions également vouloir limiter cela à certains types de publication.
Créez un hook pour init et wp_redirect lorsque le slug de la publication actuelle commence par votre préfixe.
function wp_init() {
global $post;
$slug = $post->post_name;
$prefix = 'foobar';
if (substr($slug, 0 strlen($prefix))==$prefix) {
wp_redirect(123); // your page id
}
}
add_action('init', 'wp_init');