web-dev-qa-db-fra.com

Archive CPT avec catégorie principale

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/

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

1
zfors

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'
        );
    }
}
1
nmr