Cela fait maintenant plusieurs heures que j'essaie de faire cela sans trouver de solution adéquate.
CE QUE JE VEUX OBTENIR
J'aimerais que WP utilise la structure d'URL suivante:
1) Posts -> /%category%/articles/%postname%/
2) CPT -> /%category%/CPT/%postname%/
Où% category% bit est la taxonomie des catégories par défaut utilisée dans les messages
CE QUE JE DID SO FAR
Pour ajouter la taxonomie des catégories par défaut au CPT, ce bit a été ajouté lors de l'enregistrement du CPT.
'taxonomies' => array('category'),
alors que les suivants sont les arguments de réécriture
$rewrite_args = array( 'slug' => '%category%/test', 'with_front' => false, 'feeds' => false, 'pages' => false );
MODIFICATION DU POST PAR DEFAUT
Je sais que la solution la plus évidente consiste à modifier la structure du lien permanent dans le panneau de configuration. Et cela doit être fait dans tous les cas, sinon tout ce que je décrirai fonctionnera.
Donc, ma structure Permalink a été définie comme
/%category%/articles/%postname%/
CE QUI SE PASSE
Si je laisse la configuration de base, pas de crochets, rien. Les messages fonctionnent comme prévu.
Au moment où j'accroche au post_type_link pour que mon CPT remplace la% category%, la configuration par défaut cesse de fonctionner.
J'ai essayé de ré-enregistrer le type de message; cela semble donner de meilleurs résultats (bien qu'il y ait l'inconvénient de voir l'élément "posts" deux fois dans la barre d'administration), mais pour une raison quelconque, lorsque je le fais, le slug personnalisé du CPT cesse de fonctionner.
Avez-vous un indice spécifique? Merci Andrea
Vous devrez ajouter vos propres règles de réécriture pour que cela fonctionne, sans conteste.
Tout d'abord, n'utilisez pas la balise %category%
rewrite, enregistrez votre propre balise et utilisez-la pour les catégories CPT:
function wpd_query_vars( $qvars ) {
$qvars[] = 'cptcat';
return $qvars;
}
add_filter( 'query_vars', 'wpd_query_vars' );
Vous pouvez ensuite échanger cette balise pour la catégorie dans post_type_link
. Notez que cela ne gère qu'un seul niveau de terme. Si vous souhaitez créer des liaisons permanentes pour les termes parents/enfants, vous devez modifier cette fonction et ajouter une règle de réécriture pour intercepter tous les niveaux de la hiérarchie des termes.
function wpd_test_post_link( $post_link, $id = 0 ){
$post = get_post($id);
if ( is_object( $post ) && $post->post_type == 'your_cpt' ){
$terms = wp_get_object_terms( $post->ID, 'category' );
if( $terms ){
foreach( $terms as $term ){
if( 0 == $term->parent ){
return str_replace ( '%cptcat%' , $term->slug , $post_link );
}
}
} else {
return str_replace ( '%cptcat%' , 'uncategorized', $post_link );
}
}
return $post_link;
}
add_filter( 'post_type_link', 'wpd_test_post_link', 1, 2 );
Cela ne fonctionne toujours pas car WordPress pense que votre lien permanent est une demande de catégorie parent/enfant. Ajoutez une règle de réécriture pour remplacer ceci:
function wpd_test_rewrites(){
add_rewrite_rule(
'([^/]+)/CPT/([^/]+)/?$',
'index.php?your_cpt=$matches[2]',
'top'
);
}
add_action( 'init', 'wpd_test_rewrites' );
/%category%/
n'est pas une variable que Wordpress peut traiter ou remplacer lorsque vous configurez un slug pour un type de publication client.
Si vous souhaitez qu'un système de catégories s'exécute dans le type de publication personnalisé tel qu'il est disponible pour le type de publication normal, assurez-vous de l'activer:
capability_type' => 'post',
'has_archive' => true,
'hierarchical' => true,
Espérons que cela aidera.
Je pense que vous cherchez à utiliser la fonction add_permastruct
. Je n’en ai pas fait beaucoup, mais si je comprends bien, c’est ce que vous cherchez à faire:
(Adapté d'un tutoriel de TutsPlus )
// Please note that this will only work on WordPress 3.4+ http://core.trac.wordpress.org/ticket/19871
add_rewrite_tag('%yourcpt_cpt%','(yourcptname)s','post_type=');
add_permastruct('cpt_category_archive', '%category%/%yourcpt_cpt%/%postname%');
Votre déclaration pour le CPT semble bonne, mais 'slug' => '%category%/test'
devrait simplement être 'slug' => 'test'
Ceci n'est pas testé, vous devriez donc l'essayer sur un serveur non productif. Vous devriez probablement effacer les règles de réécriture après avoir rendu le code vivant (peut-être avec flush_rewrite_rules()
).
Il s’agit d’un futzing avancé avec WP Rewrite, plus d’informations à l’entrée du codex pour WP Rewrite et add_permastruct ainsi que dans le code .