Özel gönderi türleri için özel sayfalandırma (adlara göre)


10

İnsanların isimleriyle ilgilenen iki özel yazı tipim var. Şu anda, görünümlere göz atarken, hepsini alfabetik olarak listeliyor ve sayfalandırma sayıları parçalara ayırıyor, bu da belirli bir kişiyi bulmaya çalışırken çok yararlı değil.

Özellikle, şöyle görünen insanlar için sayfalandırma bağlantıları oluşturmam istendi:

  • AG
  • HM
  • NQ
  • RQ

Benim sorunum - Bir alanın ilk harfiyle özel yazı türlerini nasıl sorgulayabilirim anlayamıyorum. Sonra, sayfalandırmayı bu şekilde nasıl oluşturabileceğimden emin değilim. Kimsenin önerisi var mı? Teşekkür ederim!


İlginç .. Bir şans vereceğim ama çok yakında değil. Birkaç gün sonra boş alanım var. Bundan önce bir şey bulursanız çözümünüzü paylaşın. Sadece aramayı değiştirmek için posts_where filtresine bakmaya başlamak ve yeniden yazma kurallarıyla oynamanız gereken paginasyonu yapmak için query_vars, query_posts ve WP_Rewrite sınıfına bir göz atın. Eminim bu şeylerle çivileyeceksin.
Hameedullah Han

@ mckeodm3 Ne olmuş yani ??
kaiser

Yanıtlar:


4

İlginç soru! WHERESorguları bir grup post_title LIKE 'A%' OR post_title LIKE 'B%' ...cümle ile genişleterek çözdüm. Ayrıca aralık araması yapmak için normal bir ifade kullanabilirsiniz, ancak veritabanının daha sonra bir dizin kullanamayacağına inanıyorum.

Çözümün özü budur: WHEREfıkra üzerinde bir filtre :

add_filter( 'posts_where', 'wpse18703_posts_where', 10, 2 );
function wpse18703_posts_where( $where, &$wp_query )
{
    if ( $letter_range = $wp_query->get( 'wpse18703_range' ) ) {
        global $wpdb;
        $letter_clauses = array();
        foreach ( $letter_range as $letter ) {
            $letter_clauses[] = $wpdb->posts. '.post_title LIKE \'' . $letter . '%\'';
        }
        $where .= ' AND (' . implode( ' OR ', $letter_clauses ) . ') ';
    }
    return $where;
}

Elbette sorgunuzda rastgele harici girişe izin vermek istemezsiniz. Bu nedenle pre_get_posts, iki sorgu değişkenlerini geçerli bir aralığa dönüştüren bir girdi temizleme adımına sahibim . (Bunu kırmanın bir yolunu bulursanız, lütfen bir yorum bırakın, böylece düzeltebilirim)

add_action( 'pre_get_posts', 'wpse18703_pre_get_posts' );
function wpse18703_pre_get_posts( &$wp_query )
{
    // Sanitize input
    $first_letter = $wp_query->get( 'wpse18725_first_letter' );
    $last_letter = $wp_query->get( 'wpse18725_last_letter' );
    if ( $first_letter || $last_letter ) {
        $first_letter = substr( strtoupper( $first_letter ), 0, 1 );
        $last_letter = substr( strtoupper( $last_letter ), 0, 1 );
        // Make sure the letters are valid
        // If only one letter is valid use only that letter, not a range
        if ( ! ( 'A' <= $first_letter && $first_letter <= 'Z' ) ) {
            $first_letter = $last_letter;
        }
        if ( ! ( 'A' <= $last_letter && $last_letter <= 'Z' ) ) {
            if ( $first_letter == $last_letter ) {
                // None of the letters are valid, don't do a range query
                return;
            }
            $last_letter = $first_letter;
        }
        $wp_query->set( 'posts_per_page', -1 );
        $wp_query->set( 'wpse18703_range', range( $first_letter, $last_letter ) );
    }
}

Son adım, bu (aralık) harflerle başlayan tüm yayınları görmek example.com/posts/a-g/veya example.com/posts/agörmek için güzel bir yeniden yazma kuralı oluşturmaktır .

add_action( 'init', 'wpse18725_init' );
function wpse18725_init()
{
    add_rewrite_rule( 'posts/(\w)(-(\w))?/?', 'index.php?wpse18725_first_letter=$matches[1]&wpse18725_last_letter=$matches[3]', 'top' );
}

add_filter( 'query_vars', 'wpse18725_query_vars' );
function wpse18725_query_vars( $query_vars )
{
    $query_vars[] = 'wpse18725_first_letter';
    $query_vars[] = 'wpse18725_last_letter';
    return $query_vars;
}

Başka bir şeyle başlamak için yeniden yazma kuralı düzenini değiştirebilirsiniz. Bu özel bir yazı türü içinse &post_type=your_custom_post_type, değiştirmeye (ile başlayan ikinci dize) eklediğinizden emin olun index.php.

Sayfalandırma bağlantıları eklemek okuyucu için bir alıştırma olarak bırakılır :-)


Sadece bir ipucu: like_escape():)
Kaiser

3

Bu, başlamanıza yardımcı olacaktır. Sorguyu belirli bir harfle nasıl kıracağınızı bilmiyorum ve daha sonra WP'ye daha fazla harf içeren başka bir sayfa olduğunu söyleyin, ancak aşağıdakiler geri kalanının% 99'unu alır.

Çözümünüzü göndermeyi unutmayın!

query_posts( array( 'orderby' => 'title' ) );

// Build an alphabet array
foreach( range( 'A', 'G' ) as $letter )
    $alphabet[] = $letter;

foreach( range( 'H', 'M' ) as $letter )
    $alphabet[] = $letter;

foreach( range( 'N', 'Q' ) as $letter )
    $alphabet[] = $letter;

foreach( range( 'R', 'Z' ) as $letter )
    $alphabet[] = $letter;

if ( have_posts() ) 
{
    while ( have_posts() )
    {
        global $wp_query, $post;
        $max_paged = $wp_query->query_vars['max_num_pages'];
        $paged = $wp_query->query_vars['paged'];
        if ( ! $paged )
            $paged = (int) 1;

        the_post();

        $first_title_letter = (string) substr( $post->post_title, 1 );

        if ( in_array( $first_title_letter, $alphabet ) )
        {
            // DO STUFF
        }

        // Pagination
        if ( $paged !== (int) 1 )
        {
            echo 'First: '._wp_link_page( 1 );
            echo 'Prev: '._wp_link_page( $paged - 1 );
        }
        while ( $i = 1; count($alphabet) < $max_paged; i++; )
        {
            echo $i._wp_link_page( $i );
        }
        if ( $paged !== $max_paged )
        {
            echo 'Next: '._wp_link_page( $paged + 1 );
            echo 'Last: '._wp_link_page( $max_paged );
        }
    } // endwhile;
} // endif;

Test edilmedi.
kaiser

2

Alfa başlangıç ​​ve bitiş parametrelerini kabul eden bir işlev olarak özel yazı türüne sahip @ kaiser örneğini kullanan bir yanıt. Bu örnek, ikincil sayfalamayı içermediği için öğelerin kısa bir listesi içindir. Bunu gönderiyorum, böylece isterseniz kavramı dahil edebileceksiniz functions.php.

// Dr Alpha Paging
// Tyrus Christiana, Senior Developer, BFGInteractive.com
// Call like alphaPageDr( "A","d" );
function alphaPageDr( $start, $end ) {
    echo "Alpha Start";
    $loop = new WP_Query( 'post_type=physician&orderby=title&order=asc' );      
    // Build an alphabet array of capitalized letters from params
    foreach ( range( $start, $end ) as $letter )
        $alphabet[] = strtoupper( $letter );    
    if ( $loop->have_posts() ) {
        echo "Has Posts";
        while ( $loop->have_posts() ) : $loop->the_post();              
            // Filter by the first letter of the last name
            $first_last_name_letter = ( string ) substr( get_field( "last_name" ), 0, 1 );
            if ( in_array( $first_last_name_letter, $alphabet ) ) {         
                //Show things
                echo  "<img class='sidebar_main_thumb' src= '" . 
                    get_field( "thumbnail" ) . "' />";
                echo  "<div class='sidesbar_dr_name'>" . 
                    get_field( "salutation" ) . " " . 
                    get_field( 'first_name' ) . " " . 
                    get_field( 'last_name' ) . "</div>";
                echo  "<div class='sidesbar_primary_specialty ' > Primary Specialty : " . 
                    get_field( "primary_specialty" ) . "</div>";                
            }
        endwhile;
    }
}

1

İşte query_varsve posts_wherefiltrelerini kullanarak bunu yapmanın bir yolu :

public  function range_add($aVars) {
    $aVars[] = "range";
    return $aVars;
}
public  function range_where( $where, $args ) {
    if( !is_admin() ) {
        $range = ( isset($args->query_vars['range']) ? $args->query_vars['range'] : false );
        if( $range ) {
            $range = split(',',$range);
            $where .= "AND LEFT(wp_posts.post_title,1) BETWEEN '$range[0]' AND '$range[1]'";
        }
    }
    return $where;
}
add_filter( 'query_vars', array('atk','range_add') );
add_filter( 'posts_where' , array('atk','range_where') );

Sos: https://gist.github.com/3904986


0

Bu bir cevap değil, daha çok bir yöne doğru bir işaretçi. Bu muhtemelen% 100 özel olmalıdır - ve çok ilgili olacaktır. Özel bir sql sorgusu oluşturmanız gerekir (wpdb sınıflarını kullanarak) ve sayfalandırma için bu parametreleri özel sorgunuza iletirsiniz. Muhtemelen bunun için de yeni yeniden yazma kuralları oluşturmanız gerekir. Dikkat edilmesi gereken bazı fonksiyonlar:

add_rewrite_tag( '%byletter%', '([^/]+)');
add_permastruct( 'byletter', 'byletter' . '/%byletter%' );
$wp_rewrite->flush_rules();
paginate_links()
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.