Actualités WEB et WordPress, thèmes, plugins. Ici, nous partageons des conseils et les meilleures solutions de sites Web.

Règles de réécriture personnalisées et modèles de page dans WordPress

31

L’API WordPress Rewrite est une API solide en supposant que vous êtes à l’aise avec les expressions régulières.

Et, honnêtement, même si vous ne l’êtes pas, des outils comme PHP Live RegEx permettent de tester très facilement votre code avant de le déposer dans l’ add_rewrite_ruleappel API.

Règles de réécriture personnalisées et modèles de page dans WordPress

Cependant, il peut arriver que vous vous trouviez dans une situation où vous devez travailler avec des règles de réécriture et des modèles de page. Et lorsque c’est le cas, ce n’est pas toujours aussi simple que de faire un simple appel avec une seule expression régulière.

La raison? Si vous avez plusieurs pages utilisant le même modèle, la page ne sera pas toujours située dans le même index dans la requête qui s’exécute sur chaque page.

À cette fin, nous devons le gérer d’une manière légèrement différente que, disons, en accédant simplement à un index numérique d’informations dans la requête globale.

Réécrire les règles et les modèles de page

Supposons d’abord que nous ayons deux modèles (qui ne sont pas dans un ordre particulier) :

  1. template-alpha.php
  2. template-beta.php

Et puis disons que nous voulons configurer une URL personnalisée pour les pages dont chacune utilise l’un de ces modèles.

Cela se décomposerait en les étapes suivantes :

  1. Parcourez les messages de la requête,
  2. Stockez le message en utilisant le modèle dans son tableau respectif,
  3. Configurez les règles de réécriture pour chaque message ayant une requête donnée.

Pour cet exemple, je garderai les règles de réécriture assez simples. Après tout, les expressions régulières peuvent être assez difficiles à suivre, donc essayer de les suivre tout en traitant l’objet Query, plusieurs tableaux et la gestion des règles peut être un peu trop.

Cela dit, voici un exemple de code décomposé en fonction des étapes ci-dessus. À la fin de l’article, je partagerai un extrait qui regroupe tout dans quelques fonctions distinctes afin que vous puissiez voir comment tout cela s’emboîte.

Cela dit, voici comment gérer tout ce qui précède.

1 Ajout de règles de réécriture

Tout d’abord, nous devons lire certaines informations de l’objet de requête WordPress global pour trouver toutes les pages auxquelles des modèles sont appliqués.

Pour ce faire, nous pouvons lire les informations de l’objet de requête global dans une variable locale. Cela facilite l’évitement du reste du code s’il n’y a rien avec quoi travailler.

<?php 

$query = $this->query->query([
    'post_type' => 'page',
    'meta_key' => '_wp_page_template',
    'meta_value' => ['template-alpha.php', 'template-beta.php'],
]);

if (!$query) {
    return;
}

// More to come...

2 Stocker les informations pertinentes dans un tableau

En supposant qu’il existe des pages ayant des modèles, nous allons procéder au stockage de chacune des pages dans des tableaux afin de pouvoir gérer facilement leurs règles de réécriture respectives.

<?php

foreach ($query as $post) {
    $slug = get_page_template_slug($post->ID);

    if ('template-alpha.php' === $slug) {
        $this->alphaPages[] = $post;
    }

    if ('template-find-a-camp.php' === $slug) {
        $this->betaPages[] = $post;
    }
}

Notez que dans ce qui précède, je fais référence à un tableau global. Supposons que cela soit simplement initialisé en tant que tableau vide dans le constructeur de la classe.

3 Configurer les règles de réécriture

Maintenant que nous avons deux tableaux – un pour chaque modèle et les pages qui le contiennent – nous pouvons les parcourir et attribuer des règles de réécriture pour chacune de ces pages.

Par exemple, disons que pour un modèle, disons alpha, nous voulons configurer des règles de réécriture pour les États-Unis et les États.

Voici le code pourtemplate-alpha.php :

<?php

add_rewrite_tag('%country%', '([^&]+)');
add_rewrite_tag('%state%', '([^&]+)');

foreach ($this->alphaPages as $post) {
    add_rewrite_rule(
        '^'.$post->post_name.'/([^/]*)/([^/]*)/?',
        'index.php?page_id='.$post->ID.'&country=$matches[1]&state=$matches[2]',
        'top'
    );

    add_rewrite_rule(
        '^'.$post->post_name.'/([^/]*)/?',
        'index.php?page_id='.$post->ID.'&country=$matches[1]',
        'top'
    );
}

Et voici le code pour template-beta.php:

<?php

add_rewrite_tag('%acme-id%', '([^&]+)');

foreach ($this->betaPages as $post) {
    add_rewrite_rule(
        '^(.*)?/([A-Za-z0-9-]+-)(d+)/?',
        'index.php?page_id='.$post->ID.'&acme-id=$matches[3]',
        'top'
    );
}

Bien sûr, les expressions régulières utilisées dans le code ci-dessus sont simplement à des fins de démonstration. Le vôtre sera pour tout ce qui est nécessaire à votre projet.

4 Tous ensemble maintenant

Il est important de diviser toutes ces fonctionnalités en leurs propres méthodes afin qu’elles puissent toutes être facilement encapsulées et testées, si nécessaire.

À cette fin, voici à quoi ressemblera le code complet :

<?php

public function addRewriteRules()
{
    $query = $this->query->query([
        'post_type' => 'page',
        'meta_key' => '_wp_page_template',
        'meta_value' => ['template-alpha.php', 'template-beta.php'],
    ]);

    if (!$query) {
        return;
    }

    $this->setPageTypes($query);
    $this->setAlphaRewriteRules();
    $this->setBetaRewriteRules();
}

private function setPageTypes($query)
{
    foreach ($query as $post) {
        $slug = get_page_template_slug($post->ID);

        if ('template-alpha.php' === $slug) {
            $this->alphaPages[] = $post;
        }

        if ('template-find-a-camp.php' === $slug) {
            $this->betaPages[] = $post;
        }
    }
}

private function setAlphaRewriteRules()
{
    add_rewrite_tag('%country%', '([^&]+)');
    add_rewrite_tag('%state%', '([^&]+)');

    foreach ($this->alphaRules as $post) {
        add_rewrite_rule(
            '^'.$post->post_name.'/([^/]*)/([^/]*)/?',
            'index.php?page_id='.$post->ID.'&country=$matches[1]&state=$matches[2]',
            'top'
        );

        add_rewrite_rule(
            '^'.$post->post_name.'/([^/]*)/?',
            'index.php?page_id='.$post->ID.'&country=$matches[1]',
            'top'
        );
    }
}

private function setBetaRewriteRules()
{
    add_rewrite_tag('%acme-id%', '([^&]+)');

    foreach ($this->betaPages as $post) {
        add_rewrite_rule(
            '^(.*)?/([A-Za-z0-9-]+-)(d+)/?',
            'index.php?page_id='.$post->ID.'&acme-id=$matches[3]',
            'top'
        );
    }
}

Rappelez-vous, cependant; ceci est juste basé sur le code de démonstration partagé dans ce post. Lorsque vous travaillez sur votre projet, les expressions régulières, les modèles, etc. varient.

Source d’enregistrement: tommcfarlin.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More