Redefinir / alterar a lesma do tipo de postagem personalizada de um plug-in

28

É possível redefinir / alterar a lesma do tipo de postagem personalizado existente de um plug-in (sem simplesmente editar o plug-in)?

Ou seja, se o Plugin X cria um tipo de postagem personalizado com o slug / uncookedtoast /, é possível adicionar um filtro ao functions.php (ou algo semelhante) que altera o slug para / bread /?

Edbury
fonte
Acabei de resolver esse mesmo problema conectando o init com prioridade 20 e depois chamando register_post_type novamente para o mesmo tipo de postagem. Alguém sabe se isso vai me causar algum problema no caminho?
quer

Respostas:

24

Sim, isso é possível, mas se o plug-in estiver criando um tipo de postagem personalizado usando o rewrite => array('slug' => 'post_type')parâmetro, não é provável que você consiga substituir a lesma.

Sempre que tipos de postagem personalizados são criados, as regras de reescrita de URL são gravadas no banco de dados. Dependendo de qual ação aciona a criação do tipo de postagem personalizado (como a ação init ), o WordPress liberará as regras de reescrita e restaurará as lesmas do tipo de postagem personalizada, independentemente das alterações que você tentar fazer.

Dito isso, você pode fornecer slugs personalizados para os tipos de postagem personalizados. O exemplo a seguir supõe que você tenha um tipo de postagem personalizada moviese que esteja tentando alterar a /movies/lesma para /films/.

Para concluir, aqui está a função básica usada para definir o moviestipo de postagem personalizada. O plug-in que você está referenciando deve fazer algo assim:

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

Você pode modificar a tabela de opções, fornecendo suas próprias regras personalizadas com base no tipo de postagem existente.

Basicamente, faremos isso:

  • Pegue o conjunto de regras existente e, em seguida, escreva o nosso com nossos próprios slugs personalizados
  • Dê à nova regra uma prioridade mais alta que a lesma do tipo de postagem personalizada

Veja como você pode fazer isso:

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

Agora, você terá duas maneiras de acessar seus filmes:

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

Observe que eu não recomendo conectar add_custom_rewrite_rulea initação à ação, pois ela será acionada com muita frequência. Este é apenas um exemplo. Um lugar melhor para aplicar a função seria na ativação do tema, na ativação do plug-in, talvez na ação save_post, etc. Dependendo do que você precisa fazer, talvez seja necessário acioná-la apenas uma ou poucas vezes.

Nesse ponto, convém atualizar os permalinks para o tipo de postagem personalizada para usar a ' /movies/lesma ' . Por exemplo, se você navegar para /films/, verá uma lista de todos os seus filmes, mas passar o mouse sobre o título revelará que a /movies/lesma ainda está sendo usada.

Para ir um passo adiante, tecnicamente, você pode instalar um redirecionamento 301 para capturar todos os links /movies/e redirecioná- /films/los para as contrapartes deles , mas tudo depende do que você está tentando fazer.

Tom
fonte
Trabalhou lindamente! Você também poderia me indicar a direção certa para atualizar os links permanentes?
22712 Edbury
1
Dependendo do seu tema, você pode fazer isso no nível do modelo. Quando você vir a chamada para 'the_title ()', poderá substituí-la por $ title = get_the_title () e, em seguida, substituir string '/ movies /' em $ title por '/ films /'.
Tom
E se a lesma que você deseja mudar for criada dinamicamente por um meta-valor da postagem atual? Eu preciso ser capaz de usar $posta add_custom_rewrite_rule()função, mas está lançando erros no WP Admin dizendo 'Tentando obter propriedade de não-objeto'. Como posso obter $ post para obter o valor meta?
Lee
6

Este código funcionou bem para o meu tema filho. Necessário alterar a lesma "program" para "place".

/*
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
fonte
It works perfectly, I have also used it for the tags adding the relative rule, it is necessary to update the permalinks by executing a save from the settings page > permalink. Thank you!
Lorenzo Magon
Funciona perfeitamente para alterar outros argumentos também, eu precisava definir $args['has_archive'] = falsee isso funcionou.
Mere Development