Niestandardowy typ postu Slug / Page Slug Conflict - Zapobiegać użyciu zarezerwowanego ślimaka na stronie zapisać?

13

Mam w swoim motywie niestandardowy typ portfela (portfel ślimakowy) i wszystko działa dobrze oprócz jednej rzeczy. Gdy ludzie tworzą stronę z informacją o portfelu, np .: example.com/portfolio, motyw myśli, że chcę użyć niestandardowej strony archiwum typu posta, a nie mojej strony utworzonej w edytorze.

Czy mogę w jakiś sposób „zarezerwować” zestaw informacji o ślimakach, gdy strony są zapisywane, aby mieć pewność, że nigdy się nie wykorzysta, a może zmienić nazwę na stronę portfolio?

Mój projekt wykorzystuje metody opisane w tym samouczku, oto konflikt, o którym mówię:

„Oprócz konieczności łatania kodu jest tutaj jeszcze jeden haczyk polegający na tym, że nie można nazwać tego ślimaka strony tak samo, jak ślimaka niestandardowego typu postu. Pomyśl o swoim ślimaku niestandardowego typu postu jako zastrzeżonym słowie kluczowym; możesz jednak tytuł strony o tej samej nazwie, co ślimak o niestandardowym typie postu, pod warunkiem, że ślimak strony jest czymś innym. ” - http://wp.tutsplus.com/tutorials/custom-post-type-pagination-chaining-method/

Dziękuję za wszelkie porady!

hhins
źródło
Jedną z opcji, którą widzę, byłoby usunięcie tego z register_post_type () init: 'rewrite' => array ('slug' => 'portfolio', 'with_front' => true) i po prostu ustaw 'rewrite' => false i po prostu żyj z brzydkimi „pojedynczymi” przedmiotami z portfolio.
hhins
Głosuj na swoje pytanie, ponieważ nawet ja chcę znać odpowiedź! Pracowałem z niestandardowymi postami kilka razy, ale nigdy tego nie zauważyłem, a teraz po przeczytaniu twojego pytania spróbowałem. Masz rację, WordPress się myli!
Rutwick Gangurde,

Odpowiedzi:

13

Poniższe 2 filtry pozwalają zaczepić się, gdy WordPress sprawdza ślimak i znajdują się w funkcji wp_unique_post_slug () w pliku wp-include / post.php.

Istnieją 2 filtry, jeden dla postów hierarchicznych i jeden dla niehierarchicznych. Filtr hierarchiczny zapewnia identyfikator postu nadrzędnego, więc jeśli $ post_parent ma wartość 0, wiesz, że jest to post „podstawowy”.

Filtry również przekazują typ $ post_type, jeśli chcesz dodać do logiki określone typy postów.

Zwracając „true”, mówisz WordPressowi, że ten ślimak jest zły, więc WordPress dodaje sufiks, tak jak by to zrobił, gdybyś próbował nam podać nazwę posta / ślimaka, który jest już zajęty.

add_filter( 'wp_unique_post_slug_is_bad_hierarchical_slug', 'portfolio_is_bad_hierarchical_slug', 10, 4 );
function portfolio_is_bad_hierarchical_slug( $is_bad_hierarchical_slug, $slug, $post_type, $post_parent ) {
    if ( !$post_parent && $slug == 'portfolio' )
        return true;
    return $is_bad_hierarchical_slug;
}

add_filter( 'wp_unique_post_slug_is_bad_flat_slug', 'portfolio_is_bad_flat_slug', 10, 3 );
function portfolio_is_bad_flat_slug( $is_bad_flat_slug, $slug, $post_type ) {
    if ( $slug == 'portfolio' )
        return true;
    return $is_bad_flat_slug;
}
Rachel Carden
źródło
Z jakiegoś powodu wciąż mam ten sam problem
Tan-007,
1

Utwórz stronę z informacją o „portfolio” i ustaw ją jako „prywatną”. Zostanie ukryty przed publicznym podczas rezerwowania ślimaka przed dalszym użyciem.

Max Yudin
źródło
1

Dokładnie napotkał ten problem podczas badania problemu paginacji. Mamy stronę główną Wiadomości (ślimak „aktualności”) i paginacja nie udała się ... próby uzyskania dostępu do / news / page / 2 / zawsze kończyły się na „404 - Not Found”.

Problemem okazało się to, że nasz niestandardowy typ wiadomości otrzymał również ślimak „news”. Zmieniając ten ostatni (na przykład na „archiwum_archiwum”) problem został rozwiązany. Dzięki temu odniesienia do oryginalnych adresów URL wiadomości nie uległy zmianie. Zmiana informacji o stronie głównej Wiadomości również działała, ale wtedy wszystkie adresy URL zawierałyby zmienioną informację o pracy.

Ross
źródło