Özel bir gönderi türü için tek görünüm nasıl devre dışı bırakılır?


46

Özel bir gönderi türü oluşturdum:

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

Bu özel yazı tipi için tekli yazı görünümünü nasıl devre dışı bırakabilirim? Basit bir 404'ü görüntülemek iyi veya ana sayfaya yönlendiriliyor. Bu bir eklentinin içinde olduğundan, boş bir sayfa oluşturmak için tek bir sample_post_type.php dosyası oluşturamıyorum.

Yanıtlar:


42

Sen kullanabilirsiniz template_redirectsen yerine istediğiniz başka bir URL kullanabilirsiniz, özel yazı tipi için yönlendirmek için kanca home_url()ve diğer argüman hata kodu.

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

Güncellenmiş:

Alternatif bir yaklaşım belirlemek olacaktır:

'publicly_queryable'  => false`

Özel gönderiyi daha önce @gustavo tarafından belirtildiği gibi kaydederken. Ancak sayfayı tamamen kaldırır ve sizi 404 sayfaya yönlendirir. Ayrıca, temel olarak tamamen ön uçtan gizlenmiş ve yalnızca özel gönderiler için ayarlanabilir tekli ve arşiv sayfasını gizler.

^ Yalnızca admin / arka uç kullanımı için özel bir gönderi kaydetmek istiyorsanız bu yaklaşım işe yarar.


İyi bir çözüm. Sadece olmadığını görmek için kontrol ederek, doğrulanmamış kullanıcılar için bu yönlendirmeyi gerçekleştirmek için yararlı olduğunu bulduk get_current_user_id()değerlendirir 0'a
RevNoah

2
Lütfen cevap formunu kontrol edin @Gustavo
Richard

2
neden sadece kullanmayan is_singular('post-type-slug')içinde if()2 koşulların yerine koşulu?
Akash K.,

@AkashK. Evet de işe yarayabilir, işlevin farkında değildi.
Kumar

74

Sadece argümanı ayarlamak

'publicly_queryable'  => false

register_post_type () işlevini çağırdığınızda


1
Bu, tüm veritabanı referanslarını oluştururken CPT'nizin gerçek web sayfaları oluşturmasını durdurma cevabına benziyor.
Ben Racicot

27
Bu arşivi de gizler
uzay adamı

1
Bu kabul edilen cevap olmalı.
SinisterBeard

Benim için bu, 404 yerine anasayfaya yönlendirmeye neden oluyor. Neden? Post_type'i Piklist'e kaydettiriyorum, konuyla ilgili olabilir.
emersonthis

8

Özel Yazı Tipini kaydederken aşağıdakileri geçerek bunu yapmanın daha basit bir yolu

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
publically_querableYazı Tipi Arşivlerinin çalışması için gerçekten doğru olmanız gerekir .
Howdy_McGee

Bu benim için çalışmıyor. Arşive gitmeye çalışırken justs tekrar anasayfaya yönlendiriyor
Yahya Uddin

7

Bir. İşlevlerinizden.

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

İki. Single.cpt.php dosyanızdan:

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

İkinci seçeneği sevdim. Ama bilmem gereken bu ikinci seçeneğin bir sakıncası var.
user2584538

@ user2584538 Özel bir single-cpt_name.phpdosyanız yoksa, yapamazsınız. İşlevi basit bir eklenti dosyasına koyarsanız, herhangi bir dosyayı düzenlemeden etkinleştirebilir / devre dışı bırakabilirsiniz.
EliasNS

2

Sven'in gerçekten iyi bir cevabından yola in_array()çıkarak if if ifadesini kullanarak birden fazla gönderi türü eklemeyi kolaylaştırmak ve ardından ana sayfa yerine arşiv sayfasına yönlendirmek için işlevini yeniden yazdım .

(bu arada, ayarın query_varve / veya publically_queryableyanlış seçeneğinin yalnızca tek görünümleri değil, aynı zamanda yerel arşiv görünümünü de geçersiz 'has_archive' => truekılacağını düşünüyorum. Bu durumda, özel bir WP_query ayarlayabilir ve kendi arşiv sayfanızı oluşturabilirsiniz. Bir şablon, fakat ana sorgu bunu daha fazla yapmayacak, değil mi?)

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

Yukarıda belirtilenlerin hepsinde test edilmiştir ve gerçek çözüm önerilen yönlendirmelerden daha basittir.

Arşiv erişilebilir olması ve öğeleri listelemek için ve tek gönderide değil 404 setine erişilebilir ve otomatik yönlendirme olacak

'query_var' => false

CPT’nizi kaydederken. publicly_queryableSahte olarak ayarlarsanız , arşivleriniz eve yönlendirilir , diğer birleşik işler çalışmayacaktır. query_varFalse olarak ayarlayın ve o kadar.

İşte tam CPT https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a

50 satırına bakın https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a#file-thz_cpt_items_single_view_redirect-php-L50

burada belirtildiği gibi

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

Not: query_var boş, null veya boolean FALSE ise, WordPress yine onu yorumlamaya çalışacaktır (4.2.2) ve özel gönderinizin önizlemeleri / görünümleri 404'leri döndürecektir.


Biraz kesmek gibi hissediyor ama işe yarıyor. Keşke bunun yerine mevcut bir has_archive özelliği ile birlikte özel bir has_single özelliği eklesinlerdi.
powerbuoy

0

Özel yazı tipini tamamen önyüzünde tekli görünümden tamamen devre dışı bırakmak istediğinizde ancak arşiv sayfasını görüntüleyebilmeniz durumunda işler biraz karmaşıklaşıyor.

Ayar publicly_queryableiçin falseya rewritehiç falsehem tek ve arşiv görüntüsünü görüntülemek için önleyecektir. register_post_typeİşlev bağımsız değişkenlerinde yalnızca tek görünümlü yeniden yazma kuralları oluşturmayı engelleyen hiçbir bayrak yoktur .

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

Ancak, yazı türünüzü kaydettikten sonra yeniden yazma etiketini kaldırabilirsiniz ve bu, arşiv görünümündeki yeniden yazma kurallarına dokunulmamış, ancak yalnızca tek görünümlü yeniden yazma kurallarını kaldıracaktır.

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

Diğer bir avantajı, bundan böyle event/simple-pagekarmaşık web sitelerinde yardımcı olabilecek olay sonrası türü permalink yapısını ( ) kullanarak basit WordPress sayfaları oluşturabilmenizdir .

Kod değişikliğinden sonra yeniden yazma kurallarını temizlemeyi unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.