it-swarm.com.de

Benutzerdefinierte URL für den Beitragstyp mit Beitrags-ID, die Archivierung und Paging ermöglicht

Es fällt mir schwer, meine benutzerdefinierten URLs für Post-Typen zum korrekten Funktionieren zu bringen. Jede Lösung, die ich finde, hat einen anderen Teil lahmgelegt, der funktionieren muss. Was ich versuche zu erreichen, ist domain.com/post_type/post_id/post_name.

Was ich habe, das für alles außer Archiven funktioniert, ist:

register_post_type('post-type',
    array(
    'rewrite' => array(
    'slug' => 'post-type/%post_id%',
    'with_front' => false,
    'pages' => true,
    'ep_mask' => 1 
    )
))

Dann habe ich:

add_filter('post_type_link', 'custom_post_type_link', 1, 3);
function custom_post_type_link($post_link, $post = 0, $leavename = false) {

    if ($post->post_type == 'post-type')) {
        return str_replace('%post_id%', $post->ID, $post_link);
    } else {
        return $post_link;
    }
}

Also versuche ich einen Weg zu finden, um domain.com/post_type zum Laufen zu bringen. Es wirft derzeit eine 404.

Ich weiß, dass das Archiv funktioniert, wenn ich den Filter und den /%post_id% von meinem Umschreiben entferne. Von dort habe ich versucht, eine Umschreiberegel hinzuzufügen:

add_action( 'init', 'custom_rewrites_init' );
function custom_rewrites_init(){
    add_rewrite_rule(
        'post-type/([0-9]+)?$',
        'index.php?post_type=post-type&p=$matches[1]',
        'top' );
}

Auf diese Weise leitet die URL nicht weiter, wenn jemand domain.com/post_type/post_id und domain.com/post_type/post_id/post_name/2 eingibt.

Weiß jemand, wie man das am besten macht?

3
kel

Ihr Code/Ihre Lösungen sind ziemlich gut. Sie verwenden slug param auf eine sehr kluge Art und Weise, sodass WordPress automatisch die richtige permastruct für diesen CPT erstellt.

Vermutlich fehlt Ihnen nur has_archive param. Der Standardwert ist false und Sie setzen ihn nicht auf true. Daher erstellt WordPress keine Archivlinks/-seiten für Ihr CPT.

has_archive (Boolean oder String)

(optional) Aktiviert Post-Type-Archive.

Verwendet standardmäßig $ post_type als Archiv-Slug. Standard: false Hinweis: Wird die richtigen Umschreibregeln generieren, wenn das Umschreiben aktiviert ist. Verwenden Sie auch Rewrite, um den verwendeten Slug zu ändern.

In diesem Fall erstellt WordPress Umschreiberegeln für Archivseiten. Es wird ein kleines Problem geben. Sie enthalten %post_id%. Aber es ist ziemlich leicht zu korrigieren. Sie müssen diesen Code nur nach Ihrem register_post_type-Aufruf hinzufügen:

global $wp_rewrite;

$new_rules = array();
foreach ( $wp_rewrite->extra_rules_top as $key => $rule ) {
    echo $key;
    if (strpos($key, 'post-type/%post_id%/') === 0 ) {
        $new_rules[ str_replace('%post_id%/', '', $key) ] = $rule;
        unset( $wp_rewrite->extra_rules_top[$key] );
    }
}
$wp_rewrite->extra_rules_top = $wp_rewrite->extra_rules_top + $new_rules;

Es repariert Regeln für Archivseiten, die von WordPress erstellt wurden. Es ist eine saubere Lösung - es hinterlässt keine Unordnung und kümmert sich um alle Regeln für die Archivseite (Feeds usw.)

6

Sie könnten versuchen, dieses Code-Snippet hinzuzufügen:

add_filter( 'rewrite_rules_array', 'custom_rewrite_rules_array' );
function custom_rewrite_rules_array( $rules ) {
        $newrules = array();
        $newrules['^post-type/page/?([0-9]{1,})/?$'] = 'index.php?post_type=post-type&paged=$matches[1]';
        $newrules['^post-type$'] = 'index.php?post_type=post-type';
       return $newrules + $rules;
}

unterstützung für domain.com/post-type/ und domain.com/post-type/page/2 hinzufügen.

Sie müssen nur daran denken, die Permalinks zu speichern.

2
birgire

Haben Sie Ihre Permalink-Einstellungen nach dem Speichern der Vorlagendatei zurückgesetzt? Bevor Sie einen neuen Permalink wie diesen verwenden können, müssen Sie Ihre Permalink-Einstellungen unter Einstellungen-> Permalinks erneut speichern.

0
Chris Wiegman