it-swarm.com.de

Datumsbasierte Permalinks für benutzerdefinierten Beitragstyp und benutzerdefinierte Taxonomie-Permalinks

In meinem Thema (ein Kind von 16 Jahren) habe ich den neuen benutzerdefinierten Beitragstyp pg_review erstellt. Ich habe zwei benutzerdefinierte Taxonomien zugeordnet, pg_genres (hierarchische Kategorien) und pg_authors (wie Tags).

Alles funktioniert gut, außer Permalinks ... Trotz des Versuchs zu verstehen und anzupassenverschiedeneBeispiele Ich gehe im Kreis herum.

Ich möchte, dass diese Permalinks funktionieren:

/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'.

So funktionieren herkömmliche Posts, wenn eine benutzerdefinierte Permalink-Struktur wie /archive/%year%/%monthnum%/%day%/%postname%/ angegeben wird. Aber wie mache ich das für einen benutzerdefinierten Beitragstyp?

(Ich habe das Plugin Custom Post Type Permalinks ausprobiert, das dies verspricht, aber die Links für Taxonomien 404 (ein Problem, das offenbar auch andere im Support haben).)

1
Phil Gyford

Wir werden mit den Taxonomien beginnen, da diese ziemlich einfach sind. Wenn Sie diese einfach mit reading/genre und reading/author als slug-Argument registrieren, sollten diese ohne Probleme funktionieren.

Der Beitragstyp ist etwas kniffliger. Dafür registrieren wir uns mit dem Argument rewrite, das auf true gesetzt ist. Dann fügen wir eine neue Permastruktur für diesen Beitragstyp hinzu mit:

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

Wir haben jetzt die Regeln für einzelne Post-Ansichten, aber für die Ansichten Jahr/Monat/Tag ist der falsche Post-Typ eingestellt. Daher fügen wir einige neue Regeln hinzu, um diese zurückzusetzen mit:

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'
);

Der letzte Schritt ist das Filtern von post_type_link, um das richtige Jahr/Monat/Tag in die Permalinks einzufügen:

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