URL de tipo de postagem personalizada com ID de postagem que permite arquivamento e paginação

2

Estou com dificuldades para tentar que meus URLs de tipos de postagem personalizados funcionem corretamente. Cada solução que encontrei prejudicou outra parte que precisa funcionar. O que estou tentando realizar é domain.com/post_type/post_id/post_name .

O que eu tenho que funciona para tudo, exceto arquivos, é:

register_post_type('post-type',
    array(
    'rewrite' => array(
    'slug' => 'post-type/%post_id%',
    'with_front' => false,
    'pages' => true,
    'ep_mask' => 1 
    )
))

Então eu tenho:

add_filter('post_type_link', 'custom_post_type_link', 1, 3);
function custom_post_type_link($post_link, $post = 0, $leavename = false) {

    if ($post->post_type == 'post-type')) {
        return str_replace('%post_id%', $post->ID, $post_link);
    } else {
        return $post_link;
    }
}

Então, estou tentando encontrar uma maneira de fazer com que domain.com/post_type funcione. Atualmente lança um 404.

Se eu remover o filtro e /%post_id% da minha reescrita, o arquivo funcionará. De lá, tentei adicionar uma regra de regravação:

add_action( 'init', 'custom_rewrites_init' );
function custom_rewrites_init(){
    add_rewrite_rule(
        'post-type/([0-9]+)?$',
        'index.php?post_type=post-type&p=$matches[1]',
        'top' );
}

Fazendo isso, o URL não redirecionará se alguém digitar domain.com/post_type/post_id e domain.com/post_type/post_id/post_name/2 não funcionar.

Alguém sabe da melhor maneira de fazer isso?

    
por kel 26.06.2013 / 21:52

3 respostas

6

Seu código / soluções é muito bom. Você usa slug param de uma maneira muito inteligente, então o WordPress cria automaticamente permastruct correto para este CPT.

A única coisa que está faltando, eu acho, é has_archive param. Seu valor padrão é false e você não o define como verdadeiro. O WordPress não cria links / páginas de arquivo para o seu CPT.

  

has_archive (booleano ou string)

     

(opcional) Ativa arquivos do tipo post.

     

Usará $ post_type como arquivo compactado por padrão. Padrão: falso Nota:   Gerará as regras de reescrita adequadas se a reescrita estiver ativada. Use também   reescreva para alterar o slug usado.

Se você fizer isso, o WordPress criará regras de reescrita para páginas de arquivo. Haverá um pequeno problema. Eles conterão %post_id% neles. Mas é muito fácil de corrigir. Você só precisa adicionar esse código depois da sua chamada register_post_type :

global $wp_rewrite;

$new_rules = array();
foreach ( $wp_rewrite->extra_rules_top as $key => $rule ) {
    echo $key;
    if (strpos($key, 'post-type/%post_id%/') === 0 ) {
        $new_rules[ str_replace('%post_id%/', '', $key) ] = $rule;
        unset( $wp_rewrite->extra_rules_top[$key] );
    }
}
$wp_rewrite->extra_rules_top = $wp_rewrite->extra_rules_top + $new_rules;

Ele consertará regras para páginas de arquivo criadas pelo WordPress. É uma solução limpa - não deixa nenhuma bagunça, e cuida de todas as regras para a página de arquivo (feeds, etc.)

    
por Krzysiek Dróżdż 29.06.2013 / 21:51
2

Você pode tentar adicionar este snippet de código:

add_filter( 'rewrite_rules_array', 'custom_rewrite_rules_array' );
function custom_rewrite_rules_array( $rules ) {
        $newrules = array();
        $newrules['^post-type/page/?([0-9]{1,})/?$'] = 'index.php?post_type=post-type&paged=$matches[1]';
        $newrules['^post-type$'] = 'index.php?post_type=post-type';
       return $newrules + $rules;
}

para adicionar suporte para domain.com/post-type/ e domain.com/post-type/page/2 .

Você só precisa lembrar de salvar os permalinks.

    
por birgire 29.06.2013 / 13:27
0

Você redefiniu suas configurações de permalink depois de salvar o arquivo de modelo? Antes de poder usar um novo permalink como esse, você deve salvar novamente suas configurações de permalink em Configurações- > Permalinks.

    
por Chris Wiegman 27.06.2013 / 03:40