Règles de réécriture personnalisées pour la page d'archive et la publication unique

8

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

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 également des requêtes personnalisées dans archive.php. Et ça marche bien.

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

http://my_site/magazine/post-title

mais il montre tous les articles du magazine comme url (et il a utilisé le modèle archive.php):

http://my_site/magazine/

Comment ajouter correctement des règles de réécriture pour des articles personnalisés uniques? Il est possible, je voudrais avoir des URL pour un seul message (uniquement pour les types de messages personnalisés choisis) dans ce format:

http://my_site/magazine/year/issue/post-title
Łukasz Florczak
la source
Notes multiples: (1) Le 4ème argument est le nombre d'arguments pris par un filtre ou une action. Et 10c'est la priorité par défaut . Vous pouvez laisser les deux dans ce cas… ou essayez un nombre plus élevé. (2) Avez-vous vérifié les règles de réécriture résultantes? Assurez-vous également de vérifier l'ordre de ces règles au fur et à mesure qu'elles sont traitées dans leur ordre. Dump $GLOBALS['wp_rewrite']. (3) Avez-vous ajouté query_vars que cela pourrait entrer en conflit?
kaiser

Réponses:

4

J'ai trouvé la solution! Un plugin 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'éditeur de publication personnalisée dans wp-admin, j'utilise le plugin Advanced Custom Fields pour l'année et le problème. Vous pouvez également définir vous-même des méta-champs.

Ensuite, j'ai ajouté des balises de réécriture pour l'année et le problème:

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 pour les miennes, avec l'année d'émission et l'édition

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);
Łukasz Florczak
la source