Benutzerdefinierte Umschreiberegeln für Archivseite und einzelnen Beitrag


8

Ich erstelle eine Wordpress-Site mit mehreren benutzerdefinierten Beitragstypen. Jeder Beitragstyp ist ein anderes Magazin. Ich habe auch benutzerdefinierte Metafelder für ein Magazinjahr und eine Ausgabe.

Ich hätte gerne URLs (verwendet archive.php):

http://my_site/magazine/name/
http://my_site/magazine_name/year/
http://my_site/magazine_name/year/issue/

Ich habe es per Code gemacht:

function magazine_rewrite_tag() {
    add_rewrite_tag('%issue_year%', '([0-9]{4})');
    add_rewrite_tag('%issue%', '([0-9])');
}
add_action('init', 'magazine_rewrite_tag', 10, 0);

und:

function magazine_rewrite_rules() {
    add_rewrite_rule('^([a-z]+)/([0-9]{4})/([0-9])?', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]', 'top');
    add_rewrite_rule('^([a-z]+)/([0-9]{4})?', 'index.php?post_type=$matches[1]&issue_year=$matches[2]', 'top');
}
add_action('init', 'magazine_rewrite_rules');

Natürlich habe ich auch benutzerdefinierte Abfragen in archive.php. Und es funktioniert gut.

Aber jetzt funktionieren meine URLs für einzelne Artikel nicht. Standardmäßig ist es:

http://my_site/magazine/post-title

Aber es zeigt alle Artikel aus dem Magazin wie URL (und es verwendet die Vorlage archive.php):

http://my_site/magazine/

Wie füge ich Regeln für das erneute Schreiben einzelner benutzerdefinierter Beiträge ordnungsgemäß hinzu? Es ist möglich, dass ich URLs für einzelne Posts (nur für ausgewählte benutzerdefinierte Post-Typen) in diesem Format haben möchte:

http://my_site/magazine/year/issue/post-title

Mehrere Anmerkungen: (1) Das 4. Argument ist die Anzahl der Argumente, die ein Filter oder eine Aktion ausführt. Und 10ist die Standard - Priorität . In diesem Fall können Sie beide weglassen… oder eine höhere Zahl ausprobieren. (2) Haben Sie die resultierenden Umschreiberegeln überprüft? Stellen Sie außerdem sicher, dass Sie die Reihenfolge dieser Regeln überprüfen, während sie in ihrer Reihenfolge verarbeitet werden. Dump $GLOBALS['wp_rewrite']. (3) Haben Sie hinzugefügt, query_vars dass Konflikte auftreten könnten?
Kaiser

Antworten:


4

Ich habe eine Lösung gefunden! Ein Monkeyman Rewrite Analyzur-Plugin war sehr hilfreich: https://wordpress.org/plugins/monkeyman-rewrite-analyzer/

Also jetzt habe ich solche funktionierenden URLs ...

single.php:

/magazine-name/issue-year/issue/article-name

archive.php:

/magazine-name/issue-year/issue
/magazine-name/issue-year
/magazine-name

Auf einer benutzerdefinierten Post-Editor-Seite in wp-admin verwende ich das Plugin "Erweiterte benutzerdefinierte Felder" für das Ausgabejahr und die Ausgabe. Sie können Metafelder auch selbst definieren.

Als nächstes habe ich Rewrite-Tags für das Ausgabejahr und die Ausgabe hinzugefügt:

function custom_rewrite_tag() {
    add_rewrite_tag('%issue_year%', '([0-9]{4})' );
    add_rewrite_tag('%issue%', '([0-9]+)' );
}

add_action('init', 'custom_rewrite_tag');

Als Nächstes habe ich Umschreibregeln für eine beliebige Kombination von URLs hinzugefügt:

function custom_rewrite_rule() {
    // URL: /magazine/year/issue/title
    add_rewrite_rule('^([^/]+)/([0-9]{4})/([0-9])/(.?.+?)?(:/([0-9]+))?/?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]&name=$matches[4]', 'top');

    // URL: /magazine/year/issue
    add_rewrite_rule('^([^/]+)/([0-9]{4})/([0-9])?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]', 'top');

    // URL: /magazine/year
    add_rewrite_rule('^([^/]+)/([0-9]{4})?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]', 'top');
}

add_action('init', 'custom_rewrite_rule');

Am Ende ersetze ich meine eigenen Standard-URLs durch Ausgabejahr und Ausgabe

function custom_permalink($url, $post) {
    if ($post->post_type == 'magazine-name-1' || $post->post_type == 'magazine-name-2' || $post->post_type == 'magazine-name-2' ) {
        global $post;

        $post_type = $post->post_type;
        $issue_year = get_field('issue_year', $post->ID); // ACF; for meta: get_post_meta($post->ID, '$issue', true);
        $issue = get_field('issue', $post->ID); // ACF

        $url = str_replace( $post_type . '/', $post_type . '/' . $issue_year . '/' . $issue . '/' , $url);
    }
    return $url;
}
add_filter('post_type_link', 'custom_permalink', 10, 2);
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.