web-dev-qa-db-fra.com

Règles de réécriture personnalisées pour les pages d'archive et les publications uniques

Je construis un site Wordpress avec plusieurs types de publication personnalisés. Chaque type de message est un magazine différent. J'ai aussi des méta-champs personnalisés pour une année de magazine et un numéro.

Je voudrais avoir des urls (utilisé archive.php):

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

Je l'ai fait par code:

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

et:

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

Bien sûr, j'ai aussi une requête personnalisée dans archive.php. Et ça marche bien.

Mais maintenant, mes URL d'articles individuels ne fonctionnent pas. Par défaut, c'est:

http://my_site/magazine/post-title

mais il affiche tous les articles du magazine comme url (et il utilise le modèle archive.php):

http://my_site/magazine/

Comment ajouter correctement les règles de réécriture pour les publications personnalisées uniques? C’est possible, je voudrais avoir des URLs pour un post (seulement pour les types de post personnalisés choisis) dans ce format:

http://my_site/magazine/year/issue/post-title
8
Łukasz Florczak

J'ai trouvé la solution! Un plug-in Monkeyman Rewrite Analyzur a été très utile: https://wordpress.org/plugins/monkeyman-rewrite-analyzer/

Alors maintenant, j'ai de telles URL de travail ...

single.php:

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

archive.php:

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

Sur une page d'édition personnalisée dans wp-admin, j'utilise le plug-in Advanced Custom Fields pour l'année et le numéro. Vous pouvez également définir vous-même des champs méta.

Ensuite, j'ai ajouté des balises de réécriture pour l'année et le numéro:

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

add_action('init', 'custom_rewrite_tag');

Ensuite, j'ai ajouté des règles de réécriture pour toute combinaison d'URL:

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

À la fin, je remplace les URL standard par les miennes, avec année de publication et numéro de publication.

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
Łukasz Florczak