WordPress에서 get_posts()에 대해 페이지 매김을 하려면 어떻게 해야 합니까?
저는 WordPress 사이트에서 일하고 있으며, 카테고리 슬러그별로 게시물을 표시하는 페이지 템플릿을 만들었습니다.이를 위해 페이지 필드 WP_Catid를 작성하여 게시물을 표시하고 싶은 카테고리 slug와 동일하게 설정합니다.단, 한 페이지당 5개의 게시물만 표시되도록 하고, 그 게시물 하단에 페이지링크를 붙였으면 합니다.페이지 번호 링크를 올바르게 표시하려면 어떻게 해야 합니까?
제 코드는 다음과 같습니다.
<div id="container">
<div id="content" role="main">
<?php
$btpgid=get_queried_object_id();
$btmetanm=get_post_meta( $btpgid, 'WP_Catid','true' );
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array( 'posts_per_page' => 5,
'category_name' => $btmetanm,
'paged' => $paged,
'post_type' => 'post' );
$myposts = get_posts( $args );
foreach ( $myposts as $post ) : setup_postdata( $post );
echo "<div style='border:2px groove black; margin-bottom:5px;'><h3 class='btposth'>";
the_title();
echo "</h3><div class='btpostdiv'>";
the_content();
echo "</div></div>";
endforeach;
next_posts_link( 'Older Entries'); //not displaying
previous_posts_link('Newer Entries »'); //not displaying
wp_reset_postdata();
?>
</div><!-- #content -->
</div><!-- #container -->
요점은 페이지화된 쿼리가 필요한 경우 사용하지 마십시오. get_posts
페이지 매김이 필요 없는 커스텀 쿼리를 사용하는 경우 완벽하게 동작하지만 페이지 매김을 도입해야 할 경우 매우 복잡해집니다.
여기서 가장 쉽고 적절한 것은 를 사용하여 커스텀 쿼리를 작성하는 것입니다.즉, 메인 쿼리에서 원하는 출력을 얻기 위해 메인 쿼리를 변경할 수 없는 경우입니다.
이것은 커스텀 쿼리와 함께 사용하는 것이 좋다고 생각합니다.WP_Query
. 단, 기억하셔야 합니다.$max_pages
커스텀 쿼리를 사용할 때 파라미터, 그렇지 않으면 페이지 매김이 중단됩니다.
몇 가지 사소한 조정을 통해 쿼리는 다음과 같이 표시됩니다.
<div id="container">
<div id="content" role="main">
<?php
$btpgid=get_queried_object_id();
$btmetanm=get_post_meta( $btpgid, 'WP_Catid','true' );
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array( 'posts_per_page' => 5, 'category_name' => $btmetanm,
'paged' => $paged,'post_type' => 'post' );
$postslist = new WP_Query( $args );
if ( $postslist->have_posts() ) :
while ( $postslist->have_posts() ) : $postslist->the_post();
echo "<div style='border:2px groove black; margin-bottom:5px;'><h3 class='btposth'>";
the_title();
echo "</h3><div class='btpostdiv'>";
the_content();
echo "</div></div>";
endwhile;
next_posts_link( 'Older Entries', $postslist->max_num_pages );
previous_posts_link( 'Next Entries »' );
wp_reset_postdata();
endif;
?>
</div><!-- #content -->
</div><!-- #container -->
피터 구센의 대답은 완전히 옳고, 그의 제안은WP_Query
그 대신 가장 말이 되는군그러나, 나는 이 질문을 우연히 발견했다.get_posts
다른 사람에게도 유용한 대안이 될 수 있다고 생각했습니다.
get_posts
라고 불리는 직접적인 성질을 가지며, 이는 와 거의 같은 것을 달성한다.paged
에WP_Query
; 단, 어디서paged
페이지 번호부여(예: 1, 2, 3),offset
는, 쿼리를 오프셋 하는 실제의 투고 수(5, 10, 15 등)입니다.약간의 수학으로...numberToShow * pageNumber
- 올바른 오프셋을 쉽게 얻을 수 있습니다.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 0;
$postsPerPage = 5;
$postOffset = $paged * $postsPerPage;
$args = array(
'posts_per_page' => $postsPerPage,
'category_name' => $btmetanm,
'offset' => $postOffset,
'post_type' => 'post'
);
$myposts = get_posts($args);
첫 번째paged
이 예의 값은0
보다는1
왜냐하면, 이 값을 곱할 때posts_per_page
초기 오프셋은 다음과 같습니다.0
보다는5
.
이것은 간단한 페이지 지정이 아니라 조금 더 세밀한 제어를 필요로 하는 경우에 가장 편리합니다만, 받아들여진 회답의 루프와 조합해 동작할 필요가 있습니다.
$args 변경 시도:
$args = array(
'posts_per_page' => 5,
'category_name' => $btmetanm,
'post_type' => 'post',
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 )
);
루프 직후에 다음과 같이 입력합니다.
if (function_exists('wp_pagenavi')) {
wp_pagenavi();
}
get_posts()를 사용하는 것이 옳다고는 말하지 않겠습니다.get_posts()를 사용하여 설정한 기본적인 페이지 코드입니다.
편집: Pieter가 지적한 바와 같이, 이것은 프로덕션 코드에 사용되는 것이 아닙니다.다만, get_posts()로 페이지 매김을 할 수 있는지 확인하기 위해서, 어쨌든 가지고 놀던 것입니다.실제 가동 환경에 있는 경우 이 기능을 사용하지 않을 수 있습니다.
$cpt_name = 'post-type'; //add your own post type
//what pagination page are we on?
if(! empty($_GET['pag']) && is_numeric($_GET['pag']) ){
$paged = $_GET['pag'];
}else{
$paged = 1;
}
//you could use this if you want, just make sure to use "/page/2" instead of "?pag=2" in the pagination links.
//$paged = (get_query_var('paged')) ? get_query_var('paged') : 0;
//how many posts should we display?
$posts_per_page = (get_option('posts_per_page')) ? get_option('posts_per_page') : 10;
//let's first get ALL of the possible posts
$args = array(
'posts_per_page' => -1,
'orderby' => 'title',
'order' => 'ASC',
'fields' => 'ids',
'post_type' => $cpt_name
);
$all_posts = get_posts($args);
//how many total posts are there?
$post_count = count($all_posts);
//how many pages do we need to display all those posts?
$num_pages = ceil($post_count / $posts_per_page);
//let's make sure we don't have a page number that is higher than we have posts for
if($paged > $num_pages || $paged < 1){
$paged = $num_pages;
}
//now we get the posts we want to display
$args = array(
'posts_per_page' => $posts_per_page,
'orderby' => 'title',
'order' => 'ASC',
'post_type' => $cpt_name,
'paged' => $paged
);
$my_posts = get_posts($args);
//did we find any?
if(! empty($my_posts)){
echo '<div id="my-posts-wrapper">';
//THE FAKE LOOP
foreach($my_posts as $key => $my_post){
//do stuff with your posts
echo '<div class="my-post">'.$my_post->post_title.'</div>';
}
echo '</div>';
//we need to display some pagination if there are more total posts than the posts displayed per page
if($post_count > $posts_per_page ){
echo '<div class="pagination">
<ul>';
if($paged > 1){
echo '<li><a class="first" href="?pag=1">«</a></li>';
}else{
echo '<li><span class="first">«</span></li>';
}
for($p = 1; $p <= $num_pages; $p++){
if ($paged == $p) {
echo '<li><span class="current">'.$p.'</span></li>';
}else{
echo '<li><a href="?pag='.$p.'">'.$p.'</a></li>';
}
}
if($paged < $num_pages){
echo '<li><a class="last" href="?pag='.$num_pages.'">»</a></li>';
}else{
echo '<li><span class="last">»</span></li>';
}
echo '</ul></div>';
}
}
누군가 이것을 유용하게 써주길 바란다:)
편집: 뭐야!뭔가 잘못된 일을 하는 건... 옳은 일을 하는 게 나을 수도 있어!여기에도 LESS가 몇 가지 있습니다(믹스인 없음).
.pagination { margin: 30px 0px;
ul { display:block; list-style-type:none; margin:0 auto; padding: 0px;
li { display:inline-block; list-style-type:none; margin:0; padding:0;
a, span { display:inline-block; font-size: 14px; width:auto; min-width:26px; height:26px; line-height: 26px; border: 1px solid #dddddd; border-right: 0px; background:#FFFFFF; color:#FF0000; padding: 5px; text-align: center;
&:hover { cursor:pointer; text-decoration:none; }
&.first { border-top-left-radius: 3px; border-bottom-left-radius: 3px; }
&.last { border-top-right-radius: 3px; border-bottom-right-radius: 3px;}
}
span.last,
span.first { color: #FF0000;
&:hover { cursor: default; }
}
a.last,
a.first {
&:hover { }
}
a:hover,
&.active a,
.current { background:#FF0000; color:#ffffff; border-color: #b21712; }
&:last-child {
a, span { border-right: 1px solid #dddddd; }
a {
&:hover { border-color: #FF0000; }
}
}
}
}
}
투고에 대한 WordPress 페이지 번호 코드(NEW)
이 코드를 복사해서 붙여넣고 즐기세요.:)
<?php
$currentPage = get_query_var('paged');
// General arguments
$posts = new WP_Query(array(
'post_type' => 'post', // Default or custom post type
'posts_per_page' => 10, // Max number of posts per page
//'category_name' => 'My category', // Your category (optional)
'paged' => $currentPage
));
// Top pagination (pagination arguments)
echo "<div class='page-nav-container'>" . paginate_links(array(
'total' => $posts->max_num_pages,
'prev_text' => __('<'),
'next_text' => __('>')
)) . "</div>";
// Content display
if ($posts->have_posts()) :
while ($posts->have_posts()) :
$posts->the_post();
echo "<div class='post-wrap'>";
the_title();
the_content();
echo "</div>";
endwhile;
endif;
// Bottom pagination (pagination arguments)
echo "<div class='page-nav-container'>" . paginate_links(array(
'total' => $posts->max_num_pages,
'prev_text' => __('<'),
'next_text' => __('>')
)) . "</div>";
?>
언급URL : https://stackoverflow.com/questions/24838864/how-do-i-get-pagination-to-work-for-get-posts-in-wordpress
'programing' 카테고리의 다른 글
중첩된 지시어로 ng-model 전달 (0) | 2023.04.01 |
---|---|
스프링 부트 ClassNotFoundException org.springframework.core.metrics.응용 프로그램 부팅 (0) | 2023.04.01 |
WordPress REST API JWT 토큰을 검증하는 동안 jwt_auth_no_auth_header 오류가 발생했습니다. (0) | 2023.04.01 |
전류를 수동으로 설정할 때 useRef() 훅과 함께 사용하는 스크립트 유형은 무엇입니까? (0) | 2023.04.01 |
스프링 부팅 EntityManagerFactoryBuilder에 자동 전원이 필요하지 않습니다. (0) | 2023.04.01 |