web-dev-qa-db-fra.com

Permaliens basés sur la date pour le type de publication personnalisé et permaliens de taxonomie personnalisée

Dans mon thème (un enfant de vingt-seize ans), j'ai créé un nouveau type de message personnalisé, pg_review. J'ai associé deux taxonomies personnalisées, pg_genres (catégories hiérarchiques) et pg_authors (comme les balises).

Tout fonctionne bien sauf les permaliens ... Malgré les efforts pour comprendre et adapterdiversexemples je tourne en rond.

Je voudrais que ces permaliens fonctionnent:

/reading/2017/02/19/post-name/  # A single Review.
/reading/2017/02/19/            # Reviews from one day.
/reading/2017/02/               # Reviews from one month.
/reading/2017/                  # Reviews from one year
/reading/                       # The most recent Reviews (this is working).
/reading/genre/genre-name/      # Reviews in a `pg_genre`.
/reading/author/author-name/    # Reviews in a `pg_author'.

C’est à peu près comme cela que fonctionnent les postes conventionnels si on leur donne une structure permalien personnalisée comme /archive/%year%/%monthnum%/%day%/%postname%/. Mais comment puis-je faire ce travail pour un type de message personnalisé?

(J'ai essayé le plugin Custom Post Type Permalinks qui promet de le faire, mais les liens pour les taxonomies 404 (un problème que d'autres semblent en support semblent avoir aussi).)

1
Phil Gyford

Nous allons commencer par les taxonomies, car celles-ci sont assez simples. Si vous enregistrez avec simplement reading/genre et reading/author en tant qu'argument slug, ceux-ci devraient fonctionner sans problème.

Le type de message est un peu plus délicat. Pour cela, nous enregistrons avec l'argument rewrite défini à true. Ensuite, nous ajoutons un nouveau permastruct pour ce type de message avec:

add_permastruct(
    'pg_review',
    "/reading/%year%/%monthnum%/%day%/%pg_review%/",
    array( 'with_front' => false )
);

Nous aurons maintenant les règles pour les affichages uniques, mais les affichages année/mois/jour auront tous un type de message incorrect, nous allons donc ajouter de nouvelles règles pour les réinitialiser avec:

add_rewrite_rule(
    '^reading/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$',
    'index.php?post_type=pg_review&year=$matches[1]&monthnum=$matches[2]&day=$matches[3]',
    'top'
);
add_rewrite_rule(
    '^reading/([0-9]{4})/([0-9]{1,2})/?$',
    'index.php?post_type=pg_review&year=$matches[1]&monthnum=$matches[2]',
    'top'
);
add_rewrite_rule(
    '^reading/([0-9]{4})/?$',
    'index.php?post_type=pg_review&year=$matches[1]',
    'top'
);

La dernière étape consiste à filtrer post_type_link pour insérer le bon année/mois/jour dans les permaliens:

function wpd_pg_review_permalinks( $url, $post ) {
    if ( 'pg_review' == get_post_type( $post ) ) {
        $url = str_replace( "%year%", get_the_date('Y'), $url );
        $url = str_replace( "%monthnum%", get_the_date('m'), $url );
        $url = str_replace( "%day%", get_the_date('d'), $url );
    }
    return $url;
}
add_filter( 'post_type_link', 'wpd_pg_review_permalinks', 10, 2 );
2
Milo