¿Cómo deshabilitar la vista única para un tipo de publicación personalizada?

47

Creé un tipo de publicación 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,
    'show_in_nav_menus' => false,
    'exclude_from_search' => true
));

¿Cómo puedo desactivar la vista de publicación única para este tipo de publicación específica? Mostrar un 404 simple está bien, o redirigir a la página de inicio. Esto está dentro de un complemento, por lo que no puedo crear un archivo single-sample_post_type.php para configurar una página vacía.

passatgt
fuente

Respuestas:

43

Puede usar template_redirecthook para redirigir un tipo de publicación personalizado, puede usar cualquier otra URL que desee en lugar de home_url()y el código de error en otro 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;
  }
}
?>

Actualizado:

Un enfoque alternativo sería establecer:

'publicly_queryable'  => false`

mientras registra la publicación personalizada como mencionó anteriormente @gustavo. Pero simplemente elimina completamente la página y lo redirige a la página 404. También oculta páginas individuales y de archivo, básicamente completamente ocultas del front-end y se puede configurar solo para publicaciones personalizadas.

^ Este enfoque funciona si desea registrar una publicación personalizada solo para uso administrativo / back-end

Kumar
fuente
Una buena solucion. Descubrí que era útil realizar esta redirección solo para usuarios no autenticados, verificando si se get_current_user_id()evalúa a 0.
RevNoah
2
Por favor, consulte el formulario de respuesta @Gustavo
Richard
2
¿Por qué no usar solo is_singular('post-type-slug')en la if()condición en lugar de 2 condiciones?
Akash K.
@AkashK. Sí, eso también puede funcionar, no estaba al tanto de la función.
Kumar
75

Solo estableciendo el argumento

'publicly_queryable'  => false

cuando llamas a register_post_type ()

Gustavo
fuente
1
Esta parece ser la respuesta para evitar que su CPT cree páginas web reales mientras sigue creando todas las referencias de la base de datos.
Ben Racicot
27
Esto también oculta el archivo
astronauta
1
Esta debería ser la respuesta aceptada.
SinisterBeard
Para mí, esto provoca una redirección a la página de inicio en lugar de un 404. ¿Alguna idea de por qué? Estoy registrando el post_type con Piklist, en caso de que sea relevante.
Emersonthis
8

Una forma más sencilla de hacerlo puede ser pasar los siguientes argumentos al registrar el Tipo de publicación 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
));
0v3rth3d4wn
fuente
1
En realidad, debería publically_querableser cierto para que funcionen los archivos de tipo de publicación.
Howdy_McGee
Esto no funciona para mi. Simplemente redirige a la página de inicio al intentar ir al archivo
Yahya Uddin
7

Uno. De su archivo de funciones.

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;
      }
    }

Dos. Desde su archivo single.cpt.php:

<?php wp_redirect( home_url() ); exit; ?>
Brad Dalton
fuente
Me gustó la segunda opción. Pero necesito saber si hay algún inconveniente con esta segunda opción.
user2584538
@ user2584538 Si no tiene un single-cpt_name.phparchivo personalizado , no podría hacerlo. Si coloca la función en un archivo de complemento simple, puede activar / desactivar sin editar ningún archivo.
EliasNS
2

Trabajando a partir de la muy buena respuesta de Sven, reescribí su función para que sea más fácil agregar múltiples tipos de publicaciones usando in_array()la declaración if y luego redirigiendo a la página de archivo en lugar de la página de inicio.

(por cierto, creo que la configuración query_vary / o publically_queryablefalso deshabilitará no solo las vistas individuales, sino también la vista de archivo nativa, anulando 'has_archive' => true. En ese caso, aún puede configurar una WP_query personalizada y crear su propia página de archivo, en una plantilla, pero la consulta principal ya no lo hará, ¿verdad?)

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
fuente
2

Probé todos los mencionados anteriormente y la solución real es más simple que cualquier redirección sugerida.

Para que el archivo sea accesible y enumere los elementos, y la publicación única no sea ​​accesible y se redirija automáticamente al conjunto 404

'query_var' => false

al registrar su CPT. Si establece publicly_queryableen falso, sus archivos serán redirigidos a su hogar, cualquier otro combo no funcionará. Establecer el query_varfalso y eso es todo.

Aquí está el CPT completo https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a

ver línea 50 https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a#file-thz_cpt_items_single_view_redirect-php-L50

como se indica aquí

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

Nota: Si query_var está vacío, es nulo o es un FALSO booleano, WordPress aún intentará interpretarlo (4.2.2) y las vistas previas / vistas de su publicación personalizada devolverán 404s.

Benn
fuente
Se siente un poco como un truco, pero parece funcionar. Desearía que simplemente agregaran una propiedad has_single dedicada junto con la propiedad has_archive existente.
powerbuoy
0

En caso de que desee deshabilitar por completo la vista única de tipo de publicación personalizada en la interfaz pero poder mostrar la página de archivo, las cosas se están volviendo un poco complicadas.

La configuración publicly_queryableen falseo rewritepara falseevitará que se muestren vistas individuales y de archivo. No hay marca en los register_post_typeargumentos de la función para evitar crear solo reglas de reescritura de vista única.

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

Sin embargo, puede eliminar la etiqueta de reescritura después de registrar su tipo de publicación y esto dejará intactas las reglas de reescritura de la vista de archivo, pero eliminará solo las reglas de reescritura de una sola vista.

/**
 * 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' );

Otra ventaja es que a partir de ahora puede crear páginas simples de WordPress utilizando la estructura de enlace permanente de tipo de publicación de evento ( event/simple-page) que puede ser útil en sitios web complejos.

Recuerde eliminar las reglas de reescritura después de la modificación del código.

kierzniak
fuente