Bir döngüyü birden çok sütuna bölme


11

Benim gibi bir kategori sorgusu çalışan bir döngü varsa:

<?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>

Listeyi belirli bir aralıkta kıran ve yenisini başlatan bir if yan tümcesini nasıl oluşturabilirim. Örneğin, 10. postayla, </ul>a döndürün <ul>ve 11'de yeni bir tane başlatın .

Bu yanlış ama amacımı göstermek için:

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

Bu mantığı döngüye dahil etmenin doğru yolu nedir?


Cevabımı, kullanımı kolay ve test edilmesi gereken bir şeyle güncelledim.
hakre

Yanıtlar:


21

Sorgunuz ve kolay görüntüleme için Sütunlar oluşturun

Temalarda, şablon etiketlerine ve döngüye iyi uyan bir şeye sahip olmak muhtemelen daha yararlıdır. İlk cevabım bu kadar yoğunlaşmadı. Ayrıca hızlı bir evlat edinme için biraz fazla karmaşık olduğunu düşündüm.

Aklıma gelen daha kolay bir yaklaşım, "döngüyü" sütunlarla genişletmek ve şu ana kadar bu çözüme ulaşmaktı:

Bir WP_Query_Columns nesnesi, herhangi bir standart WP sorgusunu, kolayca yinelenebilen sütunlarla "genişletir". İlk parametre sorgu değişkeni ve ikinci parametre sütun başına görüntülenecek öğe sayısıdır:

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

Kullanmak için, sadece bu gisteki WP_Query_Columns sınıfını temalar function.php dosyasına ekleyin .

Gelişmiş Kullanım

Şu anda görüntülemekte olduğunuz sütun numarasına ihtiyacınız varsa (örneğin, bazı çift / tek CSS sınıfları için, bunu foreach'ten de alabilirsiniz:

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

Toplam sütun sayısı da mevcuttur:

<?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>...

Yirmi On Örnek

Bir test için yirmi on temayı hızlı bir şekilde hackleyebilir ve bu şekilde herhangi bir döngünün üzerine başlık ekleyebilirim. Loop.php dosyasına eklenir, başlangıç ​​temanın kodudur:

<?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.
    ...

Daha uzun bir cevap için:

.

Sorunu çözmek için aslında ne kadar ihtiyacınız olduğuna bağlı.

Örneğin, sütun başına öğe sayısı bire eşitse, bu çok basittir:

<?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>

Bu basit kodla bile, verilecek birden fazla karar olduğu görülebilir:

  • Bir sütunda kaç öğe var?
  • Toplamda kaç ürün var?
  • Başlamak için yeni bir sütun var mı?
  • Ve bitecek bir sütun var mı?

Son soru, muhtemelen yalnızca öğeleri değil, aynı zamanda html öğeleri içeren sütunu da eklemek istediğiniz için HTML çıktısı için oldukça ilginçtir.

Neyse ki kodla, tüm bunları değişkenlerde ayarlayabilir ve her zaman ihtiyaçlarımızı hesaplayan kod oluşturabiliriz.

Ve hatta bazen, her soruyu en başından bile cevaplayamayız. Exmaple için, toplam öğe sayısı: Toplamda tamsayı sütun sayısı ile eşleşen, herhangi bir, bazı, çoklu, tam bir sayı var mı?

Jan Fabry'nin cevabı bazı durumlarda bile işe yarayabilir (yukarıdaki örneğim sütun başına bir öğe senaryosu için olduğu gibi), WP_Query tarafından döndürülen herhangi bir sayıda öğe için çalışan bir şeyle ilgilenebilirsiniz.

Matematik için bir ilk:

//
// 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

Bu kod çalışmaz, bu yüzden bunu basit bir metin örneğine koyalım

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

Bu aslında çalışır ve zaten bazı çıktılar yapar:

<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.

Bu ne kadar oldukça iyi zaten taklit olabilir bir wordpress şablonunda benziyor:

//
// 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();
?>

(Son örneği bir WP ortamında yürütmedim, ancak en azından sözdizimsel olarak doğru olması gerekir.)


2

Bu daha genel bir programlama sorusudur, ancak temel fikir şudur:

<?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();
?>

Modulo işlemi temel olarak matematik cevabıdır. Ancak örneğinizde anlamsal HTML çıktısı yok.
Cevabımda

wp_reset_query();$ the_query değişkeni ile ilişkili değil. Buna hiç gerek yok, değil mi?
hakre

@hakre: $the_query->the_post()global $postdeğişkenin üzerine yazacak ve bunu wp_reset_query()geri yükleyecektir (arayarak wp_reset_postdata()- ki bu da kendi başına yeterli olabilir mi?).
Jan Fabry

Tamam bir şekilde karışık wp_query ve biraz sonrası, bir şey yapacağını düşündüm $wp_queryama $the_queryörnekte kullanıldı. Ancak yanılmışım, bütünlük için ikinci cevabımı ekleyeceğim.
hakre

Son öğeyi muhasebeleştirmiyorsunuz. Döngü 10'a bölünebilir bir sayı ile biterse, boş bir set alırsınız <ul></ul>.
Dan Gayle

1

Sorgu var zaten de sayar olarak sayımı için ayrı Var oluşturmak gerekmez, vardır: $wp_query->current_post. Ayrıca, <ul></ul>işaretlemenizde boş kalmamak için listedeki son girişi hesaba katmanız gerekir.

<?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>";
?>

Kayıt edilmiş. Örnek eklendi.
Dan Gayle

Güzel, eklemeyi seviyorum çünkü boş ´ <ul> </ul> `şimdi sadece 0 yazı içindir (ama hala olanlar için) - ama bugün öğrendiğim kadarıyla, bu form w / o yeni bir işlev getirmek.
hakre

Güzel bir ek. Görüyorum ki bir WP_Queryde $post_countdeğişkeni var, bunun yerine kullanabilirsiniz count($the_query->posts). Zac, cevabımı "kabul edemez" ve probleminizi daha iyi çözerse başka bir tane kabul edebilirsiniz.
Jan Fabry

@Jan - Kapsüllenmiş değişkeni global değişkene tercih ederim çünkü bu modülerliği arttırır. Ama bir tane olduğunu bilmek güzel.
hakre

0

Ekle get_columns_array()sizin function.php fonksiyonu. Daha sonra sütunlarınız üzerinde kolayca tekrarlayabilirsiniz:

Temanızda, sütunlar üzerinde her foreach döngüsünü önlersiniz:

<?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(); ?>

Bir sütunun varsayılan boyutunu 10 olarak ayarladım. Bir sütunun boyutunu kendi başınıza ayarlamak için ikinci parametreyi kullanabilirsiniz. 7 Like to: get_columns_array($post_count, 7);.


0

İşte uygulayabileceğiniz başka bir yaklaşım:

$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; ?>
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.