it-swarm.com.de

Benutzerdefinierte Umschreiberegeln für Archivseite und einzelnen Beitrag

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 (verwendete archive.php):

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

Ich habe es mit dem 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 verwendete die Vorlage archive.php):

http://my_site/magazine/

Wie füge ich Regeln für einzelne benutzerdefinierte Posts hinzu, die ordnungsgemäß neu geschrieben wurden? Es ist möglich, dass ich URLs für einen einzelnen Beitrag (nur für ausgewählte benutzerdefinierte Beitragstypen) in diesem Format haben möchte:

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

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

So, jetzt habe ich solche Arbeits-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 für 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 Ausgabejahr und 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 Regeln zum Umschreiben von URLs 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 Standard-URLs für meine eigenen mit 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);
4