사용자 정의 루프의 페이지 매김을 수정하는 방법은 무엇입니까?
4 대답
- 투표
-
- 2015-11-09
이 코드를 페이지 매김이있는 사용자 지정 루프에 사용합니다.
<?php if ( get_query_var('paged') ) { $paged = get_query_var('paged'); } elseif ( get_query_var('page') ) { // 'page' is used instead of 'paged' on Static Front Page $paged = get_query_var('page'); } else { $paged = 1; } $custom_query_args = array( 'post_type' => 'post', 'posts_per_page' => get_option('posts_per_page'), 'paged' => $paged, 'post_status' => 'publish', 'ignore_sticky_posts' => true, //'category_name' => 'custom-cat', 'order' => 'DESC', // 'ASC' 'orderby' => 'date' // modified | title | name | ID | rand ); $custom_query = new WP_Query( $custom_query_args ); if ( $custom_query->have_posts() ) : while( $custom_query->have_posts() ) : $custom_query->the_post(); ?> <article <?php post_class(); ?>> <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3> <small><?php the_time('F jS, Y') ?> by <?php the_author_posts_link() ?></small> <div><?php the_excerpt(); ?></div> </article> <?php endwhile; ?> <?php if ($custom_query->max_num_pages > 1) : // custom pagination ?> <?php $orig_query = $wp_query; // fix for pagination to work $wp_query = $custom_query; ?> <nav class="prev-next-posts"> <div class="prev-posts-link"> <?php echo get_next_posts_link( 'Older Entries', $custom_query->max_num_pages ); ?> </div> <div class="next-posts-link"> <?php echo get_previous_posts_link( 'Newer Entries' ); ?> </div> </nav> <?php $wp_query = $orig_query; // fix for pagination to work ?> <?php endif; ?> <?php wp_reset_postdata(); // reset the query else: echo '<p>'.__('Sorry, no posts matched your criteria.').'</p>'; endif; ?>
출처 :
I use this code for custom loop with pagination:
<?php if ( get_query_var('paged') ) { $paged = get_query_var('paged'); } elseif ( get_query_var('page') ) { // 'page' is used instead of 'paged' on Static Front Page $paged = get_query_var('page'); } else { $paged = 1; } $custom_query_args = array( 'post_type' => 'post', 'posts_per_page' => get_option('posts_per_page'), 'paged' => $paged, 'post_status' => 'publish', 'ignore_sticky_posts' => true, //'category_name' => 'custom-cat', 'order' => 'DESC', // 'ASC' 'orderby' => 'date' // modified | title | name | ID | rand ); $custom_query = new WP_Query( $custom_query_args ); if ( $custom_query->have_posts() ) : while( $custom_query->have_posts() ) : $custom_query->the_post(); ?> <article <?php post_class(); ?>> <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3> <small><?php the_time('F jS, Y') ?> by <?php the_author_posts_link() ?></small> <div><?php the_excerpt(); ?></div> </article> <?php endwhile; ?> <?php if ($custom_query->max_num_pages > 1) : // custom pagination ?> <?php $orig_query = $wp_query; // fix for pagination to work $wp_query = $custom_query; ?> <nav class="prev-next-posts"> <div class="prev-posts-link"> <?php echo get_next_posts_link( 'Older Entries', $custom_query->max_num_pages ); ?> </div> <div class="next-posts-link"> <?php echo get_previous_posts_link( 'Newer Entries' ); ?> </div> </nav> <?php $wp_query = $orig_query; // fix for pagination to work ?> <?php endif; ?> <?php wp_reset_postdata(); // reset the query else: echo '<p>'.__('Sorry, no posts matched your criteria.').'</p>'; endif; ?>
Source:
-
- 2016-12-17
항상 그렇듯이 훌륭합니다. 이에 대한 부록으로 일부 "소개 텍스트"에 대해 페이지에 첨부 된 전역 페이지 템플릿을 사용하고 그 뒤에 페이징 할 하위 쿼리가 오는 상황을 고려하십시오.
위에서 언급 한대로 대부분 기본값으로 paginate_links () 를 사용합니다. 예쁜 영구 링크가 켜져 있음) 페이지 매김 링크는 기본적으로
mysite.ca/page-slug/page/#
로 설정됩니다.하지만 WordPress가 알지 못하기 때문에404
오류가 발생합니다. 특정 URL 구조에 대해 실제로 "page-slug"의 하위 인 "page"의 하위 페이지를 찾습니다.여기서 트릭은
/page/#/
구조를 받아들이고이를 쿼리 문자열에 다시 쓰는 특정 "의사 아카이브 페이지"페이지 슬러그에만 적용되는 멋진 재 작성 규칙을 삽입하는 것입니다. WordPress는mysite.ca/?pagename=page-slug&paged=#
를 이해할 수 있습니다.pagename
및paged
가 아닌name
및page
에 유의하십시오 (이로 인해 문자 그대로 HOURS의 슬픔이 발생하여이 답변에 동기를 부여했습니다! ).다음은 리디렉션 규칙입니다.
add_rewrite_rule( "page-slug/page/([0-9]{1,})/?$", 'index.php?pagename=page-slug&paged=$matches[1]', "top" );
항상 그렇듯이 재 작성 규칙을 변경할 때는 관리자 백엔드에서 설정> 영구 링크로 이동하여 영구 링크를 비우십시오 .
이러한 방식으로 작동 할 페이지가 여러 개인 경우 (예 : 여러 사용자 지정 게시물 유형을 처리하는 경우) 각 페이지 슬러그에 대해 새 재 작성 규칙을 생성하지 않는 것이 좋습니다. 귀하가 식별하는 모든 페이지 슬러그에 대해 작동하는보다 일반적인 정규식을 작성할 수 있습니다.
한 가지 접근 방식은 다음과 같습니다.
function wpse_120407_pseudo_archive_rewrite(){ // Add the slugs of the pages that are using a Global Template to simulate being an "archive" page $pseudo_archive_pages = array( "all-movies", "all-actors" ); $slug_clause = implode( "|", $pseudo_archive_pages ); add_rewrite_rule( "($slug_clause)/page/([0-9]{1,})/?$", 'index.php?pagename=$matches[1]&paged=$matches[2]', "top" ); } add_action( 'init', 'wpse_120407_pseudo_archive_rewrite' );
단점/주의 사항
이 방법의 단점 중 하나는 페이지 슬러그의 하드 코딩입니다. 관리자가 해당 의사 아카이브 페이지의 페이지 슬러그를 변경하면 건배입니다. 재 작성 규칙이 더 이상 일치하지 않으며 끔찍한 404가 표시됩니다.
이 방법에 대한 해결 방법을 생각할 수 있을지 모르겠지만 어떻게 든 재 작성 규칙을 트리거 한 글로벌 페이지 템플릿이라면 좋을 것입니다. 다른 사람이 특정 너트를 깨지 않은 경우 언젠가이 답변을 다시 볼 수 있습니다.
Awesome as always Chip. As an addendum to this, consider the situation whereby you are using a global page template attached to a Page for some "intro text" and it's followed by a subquery that you want to be paged.
Using paginate_links() as you mention above, with mostly defaults, (and assuming you have pretty permalinks turned on) your pagination links will default to
mysite.ca/page-slug/page/#
which is lovely but will throw404
errors because WordPress doesn't know about that particular URL structure and will actually look for a child page of "page" that's a child of "page-slug".The trick here is to insert a nifty rewrite rule that only applies to that particular "pseudo archive page" page slug that accepts the
/page/#/
structure and rewrites it to a query string that WordPress CAN understand, namelymysite.ca/?pagename=page-slug&paged=#
. Notepagename
andpaged
notname
andpage
(which caused me literally HOURS of grief, motivating this answer here!).Here's the redirect rule:
add_rewrite_rule( "page-slug/page/([0-9]{1,})/?$", 'index.php?pagename=page-slug&paged=$matches[1]', "top" );
As always, when changing rewrite rules, remember to flush your permalinks by visiting Settings > Permalinks in the Admin back-end.
If you have multiple pages that are going to behave this way (for example, when dealing with multiple custom post types), you might want to avoid creating a new rewrite rule for each page slug. We can write a more generic regular expression that works for any page slug you identify.
One approach is below:
function wpse_120407_pseudo_archive_rewrite(){ // Add the slugs of the pages that are using a Global Template to simulate being an "archive" page $pseudo_archive_pages = array( "all-movies", "all-actors" ); $slug_clause = implode( "|", $pseudo_archive_pages ); add_rewrite_rule( "($slug_clause)/page/([0-9]{1,})/?$", 'index.php?pagename=$matches[1]&paged=$matches[2]', "top" ); } add_action( 'init', 'wpse_120407_pseudo_archive_rewrite' );
Disadvantages / Caveats
One disadvantage of this approach that makes me puke in my mouth a little is the hard-coding of the Page slug. If an admin ever changes the page slug of that pseudo-archive page, you're toast - the rewrite rule will no longer match and you'll get the dreaded 404.
I'm not sure I can think of a workaround for this method, but it would be nice if it were the global page template that somehow triggered the rewrite rule. Some day I may revisit this answer if no one else has cracked that particular nut.
-
포스트 저장을 연결하고 페이지에 메타 키`_wp_page_template` 아래에 아카이브 템플릿이 있는지 확인한 다음 다른 재 작성 및 비우기 규칙을 추가 할 수 있습니다.You could hook post save, check if the page has your archive template under the meta key `_wp_page_template`, then add another rewrite and flush rules.
- 1
- 2016-12-17
- Milo
-
- 2017-01-13
<인용구>query_posts ()
를 통해 메인 루프 쿼리를 수정했습니다. 페이지 매김이 작동하지 않는 이유는 무엇이며 어떻게 수정합니까?생성 된 Great answer Chip은 오늘 수정해야합니다.
한동안 기본 쿼리가 실행 된 직후$ wp_query
전역과 동일해야하는$ wp_the_query
변수가 있습니다.이것이 Chip의 답변에서 나온 이유입니다.
<인용구>주 쿼리 개체 해킹
더 이상 필요하지 않습니다. 임시 변수를 생성하면이 부분을 잊을 수 있습니다.
//페이지 매김 수정 $temp_query=$ wp_query; $ wp_query=NULL; $ wp_query=$ custom_query;
이제 전화 할 수 있습니다.
$ wp_query=$ wp_the_query;
또는 더 나은 방법으로 전화 할 수 있습니다. <사전> <코드> wp_reset_query ();
설명 된 다른 모든 칩은 그대로 유지됩니다. 쿼리 재설정 부분 이후에
<시간/>f ($ wp_query)
인 페이지 매김 함수를 호출 할 수 있습니다.이 함수는$ wp_query
전역에 따라 다릅니다.페이지 매김 메커니즘을 더욱 개선하고
query_posts
함수에 더 많은 자유를주기 위해 다음과 같이 개선 할 수있는 방법을 만들었습니다.I have modified the main loop query via
query_posts()
. Why isn't pagination working, and how do I fix it?Great answer Chip created needs to be modified today.
For some time we have$wp_the_query
variable that should be equal to the$wp_query
global just after the main query executes.This is why this the part from the Chip's answer:
Hack the main query object
is not needed anymore. We can forget this part with creating the temporary variable.
// Pagination fix $temp_query = $wp_query; $wp_query = NULL; $wp_query = $custom_query;
So now we can call:
$wp_query = $wp_the_query;
or even better we can call:
wp_reset_query();
Everything other Chip outlined stays. After that query-reset-part you can call the pagination functions that are
f($wp_query)
, — they depend on$wp_query
global.
In order to further improve the pagination mechanics and to give more freedom to the
query_posts
function I created this possible improvement: -
- 2018-03-06
global $wp_query; $paged = get_query_var('paged', 1); $args = array( 'post_type' => '{your_post_type_name}', 'meta_query' => array('{add your meta query argument if need}'), 'orderby' => 'modified', 'order' => 'DESC', 'posts_per_page' => 20, 'paged' => $paged ); $query = new WP_Query($args); if($query->have_posts()): while ($query->have_posts()) : $query->the_post(); //add your code here endwhile; wp_reset_query(); //manage pagination based on custom Query. $GLOBALS['wp_query']->max_num_pages = $query->max_num_pages; the_posts_pagination(array( 'mid_size' => 1, 'prev_text' => __('Previous page', 'patelextensions'), 'next_text' => __('Next page', 'patelextensions'), 'before_page_number' => '<span class="meta-nav screen-reader-text">' . __('Page', 'patelextensions') . ' </span>', )); else: ?> <div class="container text-center"><?php echo _d('Result not found','30'); ?></div> <?php endif; ?>
global $wp_query; $paged = get_query_var('paged', 1); $args = array( 'post_type' => '{your_post_type_name}', 'meta_query' => array('{add your meta query argument if need}'), 'orderby' => 'modified', 'order' => 'DESC', 'posts_per_page' => 20, 'paged' => $paged ); $query = new WP_Query($args); if($query->have_posts()): while ($query->have_posts()) : $query->the_post(); //add your code here endwhile; wp_reset_query(); //manage pagination based on custom Query. $GLOBALS['wp_query']->max_num_pages = $query->max_num_pages; the_posts_pagination(array( 'mid_size' => 1, 'prev_text' => __('Previous page', 'patelextensions'), 'next_text' => __('Next page', 'patelextensions'), 'before_page_number' => '<span class="meta-nav screen-reader-text">' . __('Page', 'patelextensions') . ' </span>', )); else: ?> <div class="container text-center"><?php echo _d('Result not found','30'); ?></div> <?php endif; ?>
템플릿 파일/사용자 지정 페이지 템플릿에 사용자 지정/보조 쿼리를 추가했습니다.WordPress에서 메인 쿼리 루프의 페이지 매김을 사용하는 대신 페이지 매김에 내 사용자 지정 쿼리를 사용하도록하려면 어떻게해야합니까?
부록
query_posts()
를 통해 기본 루프 쿼리를 수정했습니다.페이지 매김이 작동하지 않는 이유는 무엇이며 어떻게 수정합니까?