Hapus siput dari URL posting jenis posting khusus

48

Tampaknya semua sumber daya web berdasarkan subjek menghapus siput tipe pos kustom

yourdomain.com/CPT-SLUG/post-name 

sekarang solusi yang sangat usang sering merujuk pra instal WP versi 3.5 menginstal. Yang umum adalah:

'rewrite'   => array( 'slug' => false, 'with_front' => false ),  

dalam fungsi register_post_type Anda. Ini tidak lagi berfungsi dan menyesatkan. Jadi saya bertanya kepada komunitas di Q3 2018 di tepi WordPress 5 ...

Apa cara modern dan efisien untuk menghapus Slug Jenis Kiriman dari URL kiriman Jenis Kiriman Kustom dari dalam argumen penulisan ulang atau di mana pun?

UPDATE: Tampaknya ada beberapa cara untuk memaksa ini bekerja dengan regex. Khususnya jawaban dari Jan Beck jika Anda secara konsisten bersedia memantau pembuatan konten untuk memastikan tidak ada halaman / posting yang saling bertentangan dibuat .... Namun saya yakin bahwa ini adalah kelemahan utama dalam inti WP di mana harus ditangani untuk kami . Baik sebagai opsi / kait saat membuat CPT atau opsi opsi lanjutan untuk permalink. Tolong dukung tiket trek.

Catatan Kaki: Tolong dukung tiket trac ini dengan menonton / mempromosikannya: https://core.trac.wordpress.org/ticket/34136#ticket

Ben Racicot
sumber
Saya kira saya menggaruk-garuk kepala mengapa Anda ingin melakukan itu? Bingung.
Michael Ecklund
3
@MichaelEcklund karena CPT apa pun yang digunakan untuk membuat halaman web yang menghadap publik memiliki nama siput paksa di URL. Sebenarnya ada banyak wp devs yang ingin melepaskan siput dengan aman.
Ben Racicot

Jawaban:

60

Kode berikut akan berfungsi, tetapi Anda harus ingat bahwa konflik dapat terjadi dengan mudah jika siput untuk jenis posting kustom Anda sama dengan halaman atau siput posting ...

Pertama, kami akan menghapus siput dari permalink:

function na_remove_slug( $post_link, $post, $leavename ) {

    if ( 'events' != $post->post_type || 'publish' != $post->post_status ) {
        return $post_link;
    }

    $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

    return $post_link;
}
add_filter( 'post_type_link', 'na_remove_slug', 10, 3 );

Menghapus siput saja tidak cukup. Saat ini, Anda akan mendapatkan halaman 404 karena WordPress hanya mengharapkan posting dan halaman berperilaku seperti ini. Anda juga perlu menambahkan yang berikut:

function na_parse_request( $query ) {

    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
        return;
    }

    if ( ! empty( $query->query['name'] ) ) {
        $query->set( 'post_type', array( 'post', 'events', 'page' ) );
    }
}
add_action( 'pre_get_posts', 'na_parse_request' );

Cukup ubah "acara" ke jenis pos kustom Anda dan Anda siap melakukannya. Anda mungkin perlu menyegarkan permalink Anda.

Nate Allen
sumber
Terima kasih. Apakah Anda pikir ini lebih baik daripada membuat penulisan ulang secara manual? Saya telah melihat solusi itu dan mungkin menjaga konflik yang Anda sembunyikan?
Ben Racicot
1
Gagal dengan nginx karena kondisinya 2 != count( $query->query ). Dengan nginx, Anda dapat memiliki $ query-> query sebagai array('page' => '', 'name' => '...', 'q' => '...'). Jadi @NateAllen, apa arti dari kondisi itu?
Fabio Montefuscolo
3
Kami membutuhkan sesuatu yang lebih baik dari ini. Dukungan untuk menghapus siput bawaan sehingga kami tidak dapat membuat URL yang bertentangan nanti. Cara posting dan halaman reguler membuat URL mereka.
Ben Racicot
3
Apakah hanya saya atau ini mematahkan beberapa tag bersyarat wordpress seperti is_single () dan is_singular ()?
rob-gordon
1
Solusi ini sayangnya menyebabkan beberapa tautan rusak dan blog saya berhenti menunjukkan posting dan hanya halaman biasa. Lihat solusi yang lebih baik di bawah ini oleh Matt Keys.
Radley Sustaire
20

Tulis kode berikut ke dalam pendaftaran taksonomi.

'rewrite' => [
  'slug' => '/',
  'with_front' => false
]

Hal terpenting yang harus Anda lakukan setelah mengganti kode

Setelah Anda mengubah dokumen taksonomi jenis pos kustom, coba buka Pengaturan> Permalinks dan simpan kembali pengaturan Anda , jika tidak, Anda akan mendapatkan 404 halaman tidak ditemukan.

Periksa di sini untuk solusi terbaik: http://www.krazzycodes.com/how-to-remove-custom-post-type-taxonomy-base-from-url-in-wordpress/

Mayank Dudakiya
sumber
Ini benar-benar berfungsi, saya tidak tahu bagaimana tidak ada yang memperhatikan ini sebelumnya. Tentu saja ini dapat mengganggu halaman lain jika mereka memiliki permalink yang sama, tetapi jika tidak ini adalah solusi yang bagus.
Aleksandar Đorđević
4
Sudah mencoba ini. Ini memberikan hasil yang diinginkan untuk tautan jenis posting khusus saya. Namun 'menangkap' semua siput jenis posting POST atau PAGE dan mencoba menyelesaikannya sebagai URL untuk jenis posting kustom saya, kemudian 404-an. (ya saya sudah menyimpan tautan permanen).
Matt Keys
4
Ini tidak berfungsi. Memberi 404 bahkan ketika Anda memperbarui permalink.
Christine Cooper
3
Sekali lagi, bahkan setelah menyimpan kembali pengaturan permalink, posting dan halaman tidak lagi berfungsi (404)
amklose
1
Solusi ini berfungsi untuk menghapus siput dari URL. Tetapi halaman arsip tidak berfungsi lagi.
Annapurna
13

Saya mencoba mencari tahu ini belum lama ini dan jawaban singkat dari apa yang saya tahu adalah tidak . Paling tidak dari dalam argumen menulis ulang.

Penjelasan panjang menjadi jelas jika Anda melihat kode aktual register_post_typepada baris wp-include / post.php 1454 :

add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );

Anda dapat melihatnya awalan $args->rewrite['slug']ke %$post_type%tag penulisan ulang. Orang bisa berpikir "mari kita atur siput nullitu" sampai Anda melihat beberapa baris:

if ( empty( $args->rewrite['slug'] ) )
    $args->rewrite['slug'] = $post_type;

Anda dapat melihat bahwa fungsi selalu mengharapkan nilai slug yang tidak kosong dan menggunakan tipe posting.

Jan Beck
sumber
Terima kasih @JanBeck. Apakah ada alasan utama untuk ini ada? Mengapa tidak meretas file inti ini dengan syarat untuk menghilangkan jenis posting tertentu dari aturan ini?
Ben Racicot
9
Anda harus memberikan jawaban kepada Jan Beck. WordPress membutuhkan siput post_type untuk merutekan permintaan dengan benar. Aturan ini mencegah konflik penamaan antara halaman WP asli (yang menyajikan tanpa siput) dan jenis posting yang ditentukan khusus. Jika Anda meretas siput maka WordPress tidak akan tahu perbedaan antara halaman bernama "piknik" dan acara (tipe pos khusus) bernama "piknik".
dswebsme
3
@dswebsme Setuju, tetapi ada situasi di mana Anda benar-benar harus mengubah URL. Jadi selain dari mengapa Anda tidak bisa secara asli dan tidak seharusnya, bagaimana Anda melakukannya dengan efisien?
Ben Racicot
7

Menanggapi jawaban saya sebelumnya : Anda tentu saja dapat mengatur rewriteparameter falseketika mendaftarkan jenis posting baru dan menangani sendiri aturan penulisan ulang seperti

<?php
function wpsx203951_custom_init() {

    $post_type = 'event';
    $args = (object) array(
        'public'      => true,
        'label'       => 'Events',
        'rewrite'     => false, // always set this to false
        'has_archive' => true
    );
    register_post_type( $post_type, $args );

    // these are your actual rewrite arguments
    $args->rewrite = array(
        'slug' => 'calendar'
    );

    // everything what follows is from the register_post_type function
    if ( is_admin() || '' != get_option( 'permalink_structure' ) ) {

        if ( ! is_array( $args->rewrite ) )
            $args->rewrite = array();
        if ( empty( $args->rewrite['slug'] ) )
            $args->rewrite['slug'] = $post_type;
        if ( ! isset( $args->rewrite['with_front'] ) )
            $args->rewrite['with_front'] = true;
        if ( ! isset( $args->rewrite['pages'] ) )
            $args->rewrite['pages'] = true;
        if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive )
            $args->rewrite['feeds'] = (bool) $args->has_archive;
        if ( ! isset( $args->rewrite['ep_mask'] ) ) {
            if ( isset( $args->permalink_epmask ) )
                $args->rewrite['ep_mask'] = $args->permalink_epmask;
            else
                $args->rewrite['ep_mask'] = EP_PERMALINK;
        }

        if ( $args->hierarchical )
            add_rewrite_tag( "%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&pagename=" );
        else
            add_rewrite_tag( "%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=" );

        if ( $args->has_archive ) {
            $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive;
            if ( $args->rewrite['with_front'] )
                $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
            else
                $archive_slug = $wp_rewrite->root . $archive_slug;

            add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
            if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) {
                $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
                add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
                add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
            }
            if ( $args->rewrite['pages'] )
                add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' );
        }

        $permastruct_args = $args->rewrite;
        $permastruct_args['feed'] = $permastruct_args['feeds'];
        add_permastruct( $post_type, "%$post_type%", $permastruct_args );
    }
}
add_action( 'init', 'wpsx203951_custom_init' );

Anda dapat melihat add_permastructpanggilan sekarang tidak termasuk siput lagi. Saya menguji dua skenario:

  1. Ketika saya membuat halaman dengan "kalender" siput halaman itu ditimpa oleh arsip jenis posting yang juga menggunakan siput "kalender".

masukkan deskripsi gambar di sini

  1. Ketika saya membuat halaman dengan slug "my-event" dan sebuah event (CPT) dengan slug "my-event", jenis posting kustom ditampilkan.

masukkan deskripsi gambar di sini

  1. Halaman lain tidak berfungsi juga. Jika Anda melihat gambar di atas menjadi jelas mengapa: aturan jenis posting kustom akan selalu cocok dengan siput halaman. Karena WordPress tidak memiliki cara untuk mengidentifikasi apakah itu halaman atau jenis posting kustom yang tidak ada, itu akan kembali 404. Itulah mengapa Anda perlu siput untuk mengidentifikasi halaman atau CPT. Solusi yang mungkin adalah mencegat kesalahan dan mencari halaman yang mungkin ada mirip dengan jawaban ini .
Jan Beck
sumber
Jadi jika tujuannya adalah untuk menghapus siput untuk CPT, bisakah kita memberi nama CPT sesuatu yang unik yang tidak akan bertabrakan karena tidak akan pernah terlihat di URL? Atau apakah nama-pos kemungkinan konflik jika dinamai sama dengan halaman?
Ben Racicot
Saya telah memperbarui jawaban saya untuk menunjukkan bahwa ini benar-benar memecah semua halaman. Tanpa siput, WP akan mencari CPT alih-alih halaman dan jika tidak menemukannya, kembalikan kesalahan. Jadi itu sebenarnya tidak terkait dengan nama pos.
Jan Beck
1
Saya melihat. Seharusnya ada aturan penulisan ulang yang menambahkan '-1' ke URL yang bertentangan di masa depan seperti halaman WP asli vs halaman. Saya telah membuat tiket trac core.trac.wordpress.org/ticket/34136#ticket akan menyukai pikiran Anda.
Ben Racicot
7

Melihat melalui jawaban di sini saya pikir ada ruang untuk solusi yang lebih baik yang menggabungkan beberapa hal yang saya pelajari di atas dan menambahkan deteksi otomatis dan pencegahan siput pos duplikat.

CATATAN: Pastikan Anda mengubah 'custom_post_type' untuk nama CPT Anda sendiri di seluruh contoh saya di bawah ini. Ada banyak kejadian, dan 'temukan / ganti' adalah cara mudah untuk menangkap semuanya. Semua kode ini bisa masuk ke functions.php Anda atau dalam sebuah plugin.

Langkah 1: Nonaktifkan penulisan ulang pada jenis posting kustom Anda dengan mengatur penulisan ulang ke 'false' ketika Anda mendaftarkan posting:

register_post_type( 'custom_post_type',
    array(
        'rewrite' => false
    )
);

Langkah 2: Secara manual menambahkan penulisan ulang kustom kami ke bagian bawah penulisan ulang WordPress untuk custom_post_type kami

function custom_post_type_rewrites() {
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/embed/?$', 'index.php?custom_post_type=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/trackback/?$', 'index.php?custom_post_type=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '([^/]+)/page/?([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&paged=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)(?:/([0-9]+))?/?$', 'index.php?custom_post_type=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
}
add_action( 'init', 'custom_post_type_rewrites' );

CATATAN: Bergantung pada kebutuhan Anda, Anda mungkin ingin memodifikasi penulisan ulang di atas (nonaktifkan trackback? Feed ?, dll). Ini mewakili jenis penulisan ulang 'default' yang akan dihasilkan jika Anda tidak menonaktifkan penulisan ulang di langkah 1

Langkah 3: Buat tautan permanen ke jenis posting khusus Anda 'cantik' lagi

function custom_post_type_permalinks( $post_link, $post, $leavename ) {
    if ( isset( $post->post_type ) && 'custom_post_type' == $post->post_type ) {
        $post_link = home_url( $post->post_name );
    }

    return $post_link;
}
add_filter( 'post_type_link', 'custom_post_type_permalinks', 10, 3 );

CATATAN: Anda dapat berhenti di sini jika Anda tidak khawatir tentang pengguna Anda membuat posting (duplikat) yang saling bertentangan dalam jenis posting lain yang akan menciptakan situasi di mana hanya satu dari mereka yang dapat memuat ketika halaman diminta.

Langkah 4: Mencegah duplikat posting siput

function prevent_slug_duplicates( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
    $check_post_types = array(
        'post',
        'page',
        'custom_post_type'
    );

    if ( ! in_array( $post_type, $check_post_types ) ) {
        return $slug;
    }

    if ( 'custom_post_type' == $post_type ) {
        // Saving a custom_post_type post, check for duplicates in POST or PAGE post types
        $post_match = get_page_by_path( $slug, 'OBJECT', 'post' );
        $page_match = get_page_by_path( $slug, 'OBJECT', 'page' );

        if ( $post_match || $page_match ) {
            $slug .= '-duplicate';
        }
    } else {
        // Saving a POST or PAGE, check for duplicates in custom_post_type post type
        $custom_post_type_match = get_page_by_path( $slug, 'OBJECT', 'custom_post_type' );

        if ( $custom_post_type_match ) {
            $slug .= '-duplicate';
        }
    }

    return $slug;
}
add_filter( 'wp_unique_post_slug', 'prevent_slug_duplicates', 10, 6 );

CATATAN: Ini akan menambahkan string '-duplikat' ke akhir setiap siput duplikat. Kode ini tidak dapat mencegah duplikat siput jika sudah ada sebelum menerapkan solusi ini. Pastikan untuk memeriksa duplikat terlebih dahulu.

Saya akan senang mendengar kabar dari orang lain yang mencoba untuk melihat apakah itu bekerja dengan baik untuk mereka juga.

Matt Keys
sumber
Baru saja mengujinya dan sepertinya masih berfungsi sejauh ini.
Christine Cooper
Berharap untuk pendekatan ini, tetapi memberi saya 404 pada posting CPT saya, bahkan setelah menyimpan kembali Permalinks.
Garconis
Maaf itu tidak berhasil untuk Anda, Garconis. Saya telah berbicara dengan orang lain tentang ini beberapa waktu lalu dan mereka juga mengalami masalah dengan itu di situs mereka. Sepertinya saya ingat bahwa itu penting jika posting blog Anda memiliki tautan awal. Di situs saya mengembangkan ini untuk posting blog menggunakan struktur permalink: / blog /% postname% /. Jika Anda tidak memiliki awalan pada posting blog Anda, dan Anda dapat melakukannya, cobalah dan beri tahu saya bagaimana kelanjutannya!
Matt Keys
2
Ini berhasil untuk saya. Tidak seperti solusi lain pada halaman, itu tidak merusak halaman normal atau tata letak blog, dan tidak menyebabkan pengalihan yang tak terbatas. Bahkan menampilkan URL yang benar di area "Permalink" saat mengedit halaman-halaman cpt tersebut. Solusi yang cukup bagus di sini, satu-satunya peringatan adalah bahwa halaman arsip tidak berfungsi. INGAT untuk menukar "custom_post_type" dan menyegarkan permalink Anda sesudahnya .
Radley Sustaire
@MattKeys, Pengaturan Permalink default memiliki Struktur Kustom /%category%/%postname%/. Saat menambahkan kode Anda, siput CPT terlihat OK (meskipun tidak ada tanda garis miring) ... dan pemeriksa konflik juga berfungsi. Tapi hasil posting sebenarnya pada 404.
Garconis
1

Anda tidak membutuhkan begitu banyak kode keras. Cukup gunakan plugin yang ringan:

Ini memiliki opsi yang dapat disesuaikan.

T.Todua
sumber
Sekarang saya tahu mengapa Anda downvoted, ini mencegah penyelesaian tautan halaman normal. Saya tidak melihatnya karena saya mendapatkan salinan cache dari halaman yang ada meskipun menyegarkan.
Walf
@Walf Bisakah Anda memberi tahu saya tentang masalah ini secara terperinci?
T.Todua
Tautan berikut ke halaman (yang bukan tipe posting khusus) dari menu utama memberi 404 kesalahan, seolah-olah halaman itu tidak ada; itu dia.
Walf
@ Apakah Anda bisa memberi saya contoh url dari kesempatan Anda? (Anda dapat menutupi nama domain jika Anda mau, saya hanya perlu contoh ex) terima kasih, saya akan memperbaruinya
T.Todua
1

Punya masalah yang sama di sini dan sepertinya tidak ada gerakan di situs wordpress. Dalam situasi khusus saya di mana untuk posting blog tunggal struktur / blog /% postname% / diperlukan solusi ini

https://kellenmace.com/remove-custom-post-type-slug-from-permalinks/

berakhir pada sekelompok 404-an

Tetapi bersama dengan pendekatan yang luar biasa ini, yang tidak menggunakan strukture permalink backend untuk blogpost akhirnya berfungsi seperti charme. https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/

Terima kasih banyak.

Friedrich Siever
sumber
0

dan kami dapat membuat beberapa perubahan pada fungsi yang disebutkan di atas:

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {
    $query->set( 'post_type', array( 'post', 'events', 'page' ) );
}
}

untuk:

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {

    global $wpdb;
    $pt = $wpdb->get_var(
        "SELECT post_type FROM `{$wpdb->posts}` " .
        "WHERE post_name = '{$query->query['name']}'"
    );
    $query->set( 'post_type', $pt );
}
}

untuk mengatur nilai post_type yang tepat.

Max Kondrachuk
sumber
0

Ini bekerja untuk saya: 'rewrite' => array('slug' => '/')

Malki Mohamed
sumber
1
Ini tidak berfungsi. Memberi 404 bahkan ketika Anda memperbarui permalink.
Christine Cooper
0

Bagi siapa pun yang membaca ini yang memiliki masalah dengan posting anak-anak seperti saya, saya menemukan cara terbaik adalah menambahkan aturan penulisan ulang Anda sendiri.

Masalah utama yang saya alami adalah bahwa WordPress memperlakukan pengalihan dari halaman yang memiliki 2 level (posting anak) sedikit berbeda dari yang memperlakukan 3 level dalam (posting anak-anak).

Itu berarti ketika saya memiliki / post-type / post-name / post-child / saya dapat menggunakan / post-name / post-child dan itu akan mengarahkan saya ke yang dengan post-type di depan tetapi jika saya memiliki post-type / post-name / post-child / post-grandchild maka saya tidak bisa menggunakan post-name / post-child / post-grandchild.

Melihat ke aturan penulisan ulang sepertinya cocok untuk hal-hal selain pagename di tingkat pertama dan kedua (saya pikir tingkat kedua cocok dengan lampiran) dan kemudian melakukan sesuatu di sana untuk mengarahkan Anda ke pos yang tepat. Pada kedalaman tiga tingkat itu tidak berhasil.

Hal pertama yang perlu Anda lakukan adalah menghapus tautan jenis kiriman dari anak-anak juga. Logika ini harus terjadi di sini jika Anda melihat jawaban Nate Allen di atas:

$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

Saya sendiri menggunakan campuran kondisional berbeda untuk memeriksa apakah posting memiliki anak dan yang lainnya untuk mendapatkan permalink yang tepat. Bagian ini tidak terlalu rumit dan Anda akan menemukan contoh orang melakukannya di tempat lain.

Namun langkah selanjutnya adalah di mana segala sesuatu berubah dari jawaban yang diberikan. Alih-alih menambahkan hal-hal ke permintaan utama (yang berfungsi untuk pos kustom dan anak-anak mereka tetapi tidak untuk anak-anak lebih lanjut), saya menambahkan penulisan ulang yang masuk ke bagian bawah aturan WordPress sehingga jika pagename tidak memeriksa dan akan segera tekan 404 itu akan melakukan satu pemeriksaan terakhir untuk melihat apakah halaman dalam jenis posting kustom memiliki nama yang sama kalau tidak akan membuang 404.

Inilah aturan penulisan ulang yang saya gunakan dengan anggapan 'event' adalah nama CPT Anda

function rewrite_rules_for_removing_post_type_slug()
{
    add_rewrite_rule(
        '(.?.+?)?(:/([0-9]+))?/?$',
        'index.php?event=$matches[1]/$matches[2]&post_type=event',
        'bottom'
    );
}

add_action('init', 'rewrite_rules_for_removing_post_type_slug', 1, 1);

Semoga ini bisa membantu orang lain, saya tidak dapat menemukan hal lain yang berhubungan dengan child of child post dan menghapus siput dari itu.

Moe Loubani
sumber
Tampaknya ada kesalahan ketik di regex. Antara '(:' a '?' Diperlukan untuk menggunakannya sebagai sub-pola non-capture => '(?:'. Yang ketiga? Tampaknya salah tempat karena memungkinkan sub-pola pertama yang kosong. Seharusnya ditempatkan di antara (dan:. Tanpa kesalahan ketik ini, ekspresi akan sama dengan yang dapat ditemukan untuk 'halaman' jenis pos
bawaan