web-dev-qa-db-fra.com

Comment ajouter une règle de réécriture pour une seule page?

Je voudrais ajouter une réécriture pour seulement certaines pages (pas toutes les pages) qui insérerait un slug de base dans le permalien. C'est une sorte de situation unique où nous connaissons tous les noms de page à l'avance et qu'ils ne changeront pas.

Par exemple:

sitename.com/pagetitle

à

sitename.com/service/pagetitle

J'essaie d'utiliser "add_rewrite_rule", mais je n'ai pas beaucoup de chance. Ci-dessous, une de mes itérations et j'en ai eu beaucoup. Toute orientation serait appréciée.

Je comprends qu’il existe un plugin qui vous permet de changer totalement vos liens permanents de votre publication et de vos pages en tout ce que vous voulez, mais j’espérais pouvoir le faire moi-même par programmation.

add_action( 'init', 'page_change' );
function page_change()
{
    add_rewrite_rule(
        '^pagenamehere/?',
        'index.php?post_type=service',
        'top' );
}

Code mis à jour ci-dessous:

function new_rewrite_rule()
{
    add_rewrite_rule('^services/statictitle$', 'index.php?pagename=oldname', 'top');
}
add_action('init', 'new_rewrite_rule');

Donc, ce code permet d’accéder au lien dans "services/statut". Cependant, l'ancien lien est toujours accessible. Donc, je ne suis pas sûr d’agir de la bonne façon. Toute aide serait la bienvenue.

Merci.

Mettre à jour

Voici une autre solution qui, à mon avis, conviendrait peut-être mieux. Bien que, cela cible toutes les pages. Y aurait-il un moyen de simplement cibler le nom de la page ou l'identifiant?

function custom_page_rules() {
  global $wp_rewrite;
  $wp_rewrite->page_structure = $wp_rewrite->root . 'services/%pagename%'; 
}
1
Work-Together2013

Hypothèse: Vous utilisez Apache comme serveur Web.

Si vous connaissez déjà les slugs de la page et qu'ils ne changeront pas, ajoutez-les simplement à votre fichier .htaccess. Ce sera beaucoup plus rapide et moins compliqué.

Collez les lignes Redirect suivantes en haut de votre fichier .htaccess.

Redirect 301 /pagetitle/ /service/pagetitle/
Redirect 301 /pagetitle2/ /another-dir/pagetitle2/


# BEGIN WordPress
<IfModule mod_rewrite.c>
....
2
cowgill

S'il vous plaît jeter un oeil sur le code ci-dessous:

add_rewrite_rule( 'services/([^/]*)/?','index.php?post_type='.$post_type.'&name=$matches[1]','top');

Pour une meilleure compréhension de l’API de réécriture, veuillez vérifier le WP_REWRITE_API et Construction d’URL personnalisées dans WordPress

En attente de vos commentaires!

J'espère que cela fonctionnera pour vous!

0
Syed Fakhar Abbas

Cette approche pourrait être un peu plus flexible.

$basePageRewrite->add_rule( 'service', 'page-title' );

À la fin de la définition de la classe, vous devriez pouvoir ajouter base et page. Les réécritures d'URL seront construites dynamiquement pour les règles que vous ajoutez. Si une page est appelée directement, elle sera redirigée vers le $base/$pageTitle.

<?php

if ( ! class_exists( 'BasePageRewrite' ) ):

    class BasePageRewrite {

        const ENDPOINT_QUERY_PARAM_REDIRECT = '____base_page_rewrite__redirect';

        private static $_hash_map = array ();

        /**
         * BasePageRewrite constructor.
         */
        public function __construct() {
            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 rewrite rules here.
         *
         * @param string $base Base of URL
         * @param string $page Slug of page
         */
        public function add_rule( $base, $page ) {
            if ( ! array_key_exists( $base, static::$_hash_map ) ) {
                static::$_hash_map[ $base ] = array ();
            }

            if ( ! array_key_exists( $page, static::$_hash_map[ $base ] ) ) {
                static::$_hash_map[ $base ][ $page ] = 'name';
            }
        }

        /**
         * Add our custom query arg to check in `parse_request`.
         *
         * @param $vars
         *
         * @return array
         */
        public function add_query_vars( $vars ) {
            $vars[] = static::ENDPOINT_QUERY_PARAM_REDIRECT;

            return $vars;
        }

        /**
         * Add rewrite rules.
         *
         *      page --> base/page
         *
         *      base/page === page
         *
         * Note:
         *
         *      `flush_rewrite_rules()` is only added for testing.
         */
        public function add_endpoint() {

            foreach ( static::$_hash_map as $base => $pages ) {

                foreach ( $pages as $pageName => $param ) {

                    // page --> service/page

                    add_rewrite_rule( "^$pageName/", 'index.php?' . static::ENDPOINT_QUERY_PARAM_REDIRECT . "=/$base/$pageName/", 'top' );

                    // service/page === page

                    add_rewrite_rule( "^$base/$pageName/", "index.php?$param=$pageName", 'top' );
                }
            }

            //////////////////////////////////
            flush_rewrite_rules( true );  //// <---------- REMOVE THIS WHEN DONE TESTING
            //////////////////////////////////
        }

        /**
         * Redirect regular page to base/page,
         *
         * @param $wp_query
         */
        public function sniff_requests( $wp_query ) {

            global $wp;

            if ( isset( $wp->query_vars[ static::ENDPOINT_QUERY_PARAM_REDIRECT ] ) ) {

                // page --> service/page

                $redirect = $wp->query_vars[ static::ENDPOINT_QUERY_PARAM_REDIRECT ];
                $new_url  = site_url( $redirect );
                wp_redirect( $new_url, 301 );
                die();
            }
        }
    }

    // Create the class
    $basePageRewrite = new BasePageRewrite();

    // Add individual rules
    $basePageRewrite->add_rule( 'service', 'page-title' );
    $basePageRewrite->add_rule( 'another-service', 'another-page-title' );

endif; // BasePageRewrite
0
jgraup

L’autre partie de ce que vous devez faire ici, c’est changer le permalien de la page avec le filtre page_link ou le filtre the_permalink.

voici une question miroir pour votre propre - https://stackoverflow.com/questions/27432586/wordpress-page-link-filter

Cela fera les redirections parce que wordpress redirige vers l'adresse canonique lorsque l'URL utilisée est différente de l'adresse canonique, et que l'URL canonique des publications et des pages est leur lien permanent. En prime, tout le reste pointe vers la bonne URL, sans aucune redirection.

0
Mark Kaplun

Je sais que vous avez spécifiquement demandé des règles de réécriture, mais qu'en est-il de la redirection? Vous pouvez obtenir le même résultat final et la même expérience utilisateur. Vous pouvez changer la hiérarchie de vos pages si vous voulez pour que

sitename.com/service/pagetitle

est disponible et

sitename.com/pagetitle

est quelque chose qui est redirigé vers la première adresse.

Cela saute votre .htaccess pour des raisons de simplicité. On dirait que vous voulez réellement apprendre à faire cela en tant que règle de réécriture, ce qui est cool, mais si vous décidez que cela est difficile et que vous voulez juste une solution qui fonctionne, que vous appreniez ceci ou non, il existe plusieurs les plugins de redirection qui peuvent gérer cela pour vous. Mon favori personnel s'intitule "Redirection". Il peut gérer les expressions rationnelles (avec un peu de pratique). Il compte également le nombre de fois qu'une règle de redirection est utilisée afin que vous puissiez surveiller si vous avez même besoin de la garder en place.

Enfin, j'ai mentionné au début que vous pouvez modifier la hiérarchie de vos pages pour refléter l'apparence de vos URL et que vous devriez probablement le faire de toute façon si vous ne l'avez pas déjà fait. Sinon, vous pourriez vous retrouver avec une situation de redirection infinie. (ce qui est également quelque chose à garder à l'esprit si vous choisissez la route du plug-in de redirection, ainsi que je l'ai déjà vu facilement avec des utilisateurs qui utilisent beaucoup de redirections et qui en créent une nouvelle qui entre en conflit avec celle qui existe déjà)

TLDR: réponse en dehors de la boîte. il existe un ou plusieurs plugins pouvant réaliser cette fonction sans réécriture.

0
KnightHawk

J'ai rencontré une situation très similaire à ce qui semble être vos attentes.

Nous avons une page parent "Nos services" (domain.com/services/) ...

Nous avons également plusieurs pages enfants représentant chaque service fourni dans la page parent "Nos services". Par exemple: "Web Design" (domain.com/services/web-design/)

Maintenant, nous avons aussi un "portefeuille". Au lieu de consacrer une section entière de niveau supérieur sur le site Web au portefeuille, nous avons décidé de la placer sous la section principale "services" (domain.com/services/).

Ainsi, par exemple, la partie principale de notre portefeuille se trouvait ici: domain.com/services/portfolio/

Le portefeuille est son propre type de publication personnalisé, contenant des éléments individuels du portefeuille.

Ainsi, l'URL d'un élément de portefeuille spécifique ressemblait à ceci: domain.com/services/portfolio/sample-portfolio-item/.

Lorsque vous enregistrez votre type d'article personnalisé, il existe un paramètre configurable pour rewrite['slug']. C'est ici que vous spécifieriez $args['rewrite']['slug'] = 'services/portfolio';

Bien sûr, chaque fois que vous apportez des modifications aux règles de réécriture d'URL, vous devez vider les règles de réécriture. Par programme, vous utiliseriez éventuellement flush_rewrite_rules(); pour des tests rapides, vous pourrez toujours accéder à Dashboard -> Settings -> Permalinks car cela effacera automatiquement les règles de réécriture, simplement en visitant cette page d’administrateur.

J'espère que vous (ou quelqu'un) trouverez l'information contenue dans ma réponse utile et pertinente.

0
Michael Ecklund