web-dev-qa-db-fra.com

Lien permanent personnalisé - ajoutez le nom de la taxonomie et le nom du terme à la fin du lien permanent

J'ai

custom post type -> resources
custom taxonomy  -> resources_type

Je veux des permaliens personnalisés où la catégorie de base sera ajoutée à la fin au lieu de devant

Par exemple: j'ajoute une nouvelle ressource avec titre "Première ressource" et assigne terme comme type1

Ce que je reçois - http://example.com/resources/resources-type/type1/first-resource

Ce que je veux _ - http://example.com/resources/first-resource/resources-type/type1

J'utilise le code d'argument suivant dans le type de post du registre:

'rewrite' => array("slug" => "/resources/resources-type/%resources_type%"),

Et puis en utilisant le code suivant pour remplacer le "% resources_type%" dans le code ci-dessus

function wpa_course_post_link( $post_link, $id = 0 ){
  $post = get_post($id);  
  if ( is_object( $post ) ){
      $terms = wp_get_object_terms( $post->ID, 'resources_type' );
      if( $terms ){
        return str_replace( '%resources_type%' , $terms[0]->slug , $post_link );
      }
  }
  return $post_link;  
}
add_filter( 'post_type_link', 'wpa_course_post_link', 1, 3 );
2
user7459842

Vous pouvez obtenir la structure permalien suivante en remplaçant simplement (sans avoir à supprimer) celle par défaut (que vous avez spécifiée) pour le type de publication resources:

/resources/%resources%/resources-type/%resources_type% <- preferred
/resources/resources-type/%resources_type%/%resources% <- default

Et vous pouvez le remplacer via add_permastruct() - d’abord, enregistrez le type de publication sans spécifier le paramètre rewrite qui signifie que la réécriture par défaut est true/enabled et que le slug serait resources (c’est-à-dire le clé de type de publication ou slug):

register_post_type( 'resources', array(
    'label' => 'Resources',
    'public' => true,
    // no need to set the 'rewrite' arg
    ...
) );

Ensuite, juste après cela, remplacez la structure permalink comme ceci:

add_permastruct( 'resources', '/resources/%resources%/resources-type/%resources_type%' );

où le format est - la partie importante est le {POST TYPE KEY}, qui dans votre cas est resources:

add_permastruct( '{POST TYPE KEY}', '{PERMALINK STRUCTURE}' );

(N'oubliez pas de vider les règles de réécriture - visitez la page des paramètres de permalien.)}

Comment désactiver /resources/%resources%

/resources/%resources% (c'est-à-dire /{POST TYPE KEY}/%{POST TYPE KEY}%) est automatiquement ajouté si %{POST TYPE KEY}% est trouvé dans la structure de lien permanent. Vous pouvez l'enlever comme ceci:

add_filter( 'resources_rewrite_rules', 'filter_resources_rewrite_rules' );
function filter_resources_rewrite_rules( $rules ) {
    $pattern = 'resources/([^/]+)/resources-type/';
    $p_length = strlen( $pattern );

    foreach ( $rules as $regex => $query ) {
        if ( $pattern !== substr( $regex, 0, $p_length ) ) {
            unset( $rules[ $regex ] );
        }
    }

    return $rules;
}

_ {Si le type de publication est hiérarchique, le $pattern serait alors resources/(.+?)/resources-type/.}

Et si vous souhaitez utiliser le code/la fonction ci-dessus avec un autre type de message, il vous suffit en principe de remplacer le texte "ressources" par le type de message approprié clé.

Voir https://developer.wordpress.org/reference/hooks/permastructname_rewrite_rules/ pour plus de détails sur ce filtre.

1
Sally CJ