Regole di riscrittura personalizzate per pagina di archivio e singolo post


8

Sto costruendo un sito Wordpress con diversi tipi di post personalizzati. Ogni tipo di post è una rivista diversa. Ho anche un metacampo personalizzato per un anno ed una rivista.

Vorrei avere gli URL (usato archive.php):

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

L'ho fatto per codice:

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

e:

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

Ovviamente ho anche una query personalizzata in archive.php. E funziona benissimo.

Ma ora, i miei URL per singoli articoli non funzionano. Per impostazione predefinita, è:

http://my_site/magazine/post-title

ma mostra tutti gli articoli della rivista come url (e ha usato il modello archive.php):

http://my_site/magazine/

Come aggiungere correttamente le regole di riscrittura per singoli post personalizzati? È possibile, vorrei avere URL per singolo post (solo per i tipi di post personalizzati scelti) in questo formato:

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

Note multiple: (1) Il quarto argomento è il numero di argomenti che prende un filtro o un'azione. Ed 10è la priorità predefinita . Puoi lasciare entrambi in quel caso ... o provare un numero più alto. (2) Hai controllato le regole di riscrittura risultanti? Assicurati anche di controllare l'ordine di quelle regole mentre vengono elaborate nel loro ordine. Dump $GLOBALS['wp_rewrite']. (3) Hai aggiunto query_vars che potrebbe essere in conflitto?
Kaiser

Risposte:


4

Ho trovato una soluzione! Un plug-in Monkeyman Rewrite Analyzur è stato molto utile: https://wordpress.org/plugins/monkeyman-rewrite-analyzer/

Quindi ora ho tali URL funzionanti ...

single.php:

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

archive.php:

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

In una pagina di editor di post personalizzata in wp-admin uso il plug-in Advanced Custom Fields per l'anno di emissione e l'emissione. Puoi anche definire i metacampi da solo.

Successivamente ho aggiunto i tag di riscrittura per l'anno di emissione e il problema:

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

add_action('init', 'custom_rewrite_tag');

Successivamente, ho aggiunto le regole di riscrittura riscrittura per qualsiasi combinazione di 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');

Alla fine sostituisco gli URL standard per conto mio, con l'anno di emissione e l'emissione

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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.