Remover slug personalizado do tipo de postagem do URL

15

Não encontrei uma resposta útil para isso. Estou ciente dos problemas de conflito e de todos os problemas que isso pode causar. Estou curioso para saber se é POSSÍVEL NÃO SUGERIDO. Isso exigirá reescritas do WP, eu sei disso.

Basicamente, digamos que temos um CPT de "eventos". Quero que a página de um único evento tenha o URL http://domain.com/single-event-name e NOT http://domain.com/events/single-event-name . Alguma idéia de como fazer isso?

Rob Bennet
fonte
Sempre quis saber sobre isso, nunca pensei em fazer a pergunta. Obrigado!
fischi 13/12/12
@robbennet em 2015, ainda não parece haver uma maneira legítima de fazer isso com estilo.
Ben Racicot

Respostas:

9

É assim que você pode fazer a primeira parte do trabalho - livrar-se do slogan do CPT no link do post (por exemplo, tipo de post de notícias).

function df_custom_post_type_link( $post_link, $id = 0 ) {  

    $post = get_post($id);  

    if ( is_wp_error($post) || 'news' != $post->post_type || empty($post->post_name) )  
        return $post_link;  

    return home_url(user_trailingslashit( "$post->post_name" ));  
}
add_filter( 'post_type_link', 'df_custom_post_type_link' , 10, 2 );

Agora deve-se reescrever as regras para 'notícias', porque você receberá um erro 404.

Adicione a regra de reescrita assim:

function df_custom_rewrite_rule() {
    add_rewrite_rule('(.*?)$', 'index.php?news=$matches[1]', 'top');
}
add_action('init', 'df_custom_rewrite_rule');

Em seguida, precisamos liberar as regras de reescrita, então vá para Configurações - Links permanentes e salve as alterações.

Bartosz
fonte
1
Você não deve adicionar regras de reescrita no init. Você deve apenas adicionar sua regra às regras atuais.
19412 Chris_O
2
@Chris_O Você pode elaborar? Como alguém adicionaria a regra às regras atuais?
Desi
Depois de adicionar esse código, todas as minhas páginas com URLS como example.com/about-us pararam de funcionar? Alguma solução para isso?
Rahul Gupta
4

Você pode experimentar este plugin ( http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/ ) para remover a lesma, mas ele só funcionará se a estrutura do permalink for "/% postname % /

swtshweta
fonte
Exatamente este plugin é incrível! Sou um usuário experiente deste plugin e recomendo totalmente! aqui está o link do site do plugin, que o explica detalhadamente ultimatewebtips.com/remove-slug-from-custom-post-type #
Kuldeep Daftary
Este é um bom plugin, e tem exatamente o recurso que eu estava procurando. A solução @bartosz é especificamente para um CPT, embora você também tenha a idéia geral. Depois de cavar neste Plugin, está tudo claro agora, obrigado!
19612 fischi
0

Você sempre pode conectar-se a "parse_request" para executar uma verificação para verificar se existe um tipo personalizado com o nome solicitado e modificar os query_vars adequadamente. Você precisará de algo como a resposta de @ Bartosz para gerar o link permanente adicional:

 add_filter('parse_request', "t21_parse_request" , 1, 1);

 function t21_parse_request($wbobj)
 {
      $vars = $wpobj->query_vars;
      $slug = $query_vars['pagename'];

      $posts = get_posts(array(
           "post_type" => "event",
           "post_name" => $slug
      ));

      if($posts)
      {
           //we know your "event" entry exists so we now amend the query_vars
           //first unset the 'page' and 'pagename'
           unset($query_vars['page']);
           unset($query_vars['pagename'];

           //now rebuild the query_vars
           $query_vars['post_type'] = "event"; //CPT name
           $query_vars['name'] = $slug;
           $query_vars['event'] = $slug //again - this constructs the "event=myevent" query string
      }
      else
      {
           //just return $wpobj since we know that there is no "event"
           return $wpobj;
      }
 }

No entanto, isso pressupõe que você não terá nenhum nome de postagem com o mesmo nome que um nome de postagem, caso contrário, a postagem nunca aparecerá, pois corresponde primeiro a um tipo de evento.

Zakalwe
fonte
0
function register_cpt_type() {
    register_post_type('cpt', array(
        'rewrite' => array("slug" => "/cpt", "with_front" => false),
    ));
}
add_action('init', 'register_cpt_type')

function cpt_rewrite_rule() {
    add_rewrite_rule('(.*?)$', 'index.php?cpt=$matches[1]', 'top');
}
add_action('after_theme_setup', 'cpt_rewrite_rule');

liberar / reciclar reescritas de URL e editar .htaccess

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
Kristina Childs
fonte