Benutzerdefinierte Post Typ 404s mit Umschreiben auch nach dem Zurücksetzen von Permalinks


7

Ich habe einen benutzerdefinierten Beitragstyp erstellt, dessen (vereinfachte) Argumente sind:

register_post_type(
    'Event',
    'public' => true,
    'rewrite' => array( 'slug' => 'eventy'),
    'has_archive' => false,
    'hierarchical' => false
)

Es funktioniert im Allgemeinen gut. Wenn ich jedoch versuche, die URLs neu zu schreiben functions.php, zum Beispiel:

function my_post_type_link_filter_function( $post_link, $id = 0, $leavename = FALSE ) {
   return str_replace('eventy', 'eventx', $post_link);
}
add_filter('post_type_link', 'my_post_type_link_filter_function', 1, 3);

Das Ergebnis ist, dass die neuen 'eventx'-URLs in von WordPress generierten Links, Listen usw. korrekt angezeigt werden. Wenn ich jedoch zu diesen 'eventx'-URLs gehe, erhalte ich eine 404. Das Wechseln zu einer' eventy'-URL funktioniert immer noch.

Ich habe viele Male versucht, die Permalink-Einstellungen auf Standard und zurück auf den Post-Namen zu ändern. Dies soll Permalinks zurücksetzen und dieses Problem für viele Leute beheben, die ich online gesehen habe. Nicht für mich.

Weiß jemand, was die Ursache sein könnte? Wie gehe ich bei der Fehlerbehebung vor? Ich bin schwach in der Theorie des URL-Umschreibens.

Wenn Sie interessiert sind, ist mein Zweck nicht die oben erwähnte triviale eventy → eventx-Substitution. Ich möchte tatsächlich das Jahr / den Monat, in dem ein Ereignis beginnt (nicht als es veröffentlicht wurde), in seine URL einfügen. Durch das Debuggen wurde mir klar, dass ich ein grundlegenderes Problem hatte, da selbst dieses triviale x → y-Umschreiben immer noch 404s auslöst.

Danke fürs Lesen!

[Klarstellung hinzugefügt]

Im Moment habe ich drei Ereignisse (Beiträge in meinem benutzerdefinierten Beitragstyp) mit dem Namen "Angelausflug" gesagt. Diesen werden standardmäßig Permalinks wie zugewiesen

  • mysite.com/events/fishing-trip
  • mysite.com/events/fishing-trip-2
  • mysite.com/events/fishing-trip-3

Welches ist langweilig und unelegant.

Ich will stattdessen

  • mysite.com/events/2013/january/fishing-trip
  • mysite.com/events/2013/may/fishing-trip
  • mysite.com/events/2013/may/fishing-trip-2
  • mysite.com/events/2014/march/fishing-trip

Schöner und informativer.

Ich bin nicht daran interessiert, Seiten im Kategoriestil zu haben

  • mysite.com/events/2013

Das Jahr und der Monat sind in der URL nur kosmetisch.


2
Beim Filtern 'post_type_link'werden einfach die URLs geändert, die WordPress generiert, wenn ein Permalink für Ihren Beitragstyp ausgegeben wird. Wenn Sie eine dieser URLs besuchen, weiß WordPress nicht, was mit ihnen zu tun ist oder worauf sie verweisen sollen, da Sie nichts unternommen haben, um Umschreiberegeln für eingehende Anforderungen zu generieren. Ohne zu wissen, welches Format Sie für Ihre Links wünschen, ist es nicht möglich, eine Antwort zu geben, die Sie nicht auf add_rewrite_ruleund verweist add_rewrite_tag.
Milo

danke @ milo Beitrag bearbeitet, um weitere Informationen über die gewünschten URLs hinzuzufügen
Jonathan

Antworten:


8

Schritt 1: Fügen Sie die Umschreibetags für benutzerdefinierte Abfragevariablen für Ereignisjahr und -monat hinzu und registrieren Sie dann den Ereignisposttyp mit diesen Tags im Slug-Argument des Umschreibearguments:

function wpa83531_register_event_post_type(){

    add_rewrite_tag('%event_year%','(\d+)');
    add_rewrite_tag('%event_month%','(.+)');

    register_post_type( 'event',
        array(
            'public' => true,
            'rewrite' => array( 'slug' => 'events/%event_year%/%event_month%' ),
            'has_archive' => false,
            'hierarchical' => false,
            'supports' => array('custom-fields', 'title', 'editor')
        )
    );

}
add_action( 'init', 'wpa83531_register_event_post_type' );

In Schritt 2 filtern Sie den Beitragstyp-Link, um diese Tags durch Werte aus benutzerdefinierten Feldern event_yearund zu ersetzen event_month. Wenn die benutzerdefinierten Felder nicht vorhanden sind, werden einige Standardwerte eingefügt, sodass Sie zumindest eine Vorschau eines Beitrags ohne Fehler anzeigen können:

function wpa83531_event_post_link( $permalink, $post, $leavename ) {
    if ( stripos( $permalink, '%event_year%' ) == false )
        return $permalink;

    if ( is_object( $post ) && 'event' == $post->post_type ) {

        $default_year = '1970';
        $default_month = 'january';

        if( $event_year = get_post_meta( $post->ID, 'event_year', true ) ){
            $permalink = str_replace( '%event_year%', $event_year, $permalink );
        } else {
            $permalink = str_replace( '%event_year%', $default_year, $permalink );
        }

        if( $event_month = get_post_meta( $post->ID, 'event_month', true ) ){
            $permalink = str_replace( '%event_month%', $event_month, $permalink );
        } else {
            $permalink = str_replace( '%event_month%', $default_month, $permalink );
        }

    }

    return $permalink;
}

add_filter( 'post_type_link', 'wpa83531_event_post_link', 10, 3 );

0

Sie müssen 'rewrite' => false in Ihrem register_post_type () setzen; und nach dem Schließen von register_post_type () hinzufügen:

// 404 CPT WP bug...

global $wp_rewrite;
$projet_structure = '/projets/%projet%';
$wp_rewrite->add_rewrite_tag("%projet%", '([^/]+)', "projet=");
$wp_rewrite->add_permastruct('projet', $projet_structure, false);

Wo projet ist mein CPT.

Sie können hier für mehr überprüfen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.