it-swarm.com.de

Benutzerdefinierter Beitragstyp 404s mit Umschreiben auch nach dem Zurücksetzen von Permalinks

Ich habe einen benutzerdefinierten Beitragstyp erstellt, dessen (vereinfachte) Argumente wie folgt lauten:

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 in functions.php umzuschreiben, 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. Aber wenn ich zu diesen 'eventx'-URLs gehe, erhalte ich eine 404. Das Aufrufen einer' eventy'-URL funktioniert immer noch.

Ich habe viele Male versucht, die Einstellungen für Permalinks auf Standard und zurück auf Postnamen zu ändern. Dies soll Permalinks zurücksetzen und behebt dieses Problem für viele Leute, 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 Umschreibens von URLs.

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

Danke fürs Lesen!

[Klarstellung hinzugefügt]

Im Moment habe ich drei Ereignisse (Beiträge in meinem benutzerdefinierten Beitragstyp) mit dem Namen "Angeltour". Diese bekommen standardmäßig gerne Permalinks 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 wie zu haben

  • mysite.com/events/2013

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

7
Jonathan

Schritt 1: Fügen Sie die Umschreibungs-Tags für benutzerdefinierte Abfragevariablen für Ereignisjahr und -monat hinzu und registrieren Sie den Typ des Ereignisbeitrags mit diesen Tags im Argument slug des Umschreibungs-Arguments:

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 den benutzerdefinierten Feldern event_year und event_month zu ersetzen. Wenn die benutzerdefinierten Felder nicht vorhanden sind, werden einige Standardwerte eingefügt, sodass Sie zumindest eine fehlerfreie Vorschau eines Posts 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 );
8
Milo

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

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

Wobei projet mein CPT ist.

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

0
Alex