web-dev-qa-db-fra.com

Accéder à la même page à partir de plusieurs URL (caractère générique)

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.

6
Ionică Bizău

Vous pouvez utiliser template_include , mais avant de vous connecter à ce filtre, vous devez suivre les étapes suivantes:

  1. Créer un modèle de page. par exemple: page-target.php

    <?php
    /**
     * Template Name: Page Target
     */
    ...
    
  2. 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-*.

  3. (Facultatif): Modifiez et appliquez le modèle de page 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

Modifier:

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.

9
Rahil Wazir

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.

4
birgire

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');
0
Fleuv