맞춤 게시물 유형에 대한 맞춤 페이지 매김 (이름 별)


10

사람들의 이름을 다루는 두 가지 사용자 정의 게시물 유형이 있습니다. 지금은 탐색보기에서 알파벳순으로 모두 나열하고 페이지 매김은 숫자로 구분하므로 특정 사람을 찾으려고 할 때 크게 도움이되지 않습니다.

특히 다음과 같은 사람들을위한 페이지 매김 링크를 만들라는 요청을 받았습니다.

  • AG
  • HM
  • NQ
  • RQ

내 문제-한 필드의 첫 글자로 사용자 정의 게시물 유형을 쿼리하는 방법을 알 수 없습니다. 그런 다음 어떻게 이런 방식으로 페이지 매김을 만들 수 있는지 잘 모르겠습니다. 아무도 제안 사항이 있습니까? 감사합니다!


흥미 롭군요 며칠 후 무료 슬롯이 있습니다. 그 전에 무언가를 찾으면 솔루션을 공유하십시오. posts_where 필터를 살펴보고 조회를 수정하고 다시 쓰기 규칙을 사용하여 페이지 매김을 수행하려면 query_vars, query_posts 및 WP_Rewrite 클래스를 살펴보십시오. 나는 당신이 이것들로 그것을 못 박을 것이라고 확신합니다.
Hameedullah Khan

@ mckeodm3 그래서 뭐 ??
카이저

답변:


4

재미있는 질문! WHERE많은 post_title LIKE 'A%' OR post_title LIKE 'B%' ...절로 쿼리를 확장하여 해결했습니다 . 정규 표현식을 사용하여 범위 검색을 수행 할 수도 있지만 데이터베이스는 색인을 사용할 수 없다고 생각합니다.

이것이 솔루션의 핵심입니다 : WHERE절 에 대한 필터 :

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

물론 쿼리에 임의의 외부 입력을 허용하고 싶지 않습니다. 그렇기 때문에 pre_get_posts두 개의 쿼리 변수를 유효한 범위로 변환 하는 입력 삭제 단계가 있습니다. (이 문제를 해결할 수있는 방법을 찾으면 의견을 남겨 주시면 수정할 수 있습니다)

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

마지막 단계는 꽤 재 작성 규칙을 작성 하여이 범위의 문자로 시작 example.com/posts/a-g/하거나 example.com/posts/a모든 게시물을 볼 수 있도록 하는 것입니다.

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

다시 쓰기 규칙 패턴을 변경하여 다른 것으로 시작할 수 있습니다. 맞춤 게시물 유형 인 &post_type=your_custom_post_type경우 대체 (으로 시작하는 두 번째 문자열) 에 추가 해야합니다 index.php.

페이지 매김 링크 추가는 독자의 연습으로 남아 있습니다 :-)


힌트 만 : like_escape():)
kaiser

3

이렇게하면 시작하는 데 도움이됩니다. 특정 문자로 쿼리를 나누는 방법을 모르고 WP에 더 많은 문자가있는 다른 페이지가 있다고 말하지만 다음은 나머지 99 %를 차지합니다.

솔루션을 게시하는 것을 잊지 마십시오!

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;

테스트되지 않았습니다.
카이저

2

@kaiser의 예를 사용하여 응답을 사용자 정의 게시물 유형과 함께 알파 시작 및 종료 매개 변수를 허용하는 함수로 사용합니다. 이 예제는 보조 페이징을 포함하지 않기 때문에 간단한 항목 목록에 대한 것입니다. 원하는 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

query_varsposts_where필터 를 사용하여이를 수행하는 방법은 다음과 같습니다 .

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

수스 : https://gist.github.com/3904986


0

이것은 많은 대답이 아니라 취할 방향에 대한 포인터입니다. 이것은 아마도 100 % 커스텀이어야하고 매우 관여 할 것입니다. wpdb 클래스를 사용하여 사용자 지정 SQL 쿼리를 생성 한 다음 페이지 매김을 위해 이러한 매개 변수를 사용자 지정 쿼리에 전달해야합니다. 아마도 이것에 대한 새로운 다시 쓰기 규칙도 만들어야 할 것입니다. 살펴볼 기능들 :

add_rewrite_tag( '%byletter%', '([^/]+)');
add_permastruct( 'byletter', 'byletter' . '/%byletter%' );
$wp_rewrite->flush_rules();
paginate_links()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.