web-dev-qa-db-fra.com

Structure de permalien personnalisée: /% type-après-type-personnalisé% /% taxonomie-personnalisée% /% après-nom% /

J'essaie de créer une structure personnalisée de permalien qui me permettra d'accomplir les tâches suivantes.

  1. J'ai un type de message personnalisé appelé "projets"
  2. J'ai une taxonomie personnalisée appelée "catégorie de projet" qui est affectée aux "projets" du CPT. 

Je veux que ma structure permalien ressemble à ceci:

projets/catégorie/nom du projet

ou

/% custom-post-type% /% taxonomie personnalisée% /% post-name% /

J'ai pu utiliser avec succès /% category%/in permalinks pour des publications normales, prêtes à l'emploi WP, mais pas pour les CPT.

Comment la création d'une telle structure de lien permanent affecterait-elle les URL ou d'autres pages? Est-il possible de définir une structure personnalisée de permalien et de la limiter à un seul CPT?

Merci

20
Bruno Cloutier

Heureusement pour vous, je juste devais le faire pour un projet client. J'ai utilisé cette réponse sur le WordPress Stackexchange comme guide:

/**
 * Tell WordPress how to interpret our project URL structure
 *
 * @param array $rules Existing rewrite rules
 * @return array
 */
function so23698827_add_rewrite_rules( $rules ) {
  $new = array();
  $new['projects/([^/]+)/(.+)/?$'] = 'index.php?cpt_project=$matches[2]';
  $new['projects/(.+)/?$'] = 'index.php?cpt_project_category=$matches[1]';

  return array_merge( $new, $rules ); // Ensure our rules come first
}
add_filter( 'rewrite_rules_array', 'so23698827_add_rewrite_rules' );

/**
 * Handle the '%project_category%' URL placeholder
 *
 * @param str $link The link to the post
 * @param WP_Post object $post The post object
 * @return str
 */
function so23698827_filter_post_type_link( $link, $post ) {
  if ( $post->post_type == 'cpt_project' ) {
    if ( $cats = get_the_terms( $post->ID, 'cpt_project_category' ) ) {
      $link = str_replace( '%project_category%', current( $cats )->slug, $link );
    }
  }
  return $link;
}
add_filter( 'post_type_link', 'so23698827_filter_post_type_link', 10, 2 );

Lorsque vous enregistrez le type de publication personnalisé et la taxonomie, veillez à utiliser les paramètres suivants:

// Used for registering cpt_project custom post type
$post_type_args = array(
  'rewrite' => array(
    'slug' => 'projects/%project_category%',
    'with_front' => true
  )
);

// Some of the args being passed to register_taxonomy() for 'cpt_project_category'
$taxonomy_args = array(
  'rewrite' => array(
    'slug' => 'projects',
    'with_front' => true
  )
);

Bien sûr, veillez à effacer les règles de réécriture lorsque vous avez terminé. Bonne chance!

22
Steve Grunwell

Pendant que vous enregistrez votre type de message personnalisé, slug a été utilisé

$post_type_args = array(
  'rewrite' => array(
    'slug' => 'projects',
    'with_front' => true
  )

Vous pouvez essayer avec Setting-> permalink 

faire parent de ce poste aussi faire votre lien

0
Rohit Kaushik