Resolver um nome de tipo de postagem personalizado versus conflito de link permanente de página (mesma lesma)

19

Eu tenho um tipo de post personalizado chamado "visningshus" e também uma página com essa lesma. É assim que deve (deve) ser.

Atualmente, " http://my-site.com/visningshus " lista todas as postagens desse tipo. Quero mostrar a página que tem essa lesma permalink.

Como posso fazer com que o Wordpress não faça com que o nome do tipo de postagem tenha precedência, mas o permalink e mostre a página?

Henrik Erlandsson
fonte

Respostas:

33

O mais fácil seria desativar a página de arquivamento deste CPT:

register_post_type( 'visningshus',
    array(
        [...]
        'has_archive' => false,
        [...]
    )
);

Não se esqueça de atualizar seus links permanentes posteriormente em "Configurações> Links permanentes"

kraftner
fonte
11
Funcionou perfeitamente - mas agora todos os links permanentes que começam com o nome do tipo de postagem personalizado fornecem um 404, apesar de estarem corretos no wp-admin e não parecerem reescritos. Ou seja, todos os links permanentes estão corretos no site, mas todas as postagens personalizadas fornecem um 404. Você pode ajudar com isso? :)
Henrik Erlandsson
@HenrikErlandsson Talvez o seu tipo de postagem tenha o mesmo nome da página. Nesse caso, recomendo que você altere o nome do seu tipo de postagem. Exemplo: Nome do tipo de postagem personalizado - Antes: produtos Depois: cpt_products.
Bruno Monteiro
Muito inteligente. Resolve um monte de problemas
bysanchy
8

Não tenho reputação alta o suficiente para comentar na postagem de @ Carl, mas a resposta é correta (pelo menos para essa situação de manter a página slug e o tipo de postagem personalizada slug iguais e sem usar um arquivo archive.php)

Mas sua resposta daria erros na paginação. Para evitar erros de paginação:

add_rewrite_rule('^visningshus/page/([0-9]+)','index.php?pagename=visningshus&paged=$matches[1]', 'top');

Ele examina a paginação, pega o número da página e, no outro lado, o força a usar a página com a lesma correspondente e, em seguida, insere a variável da página.

Isso , além do 'has_archive' => false,postado acima, deve alcançar a funcionalidade desejada.

Como outros declararam, certifique-se de liberar as regras de reescrita visitando Configurações> Links permanentes depois de fazer essa alteração.

Espero que isso ajude alguém, porque eu sei que isso me deixou perplexo por muito tempo.

Andrew Herder
fonte
4

Tjena Henrik!

Eu acho que tudo que você precisa fazer é adicionar uma regra de reescrita às regras de reescrita do Wordpress que já foram criadas. Adicione esse trecho de código às suas funções.php do seu tema ou inclua-o como um arquivo separado ...

add_action('init', function () {
     add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
     flush_rewrite_rules();
}, 1000);
Carl
fonte
4
Se alguém usar isso, remova flush_rewrite_rules();Você não deve alterar as regras de reescrita initsempre. Recarregar uma vez e depois removê-lo, ou manualmente permalinks descarga, indo para as configurações permalink no painel de administração e clique em "Salvar alterações"
tehlivi
0

Eu resolvi isso sem resolver o conflito. Crie uma página com slug visningshus e escreva o que quiser nela. Anote o ID desta página.

Crie e personalize o modelo archive-custom-post-type.php da maneira que desejar (provavelmente você usará apenas um modelo de página), mas substitua a parte do loop por

$recent = new WP_Query("page_id=your-page-id");  
while($recent->have_posts()) : $recent->the_post();
    the_content();
endwhile;

Então, quando você acessar o site http://my-site.com/visningshus, verá o conteúdo gerenciado pela página no URL correto.

Deixe-me saber que funciona.

molokom
fonte
Boa ideia, mas isso é muito complicado. Você tentou minha solução?
Kraftner
@ kraftner não, eu não fiz. Vou tentar da próxima vez. Obrigado!
22914 Molokom
Isso também tem alguns efeitos colaterais, como o cabeçalho e tudo ainda está sendo criado como se fosse uma página de arquivo e não uma página. Eu não recomendaria usar essa solução.
Kraftner
E se o ID da página mudar? Isso não é seguro.
Joel James
0

Não é permitido votar, mas + na solução Carls, register_post_type deve ter

'has_archive' => false

Simples. No entanto, quando você enfrentar problemas de paginação, consulte

add_rewrite_rule
Vitali Protosovitski
fonte
0

O que foi corrigido para mim foi definir o arquivo como falso, mas também definir o Hierárquico como falso ao configurar meu tipo de postagem personalizado!

Adrian Sticea
fonte
0

Aqui está uma solução geral para priorizar a paginação sobre o conteúdo personalizado de tipos de postagem para QUALQUER slug de tipo de postagem personalizada.

// prioritize pagination over displaying custom post type content
add_action('init', function() {
  add_rewrite_rule(
    '(.?.+?)/page/?([0-9]{1,})/?$',
    'index.php?pagename=$matches[1]&paged=$matches[2]',
    'top'
  );
});

Além de adicionar esse snippet, você também deve garantir que seu tipo de postagem personalizado tenha archive = false

e, por último, mas não menos importante, vá para a página de configurações de Permalinks Configurações> Permalinks (/wp/wp-admin/options-permalink.php) e salve as configurações atuais para atualizar a estrutura de links na página.

jmarceli
fonte