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

38

Eu 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 visualização de postagem única para esse tipo de postagem específico? Exibindo um simples 404 é bom, ou redirecionando para a página inicial. Isso está dentro de um plugin, então eu não posso criar um arquivo single-sample_post_type.php para configurar uma página vazia.

    
por passatgt 05.01.2014 / 15:05
fonte

6 respostas

31

Você pode usar template_redirect hook para redirecionar para um tipo de postagem personalizado, você pode usar qualquer outro URL que desejar no lugar de 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;
  }
}
?>

Atualizado:

Uma abordagem alternativa seria definir 'publicly_queryable' => false ao registrar a postagem personalizada, conforme mencionado anteriormente pelo @gustavo. Mas isso só vai te dar 404 diretamente, ele iria esconder único, bem como arquivar, basicamente completamente escondido do front-end e pode ser definido apenas para posts personalizados.

    
por sven 05.01.2014 / 15:12
fonte
60

Basta definir o argumento

'publicly_queryable'  => false

quando você chama register_post_type ()

    
por Gustavo 27.12.2014 / 22:38
fonte
7

Uma maneira mais simples de fazer isso pode passar os seguintes argumentos ao registrar o tipo de postagem personalizada

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
));
    
por 0v3rth3d4wn 24.05.2014 / 21:01
fonte
6

Um. A partir 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. Do seu arquivo single.cpt.php:

<?php wp_redirect( home_url() ); exit; ?>
    
por Brad Dalton 24.05.2014 / 21:10
fonte
1

Trabalhando a partir da resposta realmente boa de Sven, reescrevi sua função para facilitar a adição de vários tipos de postagens usando in_array() na instrução if e, em seguida, redirecionando para a página de arquivamento, em vez da home page.

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

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' );
    
por slashbob 09.07.2016 / 18:27
fonte
0

Testamos todos os mencionados acima e a solução atual é mais simples do que qualquer redirecionamento sugerido.

Para que o arquivo fique acessível e liste os itens, e a postagem única não seja acessível e redirecione automaticamente para o conjunto 404

'query_var' => false

ao registrar seu CPT. Se você definir publicly_queryable como false, seus arquivos serão redirecionados para casa, qualquer outro combo não funcionará. Defina o query_var para false e é isso.

Aqui está o CPT completo enlace

veja a linha 50 enlace

como declarado aqui

enlace

  

Nota: Se query_var estiver vazio, nulo ou um booleano FALSE, o WordPress   ainda tentam interpretá-lo (4.2.2) e previews / views do seu   postagem personalizada retornará 404s.

    
por Benn 16.11.2018 / 23:22
fonte