Aturan penulisan ulang kustom untuk halaman arsip dan posting tunggal

8

Saya sedang membangun situs Wordpress dengan beberapa jenis posting khusus. Setiap jenis posting adalah majalah yang berbeda. Saya juga memiliki bidang meta khusus untuk tahun dan masalah majalah.

Saya ingin memiliki url (digunakan archive.php):

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

Saya membuatnya dengan kode:

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

dan:

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

Tentunya saya juga memiliki permintaan khusus di archive.php. Dan itu bekerja dengan baik.

Tapi sekarang, url saya untuk artikel tunggal tidak berfungsi. Secara default, itu adalah:

http://my_site/magazine/post-title

tapi tunjukkan semua artikel dari majalah seperti url (dan menggunakan templat archive.php):

http://my_site/magazine/

Bagaimana cara menambahkan aturan penulisan ulang yang benar untuk posting khusus tunggal? Mungkin saja, saya ingin memiliki url untuk posting tunggal (hanya untuk jenis posting khusus yang dipilih) dalam format ini:

http://my_site/magazine/year/issue/post-title
Łukasz Florczak
sumber
Beberapa catatan: (1) Argumen ke-4 adalah jumlah argumen yang diambil oleh filter atau tindakan. Dan 10merupakan prioritas standar . Anda dapat meninggalkan keduanya dalam kasus itu ... atau mencoba nomor yang lebih tinggi. (2) Apakah Anda sudah memeriksa aturan penulisan ulang yang dihasilkan? Pastikan juga Anda memeriksa urutan aturan-aturan tersebut saat diproses dalam urutannya. Dump $GLOBALS['wp_rewrite']. (3) Apakah Anda menambahkan query_vars bahwa mungkin bertentangan?
kaiser

Jawaban:

4

Saya menemukan solusi! Plugin Monkeyman Rewrite Analysiszur sangat membantu: https://wordpress.org/plugins/monkeyman-rewrite-analyzer/

Jadi sekarang, saya punya url yang berfungsi ...

single.php:

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

archive.php:

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

Pada halaman editor pos khusus di wp-admin saya menggunakan plugin Bidang Kustom Tingkat Lanjut untuk tahun dan masalah. Anda juga dapat menentukan bidang meta sendiri.

Selanjutnya saya menambahkan tag penulisan ulang untuk tahun dan masalah terbitan:

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

add_action('init', 'custom_rewrite_tag');

Selanjutnya, saya menambahkan penulisan ulang aturan penulisan ulang untuk setiap kombinasi 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');

Pada akhirnya saya mengganti url standar untuk saya sendiri, dengan tahun masalah dan masalah

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
sumber