Single-custom.php üzerinde WP_Query Sayfalandırma


16

Ne yapmak istiyorum:

WP_QueryTek özel-post-type.php şablon dosyasındaki kurulum sayfalaması

Ne yaptım

1) "Yazarlar" adlı bir gönderi türü oluşturuldu. Bu yazı türündeki her gönderi tek bir yazara aittir.

2) Standart yazı düzenleme ekran sayfaları, yazarların özel yazı türündeki tüm yayınları (yazarları) listeleyen bir açılır liste içerir.

3) Tüm yayınları açılır menüden yazar meta verileriyle sorgulayan tek bir authors.php şablonu oluşturduğundan sonuç, aynı yazarın kendilerine atanmış yayınların bir listesi (bir tür arşiv gibi):

<?php

// set the "paged" parameter (use 'page' if the query is on a static front page)
global $paged;

/*We need this here to add and maintain Pagination if Template is assigned to Front Page*/
if ( get_query_var( 'paged' ) ) {
    $paged = get_query_var('paged');
} elseif ( get_query_var( 'page' ) ) {
    $paged = get_query_var( 'page' );
} else {
    $paged = 1;
}

$args = array(
    'posts_per_page'    =>  10,
    'meta_key'          => 'author_select',
    'meta_value'        => $author_id,
    'paged'             => $paged,
);

$temp = $wp_query;
$wp_query = NULL;

$wp_query = new WP_Query($args);

?>

<?php if( $wp_query->have_posts() ) : ?>    
    <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
    <?php // Successfully outputs the results of the above query, so I've omitted the code from this example. ?>

    <?php endwhile; ?>

<div class="single_navigation"> 
    <?php if( get_adjacent_post( false, '', true ) ) { ?>
        <span class="prev"><?php previous_post_link( '&lt; %link' ) ?></span>
    <?php } ?>

    <?php if( get_adjacent_post( false, '', false ) ) { ?>
        <span class="next"><?php next_post_link( '%link &gt;' ) ?></span>
    <?php } ?>
    </div><!--/single navigation-->
<?php endif; ?>

<?php
    $wp_query = null;
    $wp_query = $temp;
    wp_reset_query();
?>

Ne takıldım

Sayfalandırma bağlantıları görünmez. Biraz araştırma yaptım ve $wp_querydeğişken kullandığımı bulduk , ancak sorgu değişkenimi değiştirdiğimde $wp_querybağlantılar ortaya çıktı, ancak tıklandığında hiçbir şey yapmadı.

Nerede yanlış yaptığım hakkında bir fikrin var mı?

Düzenle:

Bazı sorularınızı yanıtlamak için, sorgum sorguladığım yayınları başarıyla çıktı, $ author_id zaten bu kod snippet'ine dahil etmediğim bir değere sahip. Benzer şekilde, bu bölüm sorun olmadığı için while döngüsü içindeki gerçek içerik çıktısını dışarıda bıraktım. Sorun, bu tek gönderide zaten var olan içeriği sayfalandırmam gerekiyor.

Bu işlevin amacı, gönderilerin özel yazarlara sahip olmasını sağlamaktır (yerleşik Kullanıcılar sisteminin dışında) ve bu şablonun amacı belirli bir yazarın (zaten çalışıyor) tüm gönderilerini çıktılamaktır.


3
İyi biçimlendirilmiş bir soru için bir yukarı oy, ancak bunu neden yaptığınızı açıklamamış olsanız da, mevcut yazar kutusunun ilgili yayınları mı?
Tom J Nowell

1
@TomJNowell ile gerçekten hemfikirim. +1
Pieter Goosen

2
İlgisiz, ama yankılamak gerekli değilthe_title()
Pieter Goosen

2
Is 'meta_value' => $author_idsöz açılır listeden dolduruluyor? Her bir yazarı açılır menüden seçerken, ilk on gönderi doğru bir şekilde gösteriliyor mu?
Stephen S.

1
Kullanılabileceğinden emin mı $author_query->have_posts()döner trueve o $author_queryaslında herhangi bir yayını içermektedir?
kaiser

Yanıtlar:


17

2 sorununuz var.

İlk sorun

Çizgi

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

tekil yazı görünümünde, URL içerdiğinde '/page/XX/', WordPress değişkenleri değişir 'page've değildir 'paged'.

Bunun 'page'yerine kullanmayı düşünebilirsiniz 'paged', ancak bu da işe yaramaz, çünkü 'page'değişken çok sayfalı tekil yazı (sayfa ayırma kullanarak <!--nextpage-->) için kullanıldığında ve yazı çok sayfalı olmadığında, WordPress isteği yeniden yönlendirir URL olmadan '/page/XX/'.

Sorgu değişkeninizi adlandırdığınızda olan şey budur $wp_query.

Çözüm, kendisinden sorumlu olan işlevi 'redirect_canonical'içine alarak bu yönlendirmeyi önlemektir 'template_redirect':

Yani, functions.phpeklediğinizde:

add_action( 'template_redirect', function() {
    if ( is_singular( 'authors' ) ) {
        global $wp_query;
        $page = ( int ) $wp_query->get( 'page' );
        if ( $page > 1 ) {
            // convert 'page' to 'paged'
            $wp_query->set( 'page', 1 );
            $wp_query->set( 'paged', $page );
        }
        // prevent redirect
        remove_action( 'template_redirect', 'redirect_canonical' );
    }
}, 0 ); // on priority 0 to remove 'redirect_canonical' added with priority 10

Şimdi WordPress artık yönlendirmeyecek ve 'paged'var değişkenini doğru ayarlayacaktır .

İkinci sorun

next_posts_link()ve previous_posts_link()her ikisi de if ( ! is_single() )sayfalandırmayı görüntülemek için işaretler.

Şimdi, is_single()sizin durumunuz için doğrudur, çünkü 'yazar' türünün tek bir gönderisindesiniz, bu nedenle bu işlevler beklediğiniz gibi çalışamaz.

3 olasılığınız var:

  1. Kullanım query_postsana sorgu geçersiz kılmak için (gerçekten değil önerilir)
  2. Bir kullan özel sayfa şablonu nedeniyle, bunun yerine özel bir mesaj Çeşidi is_single()sayfaları için yanlıştır ve kodunuzu oraya çalışacaktır.
  3. Kendi sayfalama fonksiyonunuzu yazın ve bunu kullanın

3. çözüm numarasının kodu:

function my_pagination_link( $label = NULL, $dir = 'next', WP_Query $query = NULL ) {
    if ( is_null( $query ) ) {
        $query = $GLOBALS['wp_query'];
    }
    $max_page = ( int ) $query->max_num_pages;
    // only one page for the query, do nothing
    if ( $max_page <= 1 ) {
        return;
    }
    $paged = ( int ) $query->get( 'paged' );
    if ( empty( $paged ) ) {
        $paged = 1;
    }
    $target_page = $dir === 'next' ?  $paged + 1 : $paged - 1;
    // if 1st page requiring previous or last page requiring next, do nothing
    if ( $target_page < 1 || $target_page > $max_page ) {
        return;
    }
    if ( null === $label ) {
        $label = __( 'Next Page &raquo;' );
    }

    $label = preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label );
    printf( '<a href="%s">%s</a>', get_pagenum_link( $target_page ), esc_html( $label ) );
}

ve şu şekilde kullanın single-authors.php:

my_pagination_link( 'Older Entries', 'next', $author_query );
my_pagination_link( 'Newer Entries', 'prev', $author_query );

Çok detaylı cevap, teşekkürler! Bu, sitenin İngilizce tarafı için çalışıyor, ancak Fransız tarafında sayfalandırma bağlantıları hiçbir şey yapmıyor, sadece sayfayı yeniliyorlar. WPML kullanıyorum.
Shane,

1
@Shane, WPML'nin kodun çalışmasını engelleyen bir filtre çalıştırdığı görülüyor. Ama çok büyük bir eklenti, ve bu yüzden karışıklığın nerede olduğunu anlamak için binlerce kod satırını kazamıyorum. WPML desteği isteyin.
gmazzap

@Shane WPML Destek forumları - ve yukarıda (varsayalım) için çalışıyorsa, lütfen çözüm olarak işaretleyin. WPML çakışması zaten bu sitenin konusu dışında / kapsamı dışında.
kaiser

Fantastik cevap, temel olarak sayfalandırma sorunumu düzeltmeme yardımcı oldu. Benzer bir görev yapıyorum ve döngü için ikinci bir WP_Query oluşturduk. Aradım the_posts_paginationama bu soruya belirtildiği gibi orijinal WP_Query bir kopyasını almak zorunda: wordpress.stackexchange.com/questions/216821/...
Alexander Holsgrove

1
Haklısın @HongPong, düzeltildi, teşekkürler.
gmazzap

0

Benzer bir WPSE sorusuna dayanarak " Sayfalandırma wp_query özel alan değerleri çalışmıyor ", global $paged;şablon dosyanızın başına eklemenizi öneririm :

global $paged;
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

1
Yanıtınız için teşekkürler! Ne yazık ki herhangi bir fark yaratmıyor gibi görünüyor. Sayfalandırma bağlantıları görünmüyor
Shane,

1
Stephen, neden yardım etsin? Evet, bu onu küresel bağlamdan getirecektir, ancak şu ana kadar onunla hiçbir şey yapmıyorsunuz. Global olanı geçersiz kılmak istiyorsanız, kullanın $GLOBALS['paged'] = get_query_var( 'paged' );. Başka sadece global içeriği kullanın.
kaiser

@Shane Hmm, şablon sayfası statik bir ön sayfa olarak mı kullanılıyor?
Stephen S.

Hayır, yalnızca özel gönderi türü için tek bir gönderi şablonu olarak kullanılıyor. Ben benim sorgu değiştirmeyi deneyin vermedi $author_queryiçin $wp_queryben üzerinde Sayfa yenilemeleri tıklayın ve aslında bir sonraki sayfaya gitmek vermediğinde birden çok sayfa bulunmasına rağmen ve bu sayfalandırma görünmesi için görünüyordu, ama. Cevabımı bu değişiklikleri yansıtacak şekilde güncelledim.
Shane

1
Php.net açıklama o kadar kötü değil. Sadece globalve ile oynamayı öneririm $GLOBALS. Biraz var_dump(), bazı fonksiyonlar ve iyisin. Gerçekten biraz deneyin / hata ile anlamak için yaklaşık. yarım saat gerekir. Bu, sınıflara karşı işlevleri ve bir bütün olarak OOP yaklaşımını daha iyi anlamanıza yardımcı olacaktır. Ve açıkça isim alanlarını anlamaya daha da yaklaşacaktır :)
kaiser
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.