Özel yazı tipi yayın URL'lerinden sümüklü böcekleri kaldırın


48

Özel bir yazı tipi slug kaldırılması konusuna dayanan tüm web kaynaklarının yani

yourdomain.com/CPT-SLUG/post-name 

Şimdi çok WP sürüm 3.5 yüklemeler öncesi başvurulan çok eski çözümler. Ortak bir şey:

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

register_post_type işlevinizde. Bu artık işe yaramıyor ve yanıltıcı. Bu yüzden topluluğa 3. 2018’de WordPress 5’in eşiğinde ...

Post Type Slug'ı Özel Post Type post'unun URL'sinden yeniden yazma argümanından veya başka bir yerden kaldırmanın modern ve etkili yolları nelerdir?

GÜNCELLEME: Bunu regex ile çalışmaya zorlamanın birkaç yolu var gibi görünüyor. Özellikle, Jan Beck'in cevabı, çelişkili sayfa / gönderi adları oluşturulmadığından emin olmak için sürekli olarak içerik oluşturmayı izlemeye istekli olmanız gerekir. . Hem bir CPT yaratırken bir seçenek / kanca veya kalıcı bağlantılar için gelişmiş bir seçenek kümesi. Lütfen parça biletini destekleyin.

Dipnot: Lütfen bu trac biletini izleyerek / tanıtarak destekleyin: https://core.trac.wordpress.org/ticket/34136#ticket


Sanırım neden bunu yapmak istediğin konusunda kafamı kaşıyor muyum? Şaşkın.
Michael Ecklund

3
@MichaelEcklund, halka açık web sayfaları oluşturmak için kullanılan herhangi bir CPT’nin URL’de zorunlu bir sümüklü böcek adı olduğundan dolayı. Aslında sümüklü böcek güvenli bir şekilde çıkarmak isteyen pek çok wp dev var.
Ben Racicot

Yanıtlar:


60

Aşağıdaki kod işe yarayacaktır, ancak yalnızca özel yazı türünüz için bir sayfa ya da yazının yazı tipi ile aynı olması durumunda çakışmaların kolayca olabileceğini aklınızda tutmanız gerekir.

İlk önce, sümüklüböceği kalıcı bağlantıdan kaldırırız:

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

Sadece sümüklü böcek kaldırmak yeterli değil. Şu anda, 404 sayfa alacaksınız çünkü WordPress yalnızca gönderilerin ve sayfaların bu şekilde davranmasını bekliyor. Ayrıca, aşağıdakileri de eklemeniz gerekir:

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

Sadece "etkinlikler" i özel gönderi türünüze göre değiştirin; Kalıcı bağlantılarınızı yenilemeniz gerekebilir.


Teşekkürler. Bunun yeniden yazmaları elle yapmaktan daha iyi olduğunu mu düşünüyorsun? Bu çözümü gördüm ve bahsettiğiniz çatışmaları uzak tutabilir mi?
Ben Racicot

1
Durum nginx ile başarısız olur 2 != count( $query->query ). Nginx ile $ query-> query olarak sahip olabilirsiniz array('page' => '', 'name' => '...', 'q' => '...'). Öyleyse @NateAllen, bu koşulun anlamı nedir?
Fabio Montefuscolo

3
Bundan daha iyi bir şeye ihtiyacımız var. Daha sonra birbiriyle çakışan URL'ler oluşturamamamız için yerleşik sümüklü böcekleri kaldırma desteği. Normal yayınların ve sayfaların URL'lerini oluşturma biçimi.
Ben Racicot

3
Sadece ben miyim yoksa bu, is_single () ve is_singular () gibi bir takım kelime ifadesi koşullu etiketleri bozuyor mu?
rob-gordon

1
Bu çözüm ne yazık ki bazı linklerin kopmasına neden oldu ve blogum gönderileri göstermeyi bıraktı ve sadece normal bir sayfa oldu. Matt Keys tarafından aşağıda daha iyi bir çözüm görün.
Radley Sustaire

20

Taksonomi kaydına aşağıdaki kodu yazın.

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

Kod değiştirdikten sonra yapmanız gereken en önemli şey

Eğer özel yayın tipi sınıflandırma belgesi değişmiş sonra, gidin çalışın Ayarlar> Kalıcı Bağlantılar ve ayarlarınıza yeniden kaydetme , başka 404 sayfa bulunamadı alacak.

En iyi çözüm için buraya göz atın: http://www.krazzycodes.com/how-to-remove-custom-post-type-taxonomy-base-from-url-in-wordpress/


Bu gerçekten işe yarıyor, daha önce kimsenin bunu farketmediğini bilmiyorum. Elbette bu, aynı kalıcı bağlantıya sahip olmaları durumunda diğer sayfalara müdahale edebilir, ancak değilse de harika bir çözümdür.
Aleksandar Đorđević

4
Bunu denedim. Özel yazı tipi bağlantılarım için istenen sonucu verir. Bununla birlikte, tüm POST veya PAGE yazı tipini sümükler 'yakalar' ve bunları özel yazı tipim, sonra 404'ler için bir URL olarak çözmeye çalışır. (evet, kalıcı bağlantıları kurtardım).
Matt Keys

4
Bu işe yaramıyor. Permalinkleri güncellesen bile 404 verir.
Christine Cooper

3
Yine, kalıcı bağlantı ayarlarını yeniden kaydettikten sonra bile, yazılar ve sayfalar artık çalışmaz (404)
saat

1
Bu çözüm, kurşunun URL’den kaldırılması için çalışır. Ancak arşiv sayfaları artık çalışmıyor.
Annapurna

13

Bunu çok uzun zaman önce anlamaya çalıştım ve bildiğimden gelen kısa cevap hayır . En azından yeniden yazma argümanında değil.

Eğer gerçek koduna bakarsak uzun açıklama belirginleşir register_post_typeiçinde wp-includes / post.php hattını 1454 :

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

Bunu önek görebilirsiniz $args->rewrite['slug']için %$post_type%yeniden yazma etiketi. Biri nullbir kaç sıra görünene kadar " sümüklü böcekleri daha sonra ayarlayalım" diye düşünebilir :

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

İşlevin her zaman boş olmayan bir sümük değeri beklediğini ve yazı tipini kullandığını görebilirsiniz.


@JanBeck teşekkürler. Bunun varlığının önemli bir nedeni var mı? Neden bu yazı tipini bu kuraldaki belirli yazı tiplerini atlamak için şartlı olarak hacklemiyorsunuz?
Ben Racicot

9
Cevabı Jan Beck'e vermelisin. WordPress, istekleri doğru bir şekilde yönlendirmek için post_type slug'una ihtiyaç duyuyor. Bu kural, yerel WP sayfaları (sümüklü böcek olmadan oluşturma) ve özel tanımlı posta türleri arasında adlandırma çakışmalarını önler. Sümüklü böcekleri keserseniz, WordPress "piknik" adlı bir sayfa ile "piknik" adlı bir etkinlik (özel posta türü) arasındaki farkı bilemez.
dswebsme 30:15

3
@dswebsme Kabul edildi, ancak URL’yi kesinlikle değiştirmeniz gereken durumlar var. Peki neden yerel olarak yapamıyor ve yapmamanız dışında, bunu nasıl verimli bir şekilde yapıyorsunuz?
Ben Racicot

7

Yanıt olarak önceki cevap : Eğer tabii ayarlayabilirsiniz rewriteparametreyi falseyeni bir yazı tipini kaydederken ve kendinizi bu yüzden mi kuralları yeniden ele

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

Gördüğünüz gibi add_permastructçağrı artık sümüklü böcek içermiyor. İki senaryo test ettim:

  1. Slug "calendar" ile bir sayfa oluşturduğumda, bu sayfanın üzerine "calendar" slug'u da kullanan yazı tipi arşivi yazılır.

görüntü tanımını buraya girin

  1. "My-event" başlıklı bir sayfa ve "my-event" başlıklı bir etkinlik (CPT) oluşturduğumda, özel yazı tipi görüntülenir.

görüntü tanımını buraya girin

  1. Başka hiçbir sayfa da çalışmaz. Yukarıdaki resme bakarsanız neden belli olur: özel yazı tipi kuralı her zaman bir sayfa fişiyle eşleşecektir. WordPress'in bir sayfa mı yoksa yoksa özel bir yazı tipi mi olduğunu belirleme yöntemi bulunmadığından 404 değerini döndürür. Bu nedenle, sayfayı veya CPT'yi tanımlamak için bir bilgi birikimine ihtiyacınız vardır. Muhtemel bir çözüm, hatayı durdurup bu cevaba benzer bir sayfa arayabilir .

Öyleyse hedef, CPT'lerin sümüklü böceklerini kaldırmaksa, CPT'ye, URL’de hiç görülmeyeceği için çarpışmayacak benzersiz bir şey adlandırabilir miyiz? Veya, sayfa adıyla aynı şekilde adlandırılmışsa, ad adı olası çakışma mıdır?
Ben Racicot

Bunun aslında tüm sayfaları kırdığını göstermek için cevabımı güncelledim . Sümüklü böcek olmadan WP sayfa yerine CPT arar ve bulamazsa bir hata döndürür. Yani aslında post-adı ile ilgili değil.
Jan Beck

1
Anlıyorum. Gelecekte birbiriyle çelişen URL'lere, sayfalar gibi yerel WP yayınlarına '-1' ekleyen yeniden yazma kuralları olmalıdır. Bir trac bilet yarattım core.trac.wordpress.org/ticket/34136#ticket düşüncelerinize bayılacak.
Ben Racicot

7

Buradaki cevaplara bakarak, yukarıda öğrendiğim bazı şeyleri birleştiren ve yinelenen post sümüklü böceklerin otomatik algılanmasını ve önlenmesini ekleyen daha iyi bir çözüme yer olduğunu düşünüyorum.

NOT: Aşağıdaki örneğim boyunca kendi CPT adınız için 'custom_post_type' öğesini değiştirdiğinizden emin olun. Birçok olay vardır ve 'bul / değiştir' hepsini yakalamanın kolay bir yoludur. Bu kodun tümü functions.php dosyasına veya bir eklentiye girebilir.

Adım 1: Gönderiyi kaydettiğinizde yeniden yazmaları 'false' olarak ayarlayarak özel yazı türünüzdeki yeniden yazmaları devre dışı bırakın:

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

Adım 2: Özel yeniden yazmalarımızı, custom_post_type için WordPress yeniden yazmalarının altına elle ekleyin.

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

NOT: İhtiyaçlarınıza bağlı olarak, yukarıdaki tekrar yazmaları değiştirmek isteyebilirsiniz (geri izlemeleri devre dışı bırak? Beslemeleri? Vb.). Bunlar, 1. adımdaki yeniden yazmaları devre dışı bırakmazsanız oluşturulmuş olan 'varsayılan' yeniden yazma türlerini temsil eder.

3. Adım: Özel yazı türünüze tekrar 'güzel' olarak kalıcı bağlantılar kurun

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

NOT: Kullanıcılarınızın, sayfa istendiğinde yalnızca birinin yükleyebileceği bir durum oluşturacak başka bir gönderi türünde çakışan (yinelenen) bir gönderi oluşturma konusunda endişelenmiyorsanız burada durabilirsiniz.

Adım 4: Çift posta sümüklü böceklerini engelleyin

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

Not: Bu '-duplicate' dizesini yinelenen tüm sümüklerin sonuna ekler. Bu kod, bu çözümü uygulamadan önce mevcutsa, yinelenen sümüklü böcekleri engelleyemez. Önce kopyaları kontrol ettiğinizden emin olun.

Bunu kendileri için de işe yarayıp yaramadığını görmek için gitmek isteyen başka birinden geri duymak isterim.


Sadece test ettim ve şimdiye kadar çalışıyor gibi görünüyor.
Christine Cooper

Bu yaklaşım için umut vericiydi, ancak Permalink'leri yeniden sattıktan sonra bile CPT postalarımda bana 404 veriyor.
Garconis

Üzgünüm sizin için işe yaramadı Garconis. Bir süre önce bu konuda başka biriyle konuşuyordum ve kendi sitelerinde de problemleri vardı. Blog yazılarınızın kalıcı bağlantılarının üzerinde bir öneki olup olmadığını fark etmiş gibi görünüyorum. Bu blog yazı için geliştirdiğim sitede permalink yapısını kullanıyoruz: / blog /% postname% /. Blog postalarınızda bir ön ekiniz yoksa ve yapmanız kabul edilebilirse, deneyin ve nasıl gideceğini bana bildirin!
Matt Keys

2
Bu benim için çalıştı. Sayfadaki diğer çözümlerden farklı olarak, normal sayfaları veya blog düzenini bozmadı ve sonsuz yönlendirmelere neden olmadı. Bu cpt sayfalarını düzenlerken "Permalink" alanındaki doğru URL'yi bile gösterir. Burada oldukça iyi bir çözüm var, sadece uyarı, arşiv sayfasının çalışmadığıdır. UNUTMAYIN "custom_post_type" takas ve sonradan kalıcı bağlantıları yenilemek .
Radley Sustaire,

@MattKeys, varsayılan Permalink Ayarlarının bir Özel Yapısı vardır /%category%/%postname%/. Kodunuzu eklerken, CPT sümüklü böcekleri Tamam görünüyor (sondaki eğik çizginin eksik olmasına rağmen) ... ve çakışma denetleyicisi de çalışıyor. Ancak asıl gönderi 404'te sonuçlandı.
Garconis, 14

1

Çok fazla zor kod gerekmez. Sadece hafif bir eklenti kullanın:

Özelleştirilebilir seçeneklere sahiptir.


Artık neden reddedildiğinizi biliyorum, normal sayfa bağlantılarının çözümlenmesini engelliyor. Görmedim, çünkü yenilenmeye rağmen mevcut sayfaların önbellek kopyalarını alıyordum.
Walf

@Walf Bu konuyla ilgili ayrıntılı bilgi verebilir misiniz?
T.Todua

Ana menüden gelen sayfalara (özel yazı türü olmayan) aşağıdaki sayfalarda yer alan linkler, sayfa yokmuş gibi 404 hata verdi; bu kadar.
Walf

@Walf bana durumunuzla ilgili herhangi bir örnek url verir misiniz? (İsterseniz etki alanı adını kapatabilirsiniz, sadece eski bir örneğe ihtiyacım var) teşekkürler, güncelleyeceğim
T.Todua

1

Burada da aynı sorunlar vardı ve wordpress sitesinde hiçbir hareket yok gibi görünüyor. Tek blogposts için özel bir durumda bu yapı / blog /% postname% / bu çözüme ihtiyaç duyuldu

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

404'lü bir demetle sona erdi

Ancak blog yazısı için arka uç permalink strukture özelliğini kullanmayan bu harika yaklaşımla birlikte, sonunda charme gibi çalışıyor. https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/

Çok teşekkürler.


0

ve yukarıda belirtilen işlevde bazı değişiklikler yapabiliriz:

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

için:

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

doğru post_type değerini ayarlamak için.



0

Bunu okuyanlar için yaptığım gibi çocuk gönderilerinde sorun yaşayanlar için yeniden yazma kurallarınızı eklemenin en iyi yolunu buldum.

Karşılaştığım en temel sorun, WordPress'in 2 seviyeli (çocuk postaları) olan sayfalardaki yönlendirmeyi 3 seviye derinliğe (çocuk postalarının çocuğu) gösterdiğinden biraz daha farklı şekilde ele almasıydı.

Bu, / post-type / post-name / post-child olduğunda / / post-name / post-child kullanabildiğimde ve beni post-type önünde olana yönlendirecektir, ancak post-type varsa / post-name / post-child / post-torun sonra, ad / post-post / torun kullanamıyorum.

Yeniden yazma kurallarına göz atarak, ilk ve ikinci seviyelerde sayfa adı dışındaki şeyler için eşleşiyor gibi görünüyor (ikinci seviyenin ekle eşleştiğini düşünüyorum) ve ardından sizi uygun gönderiye yönlendirmek için bir şeyler yapıyor. Üç seviyede derin çalışmıyor.

Yapmanız gereken ilk şey, yazı tipi bağlantısını çocuklardan da kaldırmaktır. Eğer yukarıdaki Nate Allen'ın cevabına bakarsanız, bu mantık burada olmalı:

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

Ben kendimin gönderisinin çocuk olup olmadığını kontrol etmek için farklı şartların bir karışımını kullandım ve doğru permalink'e ulaşmak için neyin olmadığını. Bu kısım çok zor değil ve başka yerlerde yapan insanlardan örnekler bulacaksınız.

Bir sonraki adım, verilen cevaptan her şeyin değiştiği nokta. Ana sorguya bir şeyler eklemek yerine (özel gönderiler ve çocukları için çalışan ancak daha ileri çocuklar için değil) WordPress kurallarının altına giden bir yeniden yazma ekledim, böylece pagename kontrol etmediyse ve bir 404'e çarptığında, özel yazı tipindeki bir sayfanın aynı ada sahip olup olmadığını görmek için son bir kontrol yapılır, aksi takdirde 404'ü fırlar.

İşte 'olay' varsayımıyla kullandığım yeniden yazma kuralı CPT'nizin adıdır

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

Umarım bu başka birine yardımcı olur, çocuk postaları ile ilgili olan ve sümüklüböceği onlardan çıkarmak zorunda kalan başka bir şey bulamadım.


Regex'te bir yazım hatası var gibi görünüyor. Yakalamayan alt yol olarak kullanmak için '(:' a '?' Arasında ihtiyaç vardır => '(?:'. Boş bir ilk alt ağa izin verdiği için üçüncü? Yanlış görünüyor. Bu yazım hatası olmadan bu ifade, yerleşik yazı tipi 'page' için bulunanla aynı olacaktır.
jot
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.