web-dev-qa-db-fra.com

Taxonomie personnalisée dans Permalink of Post

Il est possible de l'utiliser comme lien permanent pour un message:

/%category%/%postname%/

Mais disons que j'ai créé une taxonomie appelée "artiste". J'aimerais utiliser ceci pour mes messages:

/%artist%/%postname%/

Je sais que les taxonomies vous permettent d’énumérer leurs termes avec ceci:

/%artist%/%someartist%/

mais ce n'est pas ce que je cherche. Je veux modifier POST urls, pas ceux de taxonomie.

J'essaye ceci sur mon blog et ça ne marche pas. Est-ce quelque chose qui peut être fait dans Wordpress?

4
Totomobile

En supposant que votre taxonomie personnalisée s'appelle artist (et que vous ne remplaciez pas le slug dans le paramètre rewrite), vous pouvez utiliser la balise rewrite %artist%. WordPress implémente presque toutes les fonctionnalités pour utiliser ces balises de réécriture post-permaliens. Il ne reste que quelques petites adaptations nécessaires.

Construire le Permalink

Tout d'abord, vous devrez utiliser le filtre post_link pour remplacer un "tag" personnalisé dans votre structure de requête:

/**
 * replace the '%artist%' tag with the first 
 * term slug in the artist taxonomy
 * 
 * @wp-hook post_link
 * @param string $permalink
 * @param WP_Post $post
 * @return string
 */
function wpse_56769_post_link( $permalink, $post ) {

    $default_term = 'no_artist';
    $terms = wp_get_post_terms( $post->ID, 'artist' );
    if ( ! empty( $terms ) && ! is_wp_error( $terms ) )
        $term = current( $terms )->slug;
    else
        $term = $default_term;

    $permalink = str_replace( '%artist%', $term, $permalink );

    return $permalink;
}
add_filter( 'post_link', 'wpse_56769_post_link', 10, 2 );

Cette fonction (wpse_56769_post_link):

  • définit un slug de terme par défaut (no_artist) qui est utilisé comme solution de secours si la publication ne comporte pas de termes attribués dans la taxonomie de l'artiste,
  • récupère le premier terme attribué (par ordre alphabétique) de la taxonomie de l'artiste,
  • remplace la balise %artist% par le slug de ce terme.

Maintenant, allez dans le menu Paramètres → Permaliens, choisissez l'option "Structure personnalisée" et écrivez dans: /%artist%/%postname%/.

Dans le résultat, un post permalien devrait ressembler à ceci:

Using the first term as URL slug

Maintenant que le billet contient le premier slug du terme d’artiste, jetons un coup d’œil à l’acheminement.

Mettre à jour les permaliens (routage)

Vous remarquerez que le permalien est résolu correctement en un seul poste. Malheureusement, les permaliens de page sont cassés.

Pour résoudre ce problème, vous n'avez pas nécessairement besoin de modifier les règles de réécriture. La seule chose à faire est de changer l'état interne de WP_Rewrite. La propriété WP_Rewrite::use_verbose_page_link doit être définie sur TRUE. (C’est le comportement interne de WP_Rewrite lorsqu’on utilise les balises %category% ou %author% comme base pour les permaliens post.)

/**
 * set WP_Rewrite::use_verbose_page_rules to TRUE if %artist%
 * is used as the first rewrite tag in post permalinks
 * 
 * @wp-hook do_parse_request
 * @wp-hook page_rewrite_rules
 * @global $wp_rewrite
 * @param mixed $pass_through (Unused)
 * @return mixed
 */
function wpse_56769_rewrite_verbose_page_rules( $pass_through = NULL ) {

    $permastruct = $GLOBALS[ 'wp_rewrite' ]->permalink_structure;
    $permastruct = trim( $permastruct, '/%' );
    if ( 0 !== strpos( $permastruct, 'artist%' ) )
        return $pass_through;

    $GLOBALS[ 'wp_rewrite' ]->use_verbose_page_rules = TRUE;
    return $pass_through;
}
add_filter( 'page_rewrite_rules', 'wpse_56769_rewrite_verbose_page_rules', PHP_INT_MAX );
add_filter( 'do_parse_request',  'wpse_56769_rewrite_verbose_page_rules', PHP_INT_MAX );

L'état doit être modifié en deux points: do_parse_request car WP::parse_request() demande cet état et page_rewrite_rules à la génération des règles de réécriture.

Maintenant, le routage est corrigé et les permaliens de page fonctionnent bien. (Après avoir rincé les permaliens une fois de plus.)

Gérer le pseudo terme no_artist

Une dernière chose à propos de la chose no_artist: si la publication n'est vraiment affectée à aucun terme de la taxonomie artist, le lien permanent est analysé avec les variables de requête suivantes:

name   => 'sample_post'
artist => 'no_artist'
page   => ''

Cela devrait conduire à un 404 car le terme n'existe pas. Comme la variable name du message doit être unique, nous pouvons supprimer la variable de requête artist du filtre request:

/**
 * check for existing artist and set query to 404 if necessary
 *
 * @wp-hook parse_query
 * @param array $request_vars
 * @return array
 */
function wpse_56769_request_vars( $request_vars ) {

    if ( ! isset( $request_vars[ 'artist' ] ) )
        return $request_vars;

    if ( ! isset( $request_vars[ 'name' ] ) )
        return $request_vars;

    if ( 'no_artist' == $request_vars[ 'artist' ] )
        unset( $request_vars[ 'artist' ] );

    return $request_vars;
}
add_filter( 'request', 'wpse_56769_request_vars' );

Avec ce filtre, un article comme http://wordpress.dev/no_artist/sample-post/ sera trouvé correctement.

7
David

Je pense que c’est ce que vous cherchez: Type de message personnalisé Permaliens

Ce plugin vous permet de modifier la structure de lien permanent du type de message personnalisé.

Pour installer ce plugin:

  1. Téléchargez le fichier custom-post-type-permalinks.Zip sur votre ordinateur.
  2. Décompressez le fichier.
  3. Téléchargez le répertoire custom-post-type-permalinks dans votre répertoire/wp-content/plugins /.
  4. Activez le plugin via le menu "Plugins" de WordPress.

Vous pouvez également aller dans le menu "Plugins" de votre wordpress et cliquer sur "ajouter un nouveau". Recherchez ensuite ce plug-in en recherchant "Permaliens de type de message personnalisé" et installez-le en cliquant sur le bouton d'installation.

Un nouvel élément apparaîtra dans le menu à gauche de votre admin wordpress. Ici, vous pouvez modifier les paramètres en fonction de vos besoins (noms des taxonomies, etc.).


De plus, mon site a actuellement la structure permalien suivante "site.com/star/aristname/" qui répertorie ensuite tous les messages de cet artiste ou une page/un message à propos de cet artiste.

Si vous recherchez ceci, vous pouvez créer une page d'archive pour votre type d'article personnalisé. Wordpress assumera automatiquement cette structure. Pour plus d'informations sur la création de votre propre page d'archive, veuillez consulter here . (Si vous cherchez vraiment cela, je peux l'expliquer plus en détail si vous le souhaitez)

1
Aleks

Lorsque je voulais accrocher l'URL à la catégorie (quelle que soit sa structure), j'ai défini une liste de termes dans la structure de réécriture d'URL, mais dans mon cas, il n'y avait pas beaucoup de termes ...

les résultats étaient quelque chose comme clé de règle de réécriture

publications/(annual-reports|articles|books|policy-briefs)/([^/]+).html?$ 

et valeur de la règle

index.php?post_type=publication&category_publication=$matches[1]&publication=$matches[2]&paged=1

tout était accroché avec rewrite_rules_array filter.

résultat vous pouvez voir à http://unu.edu/publications

0
Butuzov