Como desativar a exibição única para um tipo de postagem personalizado?

47

Criei um tipo de postagem personalizado:

register_post_type('sample_post_type',array(
    'labels' => array(
        'name' => _x('Sample Posts', 'post type general name'),
        'singular_name' => _x('Sample Post', 'post type singular name')
    ),
    'public' => true,
    'show_in_nav_menus' => false,
    'exclude_from_search' => true
));

Como posso desativar a exibição de postagem única para esse tipo de postagem específico? Exibir um 404 simples é bom ou redirecionar para a página inicial. Isso está dentro de um plug-in, então não consigo criar um arquivo single-sample_post_type.php para configurar uma página vazia.

passatgt
fonte

Respostas:

43

Você pode usar o template_redirecthook para redirecionar para um tipo de postagem personalizado, qualquer outro URL que desejar home_url()e o código de erro em outro argumento.

<?php
add_action( 'template_redirect', 'wpse_128636_redirect_post' );

function wpse_128636_redirect_post() {
  $queried_post_type = get_query_var('post_type');
  if ( is_single() && 'sample_post_type' ==  $queried_post_type ) {
    wp_redirect( home_url(), 301 );
    exit;
  }
}
?>

Atualizada:

Uma abordagem alternativa seria definir:

'publicly_queryable'  => false`

enquanto registrava a postagem personalizada, conforme mencionado por @gustavo anteriormente. Mas ele remove completamente a página e o redireciona para a página 404. Ele também oculta uma página única e uma de arquivo, basicamente completamente oculta do front-end e pode ser configurada apenas para postagens personalizadas.

^ Essa abordagem funciona se você deseja registrar uma postagem personalizada apenas para uso de administrador / back-end

Kumar
fonte
Uma boa solução Eu achei que era útil executar apenas esse redirecionamento para usuários não autenticados, verificando se o valor é get_current_user_id()0.
RevNoah
2
Por favor, verifique o formulário de resposta @Gustavo
Richard
2
por que não usar somente is_singular('post-type-slug')na if()condição em vez de 2 condições?
Akash K.
@AkashK. Sim, isso também pode funcionar, não estava ciente da função.
Kumar
75

Apenas definindo o argumento

'publicly_queryable'  => false

quando você chama register_post_type ()

Gustavo
fonte
1
Parece a resposta para impedir que o seu CPT crie páginas da Web reais, enquanto ainda cria todas as referências ao banco de dados.
Ben Racicot
27
Isso também oculta o arquivo #
spaceman
1
Essa deve ser a resposta aceita.
SinisterBeard
Para mim, isso causa um redirecionamento para a página inicial em vez de um 404. Alguma idéia do porquê? Estou registrando o post_type no Piklist, caso isso seja relevante.
precisa saber é o seguinte
8

Uma maneira mais simples de fazer isso é passar os seguintes argumentos ao registrar o Tipo de postagem personalizado

register_post_type('sample_post_type',array(
'labels' => array(
    'name' => _x('Sample Posts', 'post type general name'),
    'singular_name' => _x('Sample Post', 'post type singular name')
),
'public' => true,
'exclude_from_search' => true,
'show_in_admin_bar'   => false,
'show_in_nav_menus'   => false,
'publicly_queryable'  => false,
'query_var'           => false
));
0v3rth3d4wn
fonte
1
Você realmente precisa publically_querableser verdadeiro para que os Arquivos de tipo de postagem funcionem.
Howdy_McGee
Isso não funciona para mim. Ele justs redireciona para a página inicial ao tentar ir para o arquivo
Yahya Uddin
7

1. Do seu arquivo de funções.

add_action( 'template_redirect', 'redirect_cpt_singular_posts' );
    function redirect_cpt_singular_posts() {
      if ( is_singular('your-cpt-slug') ) {
        wp_redirect( home_url(), 302 );
        exit;
      }
    }

Dois. No seu arquivo single.cpt.php:

<?php wp_redirect( home_url() ); exit; ?>
Brad Dalton
fonte
Eu gostei da segunda opção. Mas preciso saber se há alguma desvantagem com esta segunda opção.
user2584538
@ user2584538 Se você não tiver um single-cpt_name.phparquivo personalizado, não poderá fazê-lo. Se você colocar a função em um arquivo de plug-in simples, poderá ativar / desativar sem editar nenhum arquivo.
EliasNS
2

Trabalhando com a resposta realmente boa de Sven, reescrevi sua função para facilitar a adição de vários tipos de postagem usando in_array()a instrução if e, em seguida, redirecionando para a página de arquivo em vez da página inicial.

(a propósito, acho que a configuração query_vare / ou publically_queryablefalse desativará não apenas as visualizações únicas, mas também a visualização de arquivo nativo, substituindo 'has_archive' => true. Nesse caso, você ainda pode configurar um WP_query personalizado e criar sua própria página de arquivo, em um modelo, mas a consulta principal não fará mais isso, fará?)

function fq_disable_single_cpt_views() {
  $queried_post_type = get_query_var('post_type');
  $cpts_without_single_views = array( 'my-post-type', 'my-other-post-type' );
  if ( is_single() && in_array( $queried_post_type, $cpts_without_single_views )  ) {
    wp_redirect( home_url( '/' . $queried_post_type . '/' ), 301 );
    exit;
  }
}

add_action( 'template_redirect', 'fq_disable_single_cpt_views' );
slashbob
fonte
2

Testou todos os mencionados acima e a solução real é mais simples do que os redirecionamentos sugeridos.

Para que o arquivo esteja acessível e liste os itens, a postagem única não esteja acessível e o redirecionamento automático para o conjunto 404

'query_var' => false

ao registrar seu CPT. Se você definir publicly_queryablecomo falso, seus arquivos serão redirecionados para casa, qualquer outra combinação não funcionará. Defina query_varcomo false e é isso.

Aqui está a CPT completa https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a

consulte a linha 50 https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a#file-thz_cpt_items_single_view_redirect-php-L50

como indicado aqui

https://codex.wordpress.org/Function_Reference/register_post_type

Nota: Se query_var estiver vazio, nulo ou FALSO booleano, o WordPress ainda tentará interpretá-lo (4.2.2) e as visualizações / visualizações da sua postagem personalizada retornarão 404s.

Benn
fonte
Parece um hack, mas parece funcionar. Gostaria que eles adicionassem uma propriedade has_single dedicada juntamente com a propriedade has_archive existente.
powerbuoy 31/01
0

Caso você deseje desativar completamente a exibição única de tipo de postagem personalizada no front-end, mas poder exibir a página do arquivo, as coisas estão ficando um pouco complicadas.

Definir publicly_queryablea falseou rewritea falseimpedirá para a exibição de ambos visão única e arquivo. Não há sinalizador nos register_post_typeargumentos da função para impedir a criação de apenas regras de reescrita de exibição única.

https://github.com/WordPress/WordPress/blob/5.2.3/wp-includes/class-wp-post-type.php#L540

No entanto, você pode remover a marca de reescrita depois de registrar seu tipo de postagem, o que deixará as regras de reescrita da visualização de arquivo intocadas, mas removerá apenas as regras de reescrita da visualização única.

/**
 * Register event post type
 */
function wpse_128636_register_event_post_type() {

    $labels = array(
        'name' => __( 'Events' ),
        'singular_name' => __( 'Event' ),
        'add_new' => __( 'Add new' ),
        'add_new_item' => __( 'Add new' ),
        'edit_item' => __( 'Edit' ),
        'new_item' => __( 'New' ),
        'view_item' => __( 'View' ),
        'search_items' => __( 'Search' ),
        'not_found' => __( 'Not found' ),
        'not_found_in_trash' => __( 'Not found Events in trash' ),
        'parent_item_colon' => __( 'Parent' ),
        'menu_name' => __( 'Events' ),

    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'supports' => array( 'title', 'page-attributes' ),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'event'),
        'capability_type' => 'post',
    );

    register_post_type( 'event', $args );
    remove_rewrite_tag( '%event%' ); // This line will remove event rewrite rules for single view
}

add_action( 'init', 'wpse_128636_register_event_post_type' );

Outro bônus é que, a partir de agora, você poderá criar páginas simples do WordPress usando a estrutura permanente de tipo de postagem de evento ( event/simple-page), que pode ser útil em sites complexos.

Lembre-se de liberar regras de reescrita após a modificação do código.

kierzniak
fonte