Come disabilitare la visualizzazione singola per un tipo di post personalizzato?


47

Ho creato un tipo di post personalizzato:

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

Come posso disabilitare la visualizzazione di singoli post per questo tipo di post specifico? Visualizzare un semplice 404 va bene o reindirizzare alla homepage. Questo è all'interno di un plug-in, quindi non posso creare un file single-sample_post_type.php per impostare una pagina vuota.

Risposte:


43

Puoi utilizzare template_redirecthook per reindirizzare un tipo di post personalizzato, puoi utilizzare qualsiasi altro URL che desideri al posto di home_url()e il codice di errore in altri argomenti.

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

aggiornato:

Un approccio alternativo sarebbe quello di stabilire:

'publicly_queryable'  => false`

durante la registrazione del post personalizzato come indicato in precedenza da @gustavo. Ma rimuove completamente la pagina e ti reindirizza alla pagina 404. Inoltre nasconde una pagina singola o di archivio, sostanzialmente completamente nascosta dal front-end e può essere impostata solo per post personalizzati.

^ Questo approccio funziona se si desidera registrare un post personalizzato solo per uso admin / back-end


Una buona soluzione Ho trovato utile eseguire questo reindirizzamento solo per utenti non autenticati, controllando per vedere se viene get_current_user_id()valutato a 0.
RevNoah

2
Si prega di controllare il modulo di risposta @Gustavo
Richard

2
perché non usare solo is_singular('post-type-slug')nella if()condizione invece di 2 condizioni?
Akash K.,

@AkashK. Sì, può funzionare anche così, non ero a conoscenza della funzione.
Kumar,

75

Basta impostare l'argomento

'publicly_queryable'  => false

quando chiami register_post_type ()


1
Questa sembra la risposta per fermare il tuo CPT dalla creazione di pagine Web effettive mentre si creano ancora tutti i riferimenti al database.
Ben Racicot,

27
Anche questo nasconde l'archivio
astronauta l'

1
Questa dovrebbe essere la risposta accettata.
SinisterBeard

Per me questo provoca un reindirizzamento alla homepage invece di un 404. Qualche idea sul perché? Sto registrando il post_type con Piklist, nel caso sia rilevante.
emersonthis

8

Un modo più semplice per farlo può essere passare i seguenti argomenti quando si registra il tipo di posta personalizzato

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

1
Dovresti effettivamente publically_querableessere vero affinché gli archivi di tipo di posta funzionino.
Howdy_McGee

Questo non funziona per me. Si tratta semplicemente di reindirizzamenti alla home page quando si tenta di andare all'archivio
Yahya Uddin

7

Uno. Dal tuo file di funzioni.

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

Due. Dal tuo file single.cpt.php:

<?php wp_redirect( home_url() ); exit; ?>

Mi è piaciuta la seconda opzione. Ma ho bisogno di sapere c'è qualche inconveniente con questa seconda opzione.
user2584538

@ user2584538 Se non si dispone di un single-cpt_name.phpfile personalizzato , non è possibile farlo. Se si inserisce la funzione in un semplice file plugin, è possibile attivare / disattivare senza modificare alcun file.
EliasNS,

2

Lavorando dalla risposta davvero buona di Sven, ho riscritto la sua funzione per rendere più semplice l'aggiunta di più tipi di post utilizzando in_array()l'istruzione if e quindi il reindirizzamento alla pagina di archivio anziché alla home page.

(a proposito, penso che l'impostazione query_vare / o publically_queryablesu false disabiliteranno non solo le singole viste, ma anche la vista dell'archivio nativo, ignorando 'has_archive' => true. In tal caso è comunque possibile impostare una WP_query personalizzata e creare la propria pagina di archivio, in un modello, ma la query principale non lo farà più, vero?)

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

2

Testato tutti quelli sopra menzionati e la soluzione effettiva è più semplice di qualsiasi suggerimento di reindirizzamento.

Affinché l'archivio sia accessibile ed elenchi gli elementi, il singolo post non sia accessibile e il reindirizzamento automatico su 404 impostato

'query_var' => false

al momento della registrazione del CPT. Se si imposta publicly_queryablesu false, gli archivi verranno reindirizzati a casa, qualsiasi altra combinazione non funzionerà. Impostare il query_varfalso e basta.

Ecco il CPT completo https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a

vedi riga 50 https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a#file-thz_cpt_items_single_view_redirect-php-L50

come indicato qui

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

Nota: se query_var è vuoto, null o FALSO booleano, WordPress tenterà comunque di interpretarlo (4.2.2) e le anteprime / visualizzazioni del tuo post personalizzato restituiranno 404s.


Sembra un po 'un trucco ma sembra funzionare. Vorrei semplicemente aggiungere una proprietà has_single dedicata insieme alla proprietà has_archive esistente.
powerbuoy

0

Nel caso in cui desideri disabilitare completamente la visualizzazione singola del tipo di post personalizzato sul frontend, ma essere in grado di visualizzare la pagina di archivio, le cose stanno diventando un po 'complicate.

L'impostazione publicly_queryablesu falseo rewriteto falseimpedirà la visualizzazione della visualizzazione singola e di archivio. Non è presente alcun flag negli register_post_typeargomenti della funzione per impedire la creazione di regole di riscrittura a vista singola.

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

Tuttavia, puoi rimuovere il tag di riscrittura dopo aver registrato il tuo tipo di post e questo lascerà intatte le regole di riscrittura della vista archivio ma rimuoverà solo le regole di riscrittura a vista singola.

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

Un altro vantaggio è che d'ora in poi è possibile creare semplici pagine WordPress utilizzando la struttura del permalink ( event/simple-page) di tipo post evento che può essere utile in siti Web complessi.

Ricorda di cancellare le regole di riscrittura dopo la modifica del codice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.