Özel bir yazı tipi arşivi ön sayfa olarak nasıl kullanılır?


16

Sitenin ön sayfası olarak özel bir yazı türü arşivi kullanmak istiyorum, böylece

 http://the_site.com/

dosyama göre görüntülenen özel bir yazı tipi arşividir archive-{post-type}.php.

İdeal olarak is_front_page()benim functions.phpdosya kullanarak sorgu değiştirmek istiyorum . Ön sayfam olarak "Ana Sayfa" adlı bir sayfayla aşağıdakileri denedim:

 add_filter('pre_get_posts', 'my_get_posts');
 function my_get_posts($query){
     global $wp_the_query;
     if(is_front_page()&&$wp_the_query===$query){
        $query->set('post_type','album');
        $query->set('posts_per_page',-1);
     }
     return $query;
 }

ancak ön sayfa "Ana Sayfa" içeriğini döndürüyor ve özel sorguyu yok sayıyor gibi görünüyor.

Neyi yanlış yapıyorum? Genel olarak bunu yapmanın daha iyi bir yolu var mı?


is_front_page (), pre_get_posts ile çalışmaz
Brad Dalton

Yanıtlar:


27

Ana sayfanız olarak statik bir sayfa ayarladıktan sonra bunu sayfanıza ekleyebilirsiniz functions.phpve hazırsınız. Bu, archive-POSTTYPE.phpşablonu doğru şekilde çağırır .

add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
    //Ensure this filter isn't applied to the admin area
    if(is_admin()) {
        return;
    }

    if($wp_query->get('page_id') == get_option('page_on_front')):

        $wp_query->set('post_type', 'CUSTOM POST TYPE NAME HERE');
        $wp_query->set('page_id', ''); //Empty

        //Set properties that describe the page to reflect that
        //we aren't really displaying a static page
        $wp_query->is_page = 0;
        $wp_query->is_singular = 0;
        $wp_query->is_post_type_archive = 1;
        $wp_query->is_archive = 1;

    endif;

}

Bu işlev if(is_admin()) return;en başta gerekir, aksi takdirde yönetici alanı ile uğraşır.
brasofilo

1
Bu benim için çalışırken, birincil ve ikincil menülerim sonuç olarak kayboldu.
super9

Neredeyse doğru. Bu kod tüm wp_queries değiştiriyor, bu yüzden if ($ wp_query-> get .....) yerine if (is_home ()) olmalıdır
Leo Caseiro

Aynı kullanıyorum ama ön sayfa yerine özel sayfa şablonumda ve hiçbir sonuç göstermiyor (özel yayın eklenmemiş gibi). Düşüncesi olan var mı?
trainoasis

Bu çözüm sayfalamayı desteklemiyor. Herhangi bir / sayfa / 2 URL'si hala ilk 10 yayını gösterir.
rg89

6

CPT arşivinizi home.php olarak yeniden adlandırın

Ardından, ana sayfa sorgusunu yalnızca CPT'nin görüntüleyeceği şekilde değiştirmek için pre_get_posts kullanın

function wpsites_home_page_cpt_filter($query) {
if ( !is_admin() && $query->is_main_query() && is_home() ) {
$query->set('post_type', array( 'your-cpt' ) );
    }
  }

add_action('pre_get_posts','wpsites_home_page_cpt_filter');

-Pt'nizi özel posta türünüzün adıyla değiştirin.


2
Son olarak, açık, uygulanabilir bir açıklama!
Jack

1

Cevabınız için teşekkürler ljaas — Bu sorunu çözmek istiyordum. Özel yazı tipi arşiv şablonunu çağırmak için aşağıdaki koşulları eklemek zorunda kaldım:

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;

2
Merhaba Eli, WPSE'ye hoş geldiniz. "Yanıtlar" ilk soruyu cevaplamak içindir (stackexchange siteleri iş parçacığı tartışma forumları değildir ). Bu bir yorum için çok daha uygun olacaktır .
Johannes Pille

Açıklama için teşekkürler Johannes. Ben de 'Yorum ekle' özelliği mevcut olmadığından, cevaba nasıl yorum yapılacağını anlayamadım diye düşündüm. Bu zamana duyarlı bir özellik mi, yoksa kör müyüm?
Eli

0

Bu, Ayarlar> Okuma> Ön sayfa ekranlarında hem blog yayınlarını hem de statik sayfayı geçersiz kılmam için daha iyi çalışır:

<?php
/**
 * Set custom post type archive as front page.
 *
 * @since 1.0.0
 */
function ql_set_as_front_page( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    if ( ql_is_front_page( $query ) ) {
        $query->set( 'page_id', '' );
        $query->is_page = false;
        $query->is_singular = false;
        $query->set( 'post_type', 'MYCPT' );
        $query->is_archive = true;
        $query->is_post_type_archive = true;
    }
}
add_action( 'pre_get_posts', 'ql_set_as_front_page' );

/**
 * Taken from WP_Query::is_front_page and adapted to compare page_on_front with current page ID.
 * 
 * @since 1.0.0
 * 
 * @param object $query The main WP Query.
 */
function ql_is_front_page( $query ) {
    if ( 'posts' == get_option( 'show_on_front') && $query->is_home() )
        return true;
    elseif ( 'page' == get_option( 'show_on_front') && get_option( 'page_on_front' ) && $query->get('page_id') == get_option( 'page_on_front' ) )
        return true;
    else
        return false;
}

Ben filtreleri kullanarak bir şablon geçersiz kılma ile birlikte kullanıyorum front_page_templateve home_templateözel bir şablon dönmek için.


0

Benim için sayfalandırmayı bozar: ana sayfa olarak dizini veya statik sayfayı seçerseniz, sayfalandırma bağlantıları gösterilir, ancak sayfa 2'ye tıkladığınızda:

  • dizin sayfası olması durumunda (varsayılan): 404 sayfası
  • statik sayfa olması durumunda: sayfa 1 ile aynı sonuçlar: "sayfalanmış" bağımsız değişkeni, daha sonra yazı türü listesi sayfalamasını değil, sayfa türü sayfalamasını göstermek üzere yorumlanır.

Sayfalanmış argümanı yakalamak ve doğru bir şekilde iletmek için bazı yeniden yazma kurallarına ihtiyacı olduğunu düşünüyorum.

Her neyse, bazı yeniden yazma kurallarına sahip özel bir şablon sayfası çözüm olmalıdır.

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.