web-dev-qa-db-fra.com

Ajouter une règle de réécriture pour le noeud final de réécriture

J'ai créé un point de terminaison de réécriture avec la fonction add_rewrite_endpoint … voici la structure complète:

// Register to query vars

add_filter( 'query_vars', 'add_query_vars');


function add_query_vars( $vars ) {

    $vars[] = 'account';

    return $vars;

}


// Add rewrite endpoint


add_action( 'init', 'account_page_endpoint' );

function account_page_endpoint() {

    add_rewrite_endpoint( 'account', EP_ROOT );

}



// Account template

add_action( 'template_include', 'account_page_template' );

function account_page_template( $template ) {

    if( get_query_var( 'account', false ) !== false ) {

        return locate_template( array( 'account.php' ) );

    }

    return $template;

}

Cela fonctionne très bien jusqu'à présent quand j'entre une url comme exemple.com/account/username ... mais les liens du site sont toujours comme exemple.com?account=username.

Comment puis-je rediriger de la version du paramètre pour réécrire la version? Est-il nécessaire d'ajouter une règle de réécriture supplémentaire ou existe-t-il une fonction que ces liens doivent exécuter?

Les liens de compte sur le site lui-même sont créés par cette fonction:

function account_url( $user_id ) {

    $user = get_userdata( $user_id );

    return add_query_arg( 'account', strtolower( $user->user_login ), get_home_url() );

}
1
GDY

Les règles de réécriture ne gèrent que les demandes entrantes, elles ne sont pas impliquées dans la génération de lien.

Le système principal de réécriture WordPress est analysé en interne avec PHP; vous ne verrez aucune modification dans un fichier .htaccess lorsque vous ajoutez un point de terminaison. Les règles de base .htaccess disent essentiellement "S'il ne s'agit pas d'une demande de fichier ou de répertoire physique sur le serveur, transmettez la demande à WordPress".

Votre fonction account_url doit gérer à la fois les cas "moche" et "joli" quand elle génère les URL du compte. Nous pouvons regarder la fonction intégrée get_permalink pour voir comment WordPress gère cela, voici une version abrégée:

$permalink = get_option('permalink_structure');
if ( '' != $permalink ) {
    // output a pretty permalink
} else {
    // output an ugly permalink
}

L'option permalink_structure contient le modèle choisi si de jolis permaliens sont activés. Nous savons que de jolis permaliens sont désactivés s'ils sont vides.

2
Milo

EDIT 2

Pour utiliser de jolis permaliens, tels que exemple.com/account/john, vous devez l'activer dans votre zone d'administration, dans les paramètres de permalien et l'activer sur votre serveur. Vous nous avez dit dans des commentaires que vous utilisiez nginx. Je connais mieux Apache. Voici donc un tutoriel qui pourrait vous aider.

https://www.cyberciti.biz/faq/how-to-configure-nginx-for-wordpress-permalinks/

MODIFIER

Je suis allé trop vite, oubliez ma suggestion de add_rewrite_rule, je pense qu'avec Add_rewrite_endpoint, vous devez utiliser le hook "template_redirect" au lieu du crochet "template_include".

END EDIT

Selon le code que vous indiquez, je l’ajouterais à votre fonction account_page_endpoint

add_rewrite_rule('^account/([a-z0-9]+)/?', 'index.php?account=$matches[1]', 'top');

Il ne modifie pas le fichier .htaccess, mais vous pouvez actualiser les règles.

Vous devrez peut-être actualiser les règles après cette modification.

Deux possibilités:

-Si vous ajoutez, juste après la ligne de code ci-dessus, l'appel de la fonction de réécriture de la couleur comme ceci:

flush_rewrite_rules();

- ou vous pouvez aller dans votre zone d’administration, dans les paramètres de permalien et réenregistrer vos paramètres actuels.

4
Friss