루프를 여러 열로 나누는 방법


11

다음과 같은 카테고리 쿼리에서 루프가 실행되는 경우 :

<?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?>
<ul>
<?php while ($the_query->have_posts()) : $the_query->the_post();?>
<li>.. </li><?php wp_reset_query(); ?>
<?php endwhile; ?>
</ul>

특정 간격으로 목록을 나누고 새 목록을 시작하는 if 절을 어떻게 작성합니까? 예를 들어 10 번째 게시물에서 a를 반환하고 11에서 </ul>새 게시물을 시작하십시오 <ul>.

이것은 올바르지 않지만 내 목표를 설명하기 위해 :

<?php $count =0;
    while($count <=50){
        if ($count == 9){
            echo "<li><a href='<?php the_permalink(); ?>'>
                      <?php the_title(); ?></a></li></ul>";
            } 
        elseif ($count == 10){
        echo "<ul><li><a href='<?php the_permalink(); ?>'>
                          <?php the_title(); ?></a></li>";
        }
        else {
        echo "<li><a href='<?php the_permalink(); ?>'><?php the_title(); ?></a></li>";
        }

이 논리를 루프에 포함시키는 올바른 방법은 무엇입니까?


나는 일반적으로 사용하고 테스트하기 쉬운 것으로 내 대답을 업데이트했습니다.
hakre

답변:


21

조회 및 쉬운 표시를위한 열 작성

테마에서 템플릿 태그와 루프에 잘 맞는 것을 사용하는 것이 더 유용 할 것입니다. 내 첫 대답은 그다지 집중하지 않았습니다. 또한 빠른 채택을하기에는 너무 복잡하다고 생각했습니다.

내 마음에 떠오른 더 쉬운 접근 방식은 열로 "루프" 를 확장 하고 지금 까지이 솔루션에 도달했습니다.

WP_Query_Columns는 개체를 쉽게 이상 반복 할 수 colums와 표준 WP 쿼리를 "확장". 첫 번째 매개 변수는 쿼리 변수이고 두 번째 매개 변수는 열당 표시 할 항목 수입니다.

<?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?>
<?php foreach(new WP_Query_Columns($the_query, 10) as $column_count) : ?>
    <ul>
        <?php while ($column_count--) : $the_query->the_post(); ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php endwhile; ?>
    </ul>
<?php endforeach; ?>

그것을 사용하려면 이 요지에서 WP_Query_Columns 클래스를 테마 function.php에 추가하십시오 .

고급 사용법

현재 표시하고있는 열 번호가 필요한 경우 (예 : 짝수 / 홀수 CSS 클래스의 경우) foreach에서도 얻을 수 있습니다.

<?php foreach(new WP_Query_Columns($the_query, 10) as $column => $column_count) : ?>

그리고 총 열 수도 사용할 수 있습니다.

<?php 
    $the_columns = new WP_Query_Columns($the_query, 10);
    foreach($the_columns as $column => $column_count) : 
?>
    <h2>Column <?php echo $column; ?>/<?php echo sizeof($the_columns); ?></h2>
    <ul>...

스물 열 예

테스트를 위해 스물 열 가지 테마를 빠르게 해킹 하고이 방법으로 루프 위에 헤드 라인을 추가 할 수있었습니다. 그것은 loop.php에 삽입되며 시작은 테마의 코드입니다.

<?php /* If there are no posts to display, such as an empty archive page */ ?>
<?php if ( ! have_posts() ) : ?>
    <div id="post-0" class="post error404 not-found">
        <h1 class="entry-title"><?php _e( 'Not Found', 'twentyten' ); ?></h1>
        <div class="entry-content">
            <p><?php _e( 'Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post.', 'twentyten' ); ?></p>
            <?php get_search_form(); ?>
        </div><!-- .entry-content -->
    </div><!-- #post-0 -->
<?php endif; ?>

<!-- WP_Query_Columns -->
<?php 
    ### Needs WP_Query_Columns --- see http://wordpress.stackexchange.com/q/9308/178
    $query_copy = clone $wp_query; // save to restore later
    foreach( new WP_Query_Columns($wp_query, 3) as $columns_index => $column_count ) : ?>
    <ul>
        <?php 
        while ( $column_count-- ) : the_post(); ?>
            <li><h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2></li>
        <?php endwhile; ?>
    </ul>       
<?php endforeach; ?>
<?php $wp_query = $query_copy;?>

<?php
    /* Start the Loop.
    ...

더 긴 답변 :

(이것은 기본적으로 위의 내용을 다루는 방법이지만 간단한 수학 연산으로 문제를 실제로 해결하는 방법을 더 잘 설명합니다. 새로운 솔루션은 미리 계산 된 것을 반복하는 것입니다.)

실제로 문제를 해결하는 데 필요한 양에 따라 다릅니다.

예를 들어 열당 항목 수가 1 인 경우 매우 간단합니다.

<?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?>    
<?php while ($the_query->have_posts()) : $the_query->the_post();?>
<ul>
    <li>.. </li>
<ul>
<?php endwhile;  wp_reset_query(); ?>
</ul>

이 간단한 코드를 사용하더라도 여러 가지 결정을 내릴 수 있습니다.

  • 한 열에 몇 개의 항목이 있습니까?
  • 총 몇 개의 품목이 있습니까?
  • 시작할 새 열이 있습니까?
  • 그리고 끝낼 열이 있습니까?

마지막 질문은 항목뿐만 아니라 html 요소로 열을 묶고 싶을 때 HTML 출력에 매우 흥미 롭습니다.

운 좋게도 코드를 사용하면 이러한 모든 변수를 변수에 설정하고 항상 필요에 따라 계산하는 코드를 만들 수 있습니다.

때로는 우리는 처음부터 모든 질문에 대답조차 할 수 없습니다. 예를 들어, 총 항목 수 : 정수 열의 총 개수와 일치하는 정확한 개수가 있습니까?

Jan Fabry의 답변조차도 경우에 따라 작동 할 수 있습니다 (위의 예제는 열 당 한 항목 당 시나리오의 경우와 같이).

먼저 수학 :

//
// arithmetical example:
//
# configuration:
$colSize = 20;  // number of items in a column
$itemsTotal = 50; // number of items (total)

# calculation:
$count = 0; // a zero-based counter variable
$isStartOfNewColum = 0 === ($count % $colSize); // modulo operation
$isEndOfColumn = ($count && $isStartOfNewColum) || $count === $itemsTotal; // encapsulation

해당 코드는 실행되지 않으므로 간단한 텍스트 예제로 작성해 보겠습니다.

//
// simple-text example:
//
$column = 0; // init a column counter
for($count=0; $count<= $itemsTotal; $count++) {
    $isStartOfNewColum = 0 === ($count % $colSize); // modulo
    $isEndOfColumn = ($count && $isStartOfNewColum);
    $isStartOfNewColum && $column++; // update column counter

    if ($isEndOfColumn) {
        printf("/End of Column: %d\n", $column-1);
    }

    if ($isStartOfNewColum) {
        printf("<start of Column: %d\n", $column);
    }

    printf(" * item %d\n", $count);
}
if ($count && !$isEndOfColumn && --$count === $itemsTotal) {
    printf("/End of Column: %d\n", $column);
}

printf("Done. Total Number of Columns: %d.\n", $column);

이것은 실제로 실행되고 이미 일부 출력을 수행합니다.

<start of Column: 1
 * item 0
 * item 1
 * item 2
 * item 3
...
 * item 17
 * item 18
 * item 19
/End of Column: 1
<start of Column: 2
 * item 20
 * item 21
 * item 22
...
 * item 37
 * item 38
 * item 39
/End of Column: 2
<start of Column: 3
 * item 40
 * item 41
 * item 42
...
 * item 48
 * item 49
 * item 50
/End of Column: 3
Done. Total Number of Columns: 3.

이것은 워드 프레스 템플릿에서 어떻게 보일 있는지 이미 잘 시뮬레이션합니다 .

//
// wordpress example:
//
$count = 0; // init item counter
$column = 0; // init column counter
$colSize = 10; // column size of ten this time
$the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');
$itemsTotal = $the_query->post_count;
?>
<?php while ($the_query->have_posts()) : $the_query->the_post();?>
<?php
    # columns display variables 
    $isStartOfNewColum = 0 === ($count % $colSize); // modulo
    $isEndOfColumn = ($count && $isStartOfNewColum);
    $isStartOfNewColum && $column++; // update column counter

    if ($isEndOfColumn) {
        print('</ul>');
    }

    if ($isStartOfNewColum) {
        printf('<ul class="col-%d">', $column);
    }
?>
    <li> ... make your day ...
    </li>
<?php endwhile; ?>
<?php
if ($count && !$isEndOfColumn && --$count === $itemsTotal) {
    print('</ul>');
}
// You don't have to do this in every loop, just once at the end should be enough
wp_reset_query();
?>

(나는 WP 환경에서 마지막 예제를 실행하지 않았지만 적어도 구문 상 정확해야합니다.)


2

이것은 일반적인 프로그래밍 질문이지만 기본 아이디어는 다음과 같습니다.

<?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?>
<ul>
<?php
$post_counter = 0;
while ($the_query->have_posts()) :
    $the_query->the_post();
    $post_counter++;
?>
    <li>.. </li>
<?php
    if ( 0 == $post_counter % 10 ) {
        echo '</ul><ul>';
    }
endwhile;
?>
</ul>
<?php
// You don't have to do this in every loop, just once at the end should be enough
wp_reset_query();
?>

모듈로 연산은 기본적으로 수학 답변입니다. 그러나 예제에는 의미 론적 HTML 출력이 부족합니다. 좀 더 시간이
걸린다고

wp_reset_query();$ the_query 변수와 관련이 없습니다. 전혀 필요하지 않습니다.
hakre 2019

@hakre : $the_query->the_post()전역 $post변수 를 덮어 쓰고 wp_reset_query()이것을 복원합니다 (호출하여 wp_reset_postdata()도 충분할까요?).
Jan Fabry

좋아, 어떻게 든 wp_query를 섞어 조금 게시하고, 뭔가 할 $wp_query것이지만 $the_query예제에서 사용 되었다고 생각했습니다 . 그러나 나는 틀렸다. 완전성을 위해 두 번째 대답에 추가 할 것이다.
hakre

마지막 항목을 설명하지 않습니다. 루프가 10으로 나눌 수있는 숫자로 끝나면 빈 세트가 나타납니다 <ul></ul>.
Dan Gayle

1

쿼리 var가 이미 다음을 계산하므로 계산을 위해 별도의 var를 만들 필요가 없습니다 $wp_query->current_post. 또한 <ul></ul>마크 업에 비어 있지 않도록 목록의 마지막 항목을 고려해야합니다 .

<?php 
$the_query = new WP_Query('showposts=21&orderby=title&order=asc'); 
echo "<ul>";
while ($the_query->have_posts()) :
    $the_query->the_post();
    echo "<li>{$the_query->current_post}</li>";

    // Note that the post is already counted in the $the_query->current_post variable when in the loop. Add one to translate array counting to real counts.
    // Jan's example didn't account for the final entry in the list. Don't want empty <ul>'s hanging around
    if ((($the_query->current_post+1) % 10 == 0) && ($the_query->current_post+1 !== count($the_query->posts))):
        echo "</ul><ul>";
    endif;
endwhile;
echo "</ul>";
?>

유명한. 예제가 추가되었습니다.
Dan Gayle

빈 ´ <ul> </ ul>`은 현재 0 개의 게시물 (하지만 여전히 게시물)에 대한 것이므로 추가를 좋아합니다. 그러나 오늘 배운 내용에서이 형식은 가장 작은 것입니다. o 새로운 기능을 소개합니다.
hakre

좋은 추가. 나는 WP_Query또한 $post_count변수 가 있다는 것을 알았습니다 count($the_query->posts). 대신 대신 사용할 수 있습니다 . Zac, 당신은 내 대답을 "무시"하고 문제가 더 잘 해결되면 다른 대답을 받아 들일 수 있습니다.
Jan Fabry 2019

@Jan-모듈화가 증가하기 때문에 전역 변수보다 캡슐화 된 변수를 선호합니다. 그러나 하나가 있다는 것을 아는 것이 좋습니다.
hakre

0

get_columns_array()function.php에 함수를 추가하십시오 . 그런 다음 열을 쉽게 반복 할 수 있습니다.

당신의 테마에서 당신은 foreach 루프를 통해 열 :

<?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?>
<?php foreach(get_columns_array($post_count) as $column_count) : ?>
    <ul>
        <?php while ($column_count--) : $the_query->the_post(); ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php endwhile; ?>
    </ul>
<?php endforeach; wp_reset_postdata(); ?>

열의 기본 크기를 10으로 설정했습니다. 두 번째 매개 변수를 사용하여 열의 크기를 직접 설정할 수 있습니다. 7 :처럼 get_columns_array($post_count, 7);.


0

취할 수있는 또 다른 접근법은 다음과 같습니다.

$article = 0;

<?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
        <?php $article = $article + 1; ?>
        <?php if ($article % 3 == 1) echo '<div class="row-fluid">';  ?>
            <div class="span4">
            <h2><a href="<?php esc_url( the_permalink() ); ?>" title="Permalink to <?php the_title(); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
            </div><!--/span-->
        <?php if ($article % 3 == 0) echo '</div><!--/row-->';  ?>
    <?php endwhile;?>
<?php else: ?>
<h2>...</h2>
<?php endif; ?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.