Cum să dezactivezi vizualizarea individuală pentru un tip de postare personalizat?

5 ian. 2014, 16:05:33
Vizualizări: 126K
Voturi: 75

Având acest tip de postare personalizat:

register_post_type(
    'sample_post_type',
    [
        'labels' => [
            'name' => _x('Postări Exemplu', 'nume general tip postare'),
            'singular_name' => _x('Postare Exemplu', 'nume singular tip postare'),
        ],
        'public' => true,
        'show_in_nav_menus' => false,
        'exclude_from_search' => true,
    ]
);

Cum pot dezactiva vizualizarea individuală pentru acest tip specific de postare? Este în regulă să afișez o simplă pagină 404 sau să redirecționez către pagina principală. Deoarece aceasta este un plugin, nu pot crea un fișier single-sample_post_type.php pentru a configura o pagină goală.

0
Toate răspunsurile la întrebare 9
4
107

Doar setând argumentul

'publicly_queryable'  => false

când apelezi register_post_type()

27 dec. 2014 23:38:13
Comentarii

Pare a fi soluția pentru a opri CPT-ul tău din crearea de pagini web reale, păstrând în același timp toate referințele din baza de date.

Ben Racicot Ben Racicot
17 sept. 2015 21:11:49

Această soluție ascunde și arhiva

spaceman spaceman
11 oct. 2016 19:12:19

Acesta ar trebui să fie răspunsul acceptat.

SinisterBeard SinisterBeard
16 mar. 2018 12:26:45

Pentru mine, acest lucru generează o redirecționare către pagina principală în loc de o eroare 404. Aveți idei de ce se întâmplă asta? Înregistrez post_type cu Piklist, în caz că este relevant.

emersonthis emersonthis
10 sept. 2018 00:27:17
6
86

Pentru a dezactiva vizualizarea individuală pentru un CPT (Custom Post Type) poți fie să redirecționezi utilizatorii către o anumită URL, fie să o dezactivezi în momentul înregistrării CPT-ului.

METODA 1:

Redirecționare vizualizare individuală CPT către o URL personalizată, pagina de arhivă rămâne accesibilă public.

Poți folosi hook-ul template_redirect pentru a redirecționa un utilizator, poți folosi orice URL în loc de home_url() și codul de eroare dorit ca al doilea argument.

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

function wpse_128636_redirect_post() {
  if ( is_singular( 'tip_postare_exemplu' ) ) :
    wp_redirect( home_url(), 301 );
    exit;
  endif;
}
?>

METODA 2:

Dezactivare completă a paginii Individuale și a Arhivei pe front-end; Funcționează doar pentru Post Types personalizate.

O alternativă este să setezi publicly_queryable la false în momentul înregistrării postului personalizat.

'publicly_queryable'  => false

Această opțiune ascunde atât pagina individuală cât și cea de arhivă pentru CPT, poate fi folosită doar pentru postări personalizate.

Chiar dacă arhiva și vizualizarea individuală sunt ascunse, poți totuși să adaugi un șablon de pagină sau un bloc personalizat pentru a lista postările dacă este necesar.

5 ian. 2014 16:12:14
Comentarii

O soluție bună. Am considerat util să efectuez această redirecționare doar pentru utilizatorii neautentificați, verificând dacă get_current_user_id() returnează 0.

RevNoah RevNoah
29 iun. 2015 16:25:32

Te rog verifică răspunsul de la @Gustavo

Richard Richard
18 nov. 2016 11:17:44

de ce să nu folosești doar is_singular('post-type-slug') în condiția if() în loc de 2 condiții?

Akash K. Akash K.
22 oct. 2018 23:36:19

@AkashK. Da, și asta ar putea funcționa, nu știam de funcție.

Kumar Kumar
23 oct. 2018 09:26:50

sugestia cu remove_rewrite_tag( '%post-type-slug%' ) este o soluție bună

Pbearne Pbearne
5 mai 2020 01:20:44

Lipsește paranteza de închidere în cod - ar trebui să fie...

if ( is_singular( 'sample_post_type' ) )

neilgee neilgee
18 aug. 2020 07:31:26
Arată celelalte 1 comentarii
6
17

Am testat toate soluțiile menționate mai sus și soluția reală este mai simplă decât orice redirecționare sugerată.

Pentru a avea arhiva accesibilă și pentru a lista elementele, iar postarea individuală să nu fie accesibilă și să redirecționeze automat la 404, setați

'query_var' => false

când înregistrați tipul de postare personalizat (CPT). Dacă setați publicly_queryable la false, arhivele vor fi redirecționate către pagina principală, nicio altă combinație nu va funcționa. Setează query_var la false și asta este tot.

Aici este un exemplu complet de CPT https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a

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

după cum este menționat aici

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

Notă: Dacă query_var este gol, null sau boolean FALSE, WordPress va încerca în continuare să-l interpreteze (4.2.2) și previzualizările/vizualizările postării personalizate vor returna eroarea 404.

17 nov. 2018 00:22:57
Comentarii

Se simte un pic ca un hack, dar pare să funcționeze. Aș fi vrut să adauge o proprietate dedicată has_single, alături de proprietatea existentă has_archive.

powerbuoy powerbuoy
31 ian. 2019 15:40:15

Bună, am încercat să fac același lucru dar nu a funcționat. În ciuda faptului că am adăugat query_var la false, încă pot accesa linkurile către paginile single. Poți să mă ajuți?

iSaumya iSaumya
13 oct. 2020 15:08:30

@iSaumya încearcă să resetezi permalinkurile (accesează pagina de permalinkuri și salvează din nou) sau folosește comanda wp-cli wp rewrite flush && wp cache flush

thetwopct thetwopct
28 mai 2021 19:23:36

Nu mai funcționează (august 2022). Nota care menționa că vizualizările individuale au fost eliminate nu mai există nici în documentație.

Blorf Blorf
30 aug. 2022 18:02:34

@blorf nota încă se află în documentație - este listată sub publicly_queryable

rtpHarry rtpHarry
11 sept. 2022 15:54:33

Pentru mine funcționează, folosesc Elementor cu JetEngine și configurez tipul de postare cu public, publicly_queryable și has_archive setate pe true, iar query_var pe false. Arhivele mele funcționează, iar postările individuale redirecționează 301 către pagina principală.

rtpHarry rtpHarry
11 sept. 2022 15:59:56
Arată celelalte 1 comentarii
3
10

O modalitate mai simplă de a face acest lucru poate fi prin transmiterea următoarelor argumente la înregistrarea Tipului de Postare Personalizat

register_post_type('sample_post_type',array(
'labels' => array(
    'name' => _x('Postări Exemplu', 'nume general tip postare'),
    'singular_name' => _x('Postare Exemplu', 'nume singular tip postare')
),
'public' => true,
'exclude_from_search' => true,
'show_in_admin_bar'   => false,
'show_in_nav_menus'   => false,
'publicly_queryable'  => false,
'query_var'           => false
));
24 mai 2014 22:01:04
Comentarii

De fapt, ai nevoie ca publically_querable să fie setat pe true pentru ca Arhivele Tipului de Post să funcționeze.

Howdy_McGee Howdy_McGee
12 nov. 2014 21:42:28

Nu funcționează pentru mine. Doar redirecționează înapoi către pagina principală când încerc să accesez arhiva

Yahya Uddin Yahya Uddin
15 iul. 2015 18:51:10

Setarea query_var pe false doar dezactivează utilizarea variabilelor de interogare în URL, de exemplu /?sample_post_type=sample_slug, dar nu și accesul prin /sample_post_type/sample_slug/

Enchiridion Enchiridion
5 ian. 2021 07:57:12
3

Unu. Din fișierul tău de funcții.

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

Doi. Din fișierul tău single.cpt.php:

<?php wp_redirect( home_url() ); exit; ?>
24 mai 2014 22:10:43
Comentarii

Mi-a plăcut a doua opțiune. Dar trebuie să știu dacă există vreun dezavantaj cu această a doua opțiune.

user2584538 user2584538
10 oct. 2017 09:27:08

@user2584538 Dacă nu ai un fișier personalizat single-cpt_name.php, nu ai putea face asta. Dacă pui funcția într-un simplu fișier de plugin, ai putea activa/dezactiva fără a edita vreun fișier.

Elías Gómez Elías Gómez
5 feb. 2018 12:12:42

Dezavantajul ar fi probabil din punct de vedere SEO. Pentru oricare dintre aceste răspunsuri, aș recomanda adăugarea următorului tag meta <meta name="robots" content="none, nosnippet, noarchive" /> pe fiecare pagină pe care decizi să redirecționezi.

amarinediary amarinediary
2 ian. 2021 04:12:57
3

Bazându-mă pe răspunsul foarte bun al lui Sven, am rescris funcția lui pentru a face mai ușor adăugarea mai multor tipuri de posturi folosind in_array() în declarația if și apoi redirecționând către pagina de arhivă în loc de pagina principală.

(apropo, cred că setarea query_var și/sau publically_queryable la false va dezactiva nu doar vizualizările individuale, dar și vizualizarea nativă de arhivă, suprascriind 'has_archive' => true. În acest caz, poți încă să configurezi un WP_query personalizat și să creezi propria pagină de arhivă, într-un template, dar interogarea principală nu va mai face asta, nu-i așa?)

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' );
9 iul. 2016 19:27:21
Comentarii

a fost o idee bună, dar nu funcționează dacă schimbi redirectarea pentru CPT-uri

rudtek rudtek
23 mar. 2020 19:57:53

Am modificat linia ta wp_redirect în wp_redirect( get_post_type_archive_link( $queried_post_type ), 301 ); funcționează perfect!

rudtek rudtek
23 mar. 2020 20:06:25

Fain. Îmbunătățire bună.

slashbob slashbob
24 mar. 2020 23:18:25
2

În cazul în care doriți să dezactivați complet vizualizarea individuală a tipului de postare personalizată pe frontend, dar să păstrați posibilitatea de a afișa pagina de arhivă, lucrurile devin puțin mai complicate.

Setarea publicly_queryable la false sau rewrite la false va împiedica afișarea atât a vizualizării individuale, cât și a celei de arhivă. Nu există niciun parametru în argumentele funcției register_post_type care să împiedice crearea regulilor de rescriere doar pentru vizualizarea individuală.

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

Totuși, puteți elimina eticheta de rescriere după înregistrarea tipului de postare, iar acest lucru va lăsa regulile de rescriere pentru vizualizarea arhivei neschimbate, dar va elimina doar regulile de rescriere pentru vizualizarea individuală.

/**
 * Înregistrează tipul de postare pentru evenimente
 */
function wpse_128636_register_event_post_type() {

    $labels = array(
        'name' => __( 'Evenimente' ),
        'singular_name' => __( 'Eveniment' ),
        'add_new' => __( 'Adaugă nou' ),
        'add_new_item' => __( 'Adaugă nou' ),
        'edit_item' => __( 'Editează' ),
        'new_item' => __( 'Nou' ),
        'view_item' => __( 'Vezi' ),
        'search_items' => __( 'Caută' ),
        'not_found' => __( 'Nu a fost găsit' ),
        'not_found_in_trash' => __( 'Nu au fost găsite evenimente în coșul de gunoi' ),
        'parent_item_colon' => __( 'Părinte' ),
        'menu_name' => __( 'Evenimente' ),

    );

    $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%' ); // Această linie va elimina regulile de rescriere pentru vizualizarea individuală a evenimentului
}

add_action( 'init', 'wpse_128636_register_event_post_type' );

Un alt avantaj este că de acum înainte puteți crea pagini WordPress simple folosind structura de legături permanente a tipului de postare pentru evenimente (event/pagina-simpla), ceea ce poate fi util în site-uri web complexe.

Nu uitați să resetați regulile de rescriere după modificarea codului.

25 sept. 2019 12:50:03
Comentarii

Acesta ar trebui să fie răspunsul acceptat, este scurt, simplu și nu interferează cu paginile de arhivă.

artist learning to code artist learning to code
12 iun. 2020 23:17:22

Pentru mine, transformă paginile individuale în pagini 404, dar YOAST SEO tot plasează link-urile în harta de site XML.

Jordan Carter Jordan Carter
23 apr. 2021 20:13:26
0

În WordPress 5.9.0 a fost adăugat un nou filtru care permite nu doar dezactivarea postărilor individuale, dar și eliminarea oricăror legături către acestea din ecranele de administrare.

add_filter( 'is_post_type_viewable', function( $is_viewable, $post_type ) {
    if ( 'sample_post_type' === $post_type->name ) {
        return false;
    }
    return $is_viewable;
}, 10, 2 );

Postarea individuală nu se va încărca, dar dacă introduceți manual URL-ul, pagina de start se va încărca în loc de o eroare 404. Pentru a afișa o eroare 404 în locul paginii de start, puteți elimina regula de rescriere după ce tipul de postare este înregistrat.

remove_rewrite_tag( '%sample_post_type%' );

După efectuarea acestor modificări, va trebui să resetați regulile de rescriere.

Folosind aceste 2 metode, veți atinge obiectivul fără șabloane suplimentare, redirecționări și legături stricate în administrare.

21 mar. 2022 16:43:57
0

Soluția mea actuală (în mare parte "soluția de redirecționare") cu o ușoară diferență de implementare.

Aceasta va păstra active paginile de arhivă (has_archive = TRUE)

Dar vă va permite să activați sau să dezactivați paginile individuale atunci când utilizați register_post_type() cu x_has_single = TRUE (parametrul este transmis împreună cu proprietățile obiectului tip post).

add_action( 'init', function() {
    $args = [
        ... // alte variabile
        'public'             => FALSE,
        'publicly_queryable' => TRUE,
        'show_ui'            => TRUE,
        'has_archive'        => 'customers',
        'rewrite'            => [ 'slug' => 'customers', 'with_front' => FALSE ],
        'x_has_single'       => FALSE,
    ];
    register_post_type( 'customers', $args );
} );

add_action( 'template_redirect', function() {
    $post_type = get_post_type() ?: FALSE;
    $post_type_obj = get_post_type_object( $post_type );
    $has_single = $post_type_obj->x_has_single ?? TRUE;
    if ( FALSE === $has_single && $post_type && is_singular( $post_type ) ) {
        wp_redirect( get_post_type_archive_link( $post_type ) ?: '/', 301 );
        exit;
    }
} );
27 sept. 2022 03:57:30