J'ai un type de message personnalisé de news_archive
et ils utilisent WordPress Catégories. Je voudrais obtenir des pages d'archives pour ces catégories avec uniquement les CPT et non les messages de base. J'ai réussi à trouver cette URL, qui fait exactement ce que Je veux être lié à ma page d'archive personnalisée:
/stories/category/in-the-news/?post_type=archived_news/
Où stories
est le permalien de l'article de blog défini dans Structure personnalisée sur la page Permaliens.
Ce que j'aimerais faire, c'est transformer cela en
/news/category/in-the-news/
où news est le rewrite
pour archived_news
des postes
J'essayais quelque chose comme:
function category_cpt_rewrites() {
$categories = array( 'in-the-news', 'press-release' );
foreach ( $categories as $category ) {
$rule = '/stories/category/' . $category . '/?post_type=archived_news';
$rewrite = '/archived_news/category/' . $category . '/';
add_rewrite_rule( $rule, $rewrite, 'top' );
}
}
add_action( 'init', 'category_cpt_rewrites' );
Mais je ne pense pas avoir la bonne syntaxe. Ai-je même la bonne idée?
* edit Ok Je l'ai fait fonctionner, trier. J'ai dû échanger les valeurs de règle/réécriture, puis utiliser l'expression correcte.
function category_cpt_rewrites() {
$categories = array( 'in-the-news', 'press-release' );
foreach ( $categories as $category ) {
$rule = '^news/category/([^/]*)/?';
$rewrite = 'index.php?post_type=archived_news&category=' . $category;
add_rewrite_rule( $rule, $rewrite, 'top' );
}
}
add_action( 'init', 'category_cpt_rewrites' );
Je continue d'afficher les deux catégories, mais je pense que je suis proche. Cependant, maintenant la pagination ne fonctionne pas et je ne sais pas pourquoi. /news/category/press-release/page/2/
renvoie les mêmes messages que la première page mais /stories/category/press-release/page/2/?post_type=archived_news
me donne la prochaine page de messages
Vous voulez afficher les publications d'un type donné ({post_type}) de la catégorie ({term}) et la structure du lien devrait ressembler à ceci:
{post_type}/category/{term}
Pour éviter les collisions avec des liens vers des pages et des publications de "blog", l'expression ne peut pas commencer par ([^/]+)
, Mais doit contenir un slug de type de publication entré explicitement. Cela signifie une règle distincte pour chaque type de publication personnalisé.
$regex = '^news/category/(.+?)/?$';
Pour l'expression ci-dessus, le $redirect
Doit contenir les paramètres category_name
Et post_type
:
$redirect = 'index.php?category_name=$matches[1]&post_type=news';
Et dans le cas d'une taxonomie personnalisée (^news/custom_tax_slug/(.+?)/?$
):
$redirect = 'index.php?CUSTOM_TAX_SLUG=$matches[1]&taxonomy=CUSTOM_TAX_SLUG&post_type=news';
Pour gérer la pagination, vous avez besoin d'une autre règle, qui est une version étendue de la précédente.
$regex = '^news/category/(.+?)/page/?([0-9]{1,})/?$';
$redirect = 'index.php?category_name=$matches[1]&post_type=news&paged=$matches[2]';
Tous ensemble:
function category_cpt_rewrites()
{
add_rewrite_rule( '^news/category/(.+?)/page/?([0-9]{1,})/?$',
'index.php?category_name=$matches[1]&post_type=news&paged=$matches[2]',
'top'
);
add_rewrite_rule( '^news/category/(.+?)/?$',
'index.php?category_name=$matches[1]&post_type=news',
'top'
);
}
Ou:
function category_cpt_rewrites()
{
$post_types = [ 'news' ];
foreach ( $post_types as $cpt )
{
add_rewrite_rule( '^'. $cpt .'/category/(.+?)/page/?([0-9]{1,})/?$',
'index.php?category_name=$matches[1]&post_type='. $cpt .'&paged=$matches[2]',
'top'
);
add_rewrite_rule( '^'. $cpt .'/category/(.+?)/?$',
'index.php?category_name=$matches[1]&post_type=' . $cpt,
'top'
);
}
}