Il s'agit du forum d'assistance technique de WPML, le plug-in multilingue pour WordPress.

Il est accessible à tous, toutefois seuls les clients de WPML peuvent y publier leurs messages. L'équipe de WPML répond aux messages du forum 6 jours sur 7, 22 heures sur 24.

Aucun de nos assistants n'est disponible aujourd'hui sur le forum French. Veuillez créer un ticket, et nous nous le traiterons dès notre prochaine connexion. Merci de votre compréhension.

Mots-clés : 

This topic contains 13 réponses, has 2 participants.

Last updated by Yvette il y a 1 an et 5 mois.

Assigned support staff: Yvette.

Auteur Messages
mars 9, 2018 à 8:34 #1541482

Atypic

Bonjour,

Un de nos clients souhaiterait que l'on réécrive certaines URLS (rewrite rules) de son site, mais nous n'y parvenons pas avec WPML.

Le site est un WordPress classique en 3 langues (fr, en, nl) mais son usage est un peu particulier pour la page 'immeuble'. Pour cette page, nous récupérons le contenu en faisant une requête une API externe. Le contenu n'est donc pas renseigné via the_content().

Les urls sont actuellement comme ceci:
FR - hidden link
EN - hidden link
NL - hidden link

Le client voudrait quelque chose comme ceci:
FR - hidden link
EN - hidden link
NL - hidden link

Nous avons donc utilisé ceci:

function _init_rewriting_rules() {

    add_rewrite_tag('%estate_id%', '([^&]+)');
    add_rewrite_tag('%estate_slug%', '([^&]+)');

    add_rewrite_rule('^immeuble/([^/]+)-([^/]+)/?', 'index.php?pagename=immeuble&estate_slug=$matches[1]&estate_id=$matches[2]&lang=fr', 'top');
}

add_action('init', '_init_rewriting_rules');

Ce qui nous donne quelque chose comme ceci:
hidden link

Cela marche pour la version FR! Par contre, pour les versions EN et NL, nous n'y arrivons pas.

Nous avons essayé ceci pour l'anglais:

add_rewrite_rule('^property/([^/]+)-([^/]+)/?', 'index.php?pagename=immeuble&estate_slug=$matches[1]&estate_id=$matches[2]&lang=en', 'top');

Et

add_rewrite_rule('^en/property/([^/]+)-([^/]+)/?', 'index.php?pagename=immeuble&estate_slug=$matches[1]&estate_id=$matches[2]&lang=en', 'top');

Et

add_rewrite_rule('^property/([^/]+)-([^/]+)/?', 'index.php?pagename=property&estate_slug=$matches[1]&estate_id=$matches[2]&lang=en', 'top');

Et encore

add_rewrite_rule('^en/property/([^/]+)-([^/]+)/?', 'index.php?pagename=property&estate_slug=$matches[1]&estate_id=$matches[2]&lang=en', 'top');

Mais rien ne fonctionne...

Pouvez-vous nous aider ? Comment faire une réécriture URL pour les autres langues ?

Cordialement,
Jérôme

mars 12, 2018 à 12:54 #1543506

Yvette
Supporter

Languages: Anglais (English ) Espagnol (Español )

Timezone: Europe/Madrid (GMT+02:00)

Bonjour

J'ai enquêté là-dessus et j'ai trouvé qu'il y avait un bug connu avec WPML ne respectant pas les règles de réécriture personnalisées.
 
Ce problème a été soulevé dans ce ticket:
  https://wpml.org/forums/topic/add_rewrite_rule-is-redirecting/

Vous pouvez essayer d'implémenter la solution de contournement recommandée en incluant ce code dans votre functions.php

add_filter('wpml_is_redirected', 'ret_fls');
function ret_fls($q){
    if(strpos($q, 'immeuble')){
        return false;
    }
};

où "immeueble" est la valeur de l'argument slug de réécriture pour la définition du type de message personnalisé comme suit


'rewrite' => array ('slug' => 'immueble'),

S'il vous plaît essayez ceci et laissez-moi savoir si cela fonctionne pour vous?

mars 13, 2018 à 1:03 #1544726

Atypic

Bonjour Yvette,

Merci pour votre aide, mais nous ne parvenons pas à résoudre le problème.

Essayons de clarifier un peu la situation...

A) Tout d'abord, pourriez-vous nous dire quelle est la bonne réécriture url ?

1) Réécriture sans le préfix langue "en/" et appel de la pagename immeuble

add_rewrite_rule('^property/([^/]+)-([^/]+)/?', 'index.php?pagename=immeuble&estate_slug=$matches[1]&estate_id=$matches[2]&lang=en', 'top');

2) Réécriture avec le préfix langue "en/" et appel de la pagename immeuble

add_rewrite_rule('^en/property/([^/]+)-([^/]+)/?', 'index.php?pagename=immeuble&estate_slug=$matches[1]&estate_id=$matches[2]&lang=en', 'top');

3) Réécriture sans le préfix langue "en/" et appel de la pagename property

add_rewrite_rule('^property/([^/]+)-([^/]+)/?', 'index.php?pagename=property&estate_slug=$matches[1]&estate_id=$matches[2]&lang=en', 'top');

4) Réécriture avec le préfix langue "en/" et appel de la pagename property

add_rewrite_rule('^en/property/([^/]+)-([^/]+)/?', 'index.php?pagename=property&estate_slug=$matches[1]&estate_id=$matches[2]&lang=en', 'top');

B) Ensuite, nous n'utilisons pas:

'rewrite' => array ('slug' => 'immueble'),

Car dans notre cas, "Immeuble" est une page (dont le slug en FR est 'immeuble', en EN 'property' et en NL 'gebow').

Concernant le code:

if (strpos($q, 'immeuble')) { ... }

Nous supposons donc que 'immeuble' correspond au slug de la page et qu'il faut mettre en fait:

if (strpos($q, 'immeuble') || strpos($q, 'property') || strpos($q, 'gebouw')) { ... }

Est-ce bien cela ?

C) En recherchant 'wpml_is_redirected' dans /wp-content/plugins nous ne trouvons aucune référence à wpml_is_redirected. A partir de quelle version est-ce que cela a été implémenté? Notre client dispose de WPML Multilingual CMS Version 3.4.1

mars 13, 2018 à 2:32 #1544859

Yvette
Supporter

Languages: Anglais (English ) Espagnol (Español )

Timezone: Europe/Madrid (GMT+02:00)

Sacre coeur! C'est une très très vieille version. Notre version actuelle est 3.9.3.
Tout soutien que je peux fournir ne sera pertinent que pour la dernière version de nos plugins.

Je ne pouvais pas dire quand l'appel a été lancé, mais je peux confirmer qu'il fait partie de notre version actuelle.

Y a-t-il une raison pour laquelle ce client n'utilise pas la dernière version? Des changements importants ont été apportés depuis leur publication.

- l'information technique de l'installation
Se il vous plaît suivez les instructions : https://wpml.org/fr/faq/comment-fournir-des-informations-de-debogage-pour-une-assistance-plus-rapide/

mars 14, 2018 à 8:37 #1545545

Atypic

Bonjour Yvette,

Oui c'est une très vieille version, effectivement!

La raison vient du fait que tous les clients ne prennent pas toujours de pack de maintenance/mise à jour.

Nous venons de mettre à jour WPML ainsi que ses plugins (WPML Media, Sticky, String Translation, Translation Management) vers leur dernière version.

Avez-vous maintenant assez d'information pour répondre aux questions de notre précédent post?

Jérôme

mars 14, 2018 à 9:32 #1545597

Yvette
Supporter

Languages: Anglais (English ) Espagnol (Español )

Timezone: Europe/Madrid (GMT+02:00)

Bonjour

Merci d'avoir pris la peine de mettre les plugins à leur dernière version.

J'ai consulté une équipe de soutien de niveau supérieur et ils m'ont dit que la meilleure chose à faire serait d'obtenir un instantané de votre site et de leur transmettre votre cas.

Cela est dû au problème existant que j'ai mentionné précédemment dans lequel le code CMS affecte certaines redirections intentionnelles (comme votre cas).

Pouvez-vous m'envoyer un instantané de votre système en utilisant le plugin Duplicator? Si votre site est très volumineux, vous pouvez utiliser des filtres pour éliminer le répertoire wp-uploads.

J'ouvre l'espace privé pour que vous puissiez répondre avec un lien téléchargeable vers une plateforme où vous avez déjà téléchargé archive.zip et le fichier installer.php.

L'espace privé est uniquement visible entre vous et l'équipe de support WPML.
Merci
PS. Veuillez inclure tous les détails pertinents dans lesquels nous pouvons trouver la définition / l'enregistrement post-type et votre code de redirection.

mars 16, 2018 à 7:23 #1547728

Yvette
Supporter

Languages: Anglais (English ) Espagnol (Español )

Timezone: Europe/Madrid (GMT+02:00)

Bonjour

Je comprends maintenant que vous essayez de réécrire dynaically un slugs ** page ** et non des slugs de type "post" pour une page d'archive. C'est pourquoi le code fourni n'a pas fonctionné.

En outre, vous essayez d'ajouter le nom de la page avec plus d'informations et de ne pas réécrire la base de permalink.

En ce qui concerne le code suivant.

function get_custom_rewrite_rules () {
    retour tableau (
        'fr' => array (
            'immeuble' => tableau (
                'rewrite_rule' => '^ immeuble / ([^ /] +) - ([^ /] +)',
                'rewrite_index' => 'index.php? pagename = immeuble & estate_custom_url = $ correspond [1] & estate_id = $ correspond [2] & lang = fr',
                'friendly_url' => 'immeuble / {custom_url} - {id}',
            ),
// 'lot' => tableau (
// 'rewrite_rule' => '^ lot / ([^ /] +) - ([^ /] +)',
// 'rewrite_index' => 'index.php? pagename = lot & lot_custom_url = $ correspond [1] & lot_id = $ correspond [2] & lang = fr',
// 'friendly_url' => 'lot / {custom_url} - {id}',
//)
        ),
        'en' => array (
            'immeuble' => tableau (
                'rewrite_rule' => '^ fr / property / ([^ /] +) - ([^ /] +)',
                'rewrite_index' => 'index.php? pagename = immeuble & estate_custom_url = $ correspond [1] & estate_id = $ correspond à [2] & lang = en',
                'friendly_url' => 'en / propriété / {custom_url} - {id}',
            )
        ),
        'nl' => tableau (
            'immeuble' => tableau (
                'rewrite_rule' => '^ gebouw / ([^ /] +) - ([^ /] +)',
                'rewrite_index' => 'index.php? pagename = immeuble & estate_custom_url = $ correspond [1] & estate_id = $ correspond à [2] & lang = nl',
                'friendly_url' => 'gebouw / {custom_url} - {id}',
            )
        ),
    )
}

Avez-vous débogué votre code pour confirmer que vous correspondez correctement à la langue? i.e. êtes-vous sûr que vous trouvez la règle correcte dans cette fonction?

function get_custom_url ($ builing_estate, $ rewrite_key, $ lang = ICL_LANGUAGE_CODE) {
    $ rule = get_custom_rewrite_rule ($ rewrite_key, $ lang);

    $ replace = array (
        '{custom_url}' => $ builing_estate-> CustomUrl,
        '{id}' => $ builing_estate-> EstateID
    )

    return get_bloginfo ('url'). '/'. strtr ($ rule ['friendly_url'], $ replace). '/';
}

est la valeur de

$rule 

correcte?

*Si c'est le cas*, il se peut que votre approche ne fonctionne pas avec les réécrits multilingues en raison des diverses actions / filtres introduits par WPML.

Dans ce cas, vous pourriez considérer l'approche décrite dans la réponse ici:
https://wordpress.stackexchange.com/questions/194273/change-title-tag-dynamically-or-within-plugin

Il utilise le filtre

pre_get_document_title

qui n'interfère pas avec les réécritures de bases permalink que WPML pourrait faire et pourrait être une solution plus propre.

Si la valeur de

$rule

n'est PAS correcte, cela signifie que vous ne correspondez pas au code de langue correct avec la clé ICL_LANGUAGE_CODE. Je suggère que vous utilisiez l'appel WPML suivant à sa place pour déterminer la langue active
https://wpml.org/wpml-hook/wpml_current_language/

Enfin, je vois que votre thème est un thème personnalisé construit à partir d'un thème Twenty Thrirteen standard. Le type de support que nous pouvons fournir pour les thèmes personnalisés est très limité, malheureusement il y aura un moment où je dois vous diriger vers un entrepreneur selon notre politique de support (voir image)
https://wpml.org/fr/purchase/politique-dassistance/

mars 16, 2018 à 8:57 #1547794

Atypic

Bonjour Yvette,

Merci pour votre réponse.

Je vois que la première partie du code que vous avez collez n'est pas tout à fait correcte. Je l'ai corrigé et simplifié ici (j'ai retiré le commentaire et le NL pour nous consacrer juste sur le EN):

function get_custom_rewrite_rules() {
    return array(
        'fr' => array(
            'immeuble' => array(
                'rewrite_rule' => '^immeuble/([^/]+)-([^/]+)',
                'rewrite_index' => 'index.php?pagename=immeuble&estate_custom_url=$matches[1]&estate_id=$matches[2]&lang=fr',
                'friendly_url' => 'immeuble/{custom_url}-{id}',
            ),
        ),
        'en' => array(
            'immeuble' => array(
                'rewrite_rule' => '^en/property/([^/]+)-([^/]+)',
                'rewrite_index' => 'index.php?pagename=immeuble&estate_custom_url=$matches[1]&estate_id=$matches[2]&lang=en',
                'friendly_url' => 'en/property/{custom_url}-{id}',
            ),
        ),
    );
}

Pourriez-vous répondre au point A) du message https://wpml.org/fr/forums/topic/rewrite-rules-avec-wpml/#post-1544726 ? Nous aimerions connaître la bonne valeur pour 'rewrite_index' pour l'anglais. Nous avons donné 4 propositions et nous aimerions avoir votre avis.

Pour répondre à votre question. $rule est correct.
Cela génère les urls hidden link{custom_url}-{id} pour le FR (ce qui est correct) et hidden link{custom_url}-{id} pour le EN (ce qui est correct aussi). La valeur ICL_LANGUAGE_CODE est donc la bonne ('en')

Concernant

pre_get_document_title

, cela permet de changer le titre de la page. Je ne vois donc pas comment cela pourrai influencer la réécriture url...

Concernant le support de thèmes personnalisés, nous ne comprenons pas. Tous nos thèmes sont personnalisés car fait sur mesure pour nos clients. Cela veut dire que des problèmes en lien avec WPML sont susceptibles de ne pas être résolus ?
La réécriture URL fait partie des fonctionnalités de base et du core de WordPress et WPML est censé fonctionner avec cela. Si WPML interfère de manière négative, nous n'y pouvons rien. Tout ce que nous avons fait, c'est utiliser add_rewrite_rule() pour créer une url personnalisée pour l'anglais ! De plus, qui à part vous, équipe de WPML, est mieux placé pour comprendre les problèmes issus de WPML lui-même ? Vers qui devons-nous nous tourner pour avoir de l'aide ?

mars 16, 2018 à 10:20 #1547866

Yvette
Supporter

Languages: Anglais (English ) Espagnol (Español )

Timezone: Europe/Madrid (GMT+02:00)

Je comprends votre point. Notre priorité de forum de support est de résoudre des problèmes avec notre propre code ou API publiée. Pour les thèmes commerciaux et les plugins, nous avons une rame spéciale disponible pour les auteurs. Pour les thèmes / plugins personnalisés, c'est ici que la zone devient grise.

Le mieux que je puisse faire est d'augmenter votre ticket à notre groupe de support de deuxième niveau qui sera mieux placé pour vous aider, vous rediriger vers nos partenaires pour plus de support ou porter votre problème à nos programmeurs s'il est confirmé que le problème est avec le code de base WPML.

Je prépare le ticket pour leur évaluation et vous le notifierai une fois qu'il aura été escaladé.

mars 16, 2018 à 10:23 #1547869

Atypic

Merci Yvette,

Je transmets l'information de mon coté, ainsi qu'à notre client.

Jérôme

mars 16, 2018 à 10:37 #1547892

Yvette
Supporter

Languages: Anglais (English ) Espagnol (Español )

Timezone: Europe/Madrid (GMT+02:00)

Escalated to 2nd tier.

mai 10, 2018 à 11:04 #2070043

Yvette
Supporter

Languages: Anglais (English ) Espagnol (Español )

Timezone: Europe/Madrid (GMT+02:00)

Bonjour

Notre prochaine version 4.0 inclura un filtre pour désactiver le filtrage WPML lorsque des règles de réécriture personnalisées sont utilisées.

De cette manière, lorsqu'il existe des règles de réécriture personnalisées qui permettent aux utilisateurs d'accéder au même contenu avec des URL différentes, elles ne seront pas redirigées par la logique WPML par défaut qui redirige actuellement l'utilisateur vers les URL canoniques. Ce comportement actuel peut maintenant être modifié grâce au nouveau filtre.

Cela résoudra-t-il votre problème?

mai 11, 2018 à 7:11 #2082609

Atypic

Bonjour Yvette,

Nous ne pouvons l'affirmer sans avoir effectuer des tests avec cette version 4, mais c'est une bonne nouvelle qu'une solution puisse être apportée à ce problème.

De notre coté, le développement de la demande de notre client a été mis en pause.

Jérôme

mai 11, 2018 à 7:19 #2082659

Yvette
Supporter

Languages: Anglais (English ) Espagnol (Español )

Timezone: Europe/Madrid (GMT+02:00)

D'accord. Dans ce cas, nous pouvons laisser ce ticket ouvert jusqu'à la sortie de 4.0, moment auquel vous pourrez peut-être l'évaluer.

Jusque là!

Le sujet ‘[Fermé] Rewrite rules avec WPML’ est fermé à de nouvelles réponses.