Odznacz / zmień informacje o niestandardowym typie wtyczki

28

Czy jest możliwe ponowne ustawienie / zmianę informacji o istniejącym niestandardowym typie wtyczki (bez zwykłej edycji wtyczki)?

Oznacza to, że jeśli Plugin X utworzy niestandardowy typ postu za pomocą slug / uncookedtoast /, czy można dodać filtr do functions.php (lub czegoś podobnego), który zmienia ślimak na / bread /?

Edbury
źródło
Właśnie rozwiązałem ten sam problem, podpinając się do init z priorytetem 20, a następnie ponownie wywołując register_post_type dla tego samego typu postu. Czy ktoś wie, czy to spowoduje mi kłopoty na drodze?
Dustin

Odpowiedzi:

24

Tak, jest to możliwe, ale jeśli wtyczka tworzy niestandardowy typ postu za pomocą rewrite => array('slug' => 'post_type')parametru, prawdopodobnie nie będziesz w stanie wymienić ślimaka.

Za każdym razem, gdy tworzone są niestandardowe typy postów, do bazy danych zapisywane są reguły przepisywania adresów URL. W zależności od tego, która akcja wyzwala utworzenie niestandardowego typu postu (np. Akcja init ), WordPress opróżni reguły przepisywania i przywróci informacje o niestandardowym typie postu bez względu na to, jakie zmiany zamierzasz wprowadzić.

To powiedziawszy, możesz dostarczyć niestandardowe ślimaki dla niestandardowych typów postów. Poniższy przykład zakłada, że ​​masz niestandardowy typ postu moviesi próbujesz zmienić /movies/ślimak na /films/.

Aby zakończyć, oto podstawowa funkcja używana do definiowania moviesniestandardowego typu postu. Wtyczka, do której się odwołujesz, powinna robić coś takiego:

function movies_register_post_type() {

    register_post_type(
        'movies',
        array(
            'labels' => array(
                'name' => __('Movies'),
                'singular_name' => __('Movie')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array(
                'slug' => 'movies'
            )
        )
    );

} // end example_register_post_type
add_action('init', 'movies_register_post_type');

Możesz zmodyfikować tabelę opcji, podając własne reguły niestandardowe w oparciu o istniejący typ postu.

Zasadniczo zrobimy to:

  • Weź istniejący zestaw reguł, a następnie napisz własne z naszymi niestandardowymi ślimakami
  • Nadaj nowej regule wyższy priorytet niż ślimak niestandardowego typu postu

Oto jak możesz to zrobić:

function add_custom_rewrite_rule() {

    // First, try to load up the rewrite rules. We do this just in case
    // the default permalink structure is being used.
    if( ($current_rules = get_option('rewrite_rules')) ) {

        // Next, iterate through each custom rule adding a new rule
        // that replaces 'movies' with 'films' and give it a higher
        // priority than the existing rule.
        foreach($current_rules as $key => $val) {
            if(strpos($key, 'movies') !== false) {
                add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top');   
            } // end if
        } // end foreach

    } // end if/else

    // ...and we flush the rules
    flush_rewrite_rules();

} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');

Teraz będziesz mieć dwa sposoby na dostęp do swoich filmów:

  • /movies/Back-To-The-Future
  • /films/Back-To-The-Future

Zauważ, że nie polecam podpinania się add_custom_rewrite_ruledo initakcji, ponieważ będzie ona zbyt często strzelać. To tylko przykład. Lepszym miejscem do zastosowania tej funkcji jest aktywacja motywu, aktywacja wtyczki, być może akcja save_post itp. W zależności od tego, co musisz zrobić, może być konieczne uruchomienie go tylko raz lub kilka razy.

W tym momencie możesz rozważyć aktualizację permalinków dla niestandardowego typu postu, aby użyć „ /movies/ślimaka ” . Na przykład, jeśli /films/przejdziesz do , zobaczysz listę wszystkich swoich filmów, ale najechanie kursorem na tytuł ujawni, że /movies/ślimak jest nadal używany.

Aby pójść o krok dalej, możesz technicznie zainicjować przekierowanie 301, aby złapać wszystkie linki /movies/do przekierowania do ich /films/odpowiednika, ale wszystko to zależy od tego, co próbujesz zrobić.

Tomek
źródło
Działało pięknie! Czy możesz również wskazać mi właściwy kierunek aktualizacji permalinków?
Edbury
1
W zależności od motywu możesz to zrobić na poziomie szablonu. Kiedy zobaczysz wywołanie „the_title ()”, możesz zamienić je na $ title = get_the_title (), a następnie ciąg znaków zamień „/ movies /” w $ title na „/ movies /”.
Tom
Co się stanie, jeśli ślimak, który chcesz zmienić, jest dynamicznie tworzony przez wartość meta bieżącego postu? Muszę być w stanie korzystać $postz tej add_custom_rewrite_rule()funkcji, ale generuje błędy w WP Admin, mówiąc: „Próbuję uzyskać właściwość nie-obiektu”. Jak mogę uzyskać $ post, aby uzyskać wartość meta?
Lee
6

Ten kod działał dobrze dla mojego motywu podrzędnego. Musiał zmienić „program” ślimak na „miejsce”.

/*
CHANGE SLUGS OF CUSTOM POST TYPES
*/

function change_post_types_slug( $args, $post_type ) {

   /*item post type slug*/   
   if ( 'program' === $post_type ) {
      $args['rewrite']['slug'] = 'place';
   }

   return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );

/*
CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages
*/

function change_taxonomies_slug( $args, $taxonomy ) {

   /*item category*/
   if ( 'program-category' === $taxonomy ) {
      $args['rewrite']['slug'] = 'locations';
   }

   return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );
Iggy
źródło
Działa idealnie, użyłem go również do tagów dodających regułę względną, konieczne jest zaktualizowanie permalinków poprzez wykonanie zapisu ze strony ustawień> permalink. Dziękuję Ci!
Lorenzo Magon,
Działa idealnie, aby zmienić również inne argumenty, musiałem ustawić $args['has_archive'] = falsei to zadziałało.
Zwykły rozwój