एक लूप को कई कॉलम में कैसे विभाजित करें


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>

मैं एक क्लॉज कैसे बनाऊंगा जो एक निश्चित अंतराल पर सूची को तोड़ता है, और एक नई शुरुआत करता है। तो 10 वीं पोस्ट में उदाहरण के लिए, एक लौटें </ul>और <ul>11 पर एक नया शुरू करें ।

यह गलत है लेकिन मेरा उद्देश्य स्पष्ट करना है:

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

इस तर्क को पाश में शामिल करने का सही तरीका क्या है?


मैंने अपना उत्तर कुछ ऐसी चीज़ों से अपडेट किया है जो आमतौर पर उपयोग करने और परीक्षण करने में आसान होनी चाहिए।
हकर्रे

जवाबों:


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

इसका उपयोग करने के लिए, बस इस gist से WP_Query_Columns वर्ग को अपने थीम function.php में जोड़ें।

उन्नत उपयोग

यदि आपको वर्तमान में प्रदर्शित किए जा रहे कॉलम नंबर की आवश्यकता है (जैसे कि कुछ सम / विषम सीएसएस कक्षाओं के लिए, तो आप इसे फ़र्क से भी प्राप्त कर सकते हैं:

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

एक लंबे उत्तर के लिए:

(यह मूल रूप से है कि मैं ऊपर दिए गए सामान के लिए कैसे आया, लेकिन बेहतर तरीके से बताता है कि वास्तव में सरल गणित के संचालन के साथ समस्या को कैसे हल किया जाए। मेरा नया समाधान कुछ पूर्व-गणना पर पुनरावृति करना है।)

यह थोड़ा निर्भर करता है कि आपको वास्तव में समस्या को हल करने की कितनी आवश्यकता है।

उदाहरण के लिए, यदि प्रति कॉलम आइटम की संख्या एक के बराबर है, तो यह बहुत आसान है:

<?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 तत्वों के साथ कॉलम भी संलग्न करना चाहते हैं।

कोड के साथ सौभाग्य से, हम इन सभी को चर में सेट कर सकते हैं और कोड बना सकते हैं जो हमेशा हमारी आवश्यकताओं की गणना करता है।

और कभी-कभी, हम भी शुरू से हर सवाल का जवाब नहीं दे सकते हैं। निर्वासन के लिए, कुल मदों की गिनती: क्या कोई, कुछ, कई, एक सटीक गणना है जो कुल में स्तंभों की संख्या के साथ मेल खाती है?

यहां तक ​​कि जान फेब्री का जवाब कुछ मामलों में काम कर सकता है (जैसा कि ऊपर दिया गया मेरा उदाहरण एक आइटम-प्रति-कॉलम परिदृश्य के लिए है), आपको ऐसी किसी चीज़ में दिलचस्पी हो सकती है जो WP_Query द्वारा लौटाए गए किसी भी आइटम के लिए काम करती हो।

गणित के लिए सबसे पहले:

//
// 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 वैरिएबल से संबंधित नहीं है। यह बिल्कुल जरूरत नहीं है, है ना?
फकर

@ खाक: $the_query->the_post()वैश्विक $postवैरिएबल को अधिलेखित करेगा , और इसे wp_reset_query()पुनर्स्थापित करेगा (कॉल करके wp_reset_postdata()- जो अपने आप में पर्याप्त भी हो सकता है)।
Jan Fabry

ठीक है, मैंने किसी तरह wp_query को मिलाया और थोड़ा सा पोस्ट किया, सोचा कि यह कुछ करेगा $wp_queryलेकिन $the_queryउदाहरण में उपयोग किया गया था। हालाँकि, मैं गलत था, मैं इसे पूर्णता के लिए अपने दूसरे उत्तर में जोड़ दूँगा।
१re

आप अंतिम आइटम का हिसाब नहीं दे रहे हैं। यदि लूप 10 से विभाज्य संख्या पर समाप्त होता है, तो आपको एक खाली सेट मिलेगा <ul></ul>
डैन गेल

1

मतगणना के लिए एक अलग संस्करण बनाने की आवश्यकता नहीं है, क्योंकि क्वेरी संस्करण पहले से ही इस पर गिना जाता है $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>";
?>

का उल्लेख किया। उदाहरण जोड़ा गया।
दान गेल

कूल, मुझे इसके अलावा पसंद है क्योंकि खाली I <ul> </ ul> `केवल 0 पदों के लिए है (लेकिन अभी भी यह उन लोगों के लिए है) - लेकिन मैंने आज जो सीखा है, वह सबसे छोटा w है / o एक नया कार्य शुरू करना।
हैकर

इसके अलावा अच्छा है। मैं देखता हूं कि WP_Queryइसका एक $post_countचर भी है , आप इसके बजाय इसका उपयोग कर सकते हैं count($the_query->posts)। Zac, आप मेरे उत्तर को "अस्वीकार" कर सकते हैं और किसी अन्य को स्वीकार कर सकते हैं यदि यह आपकी समस्या को बेहतर ढंग से हल करता है।
Jan Fabry

@ जान - मैं वैश्विक स्तर पर इनकैप्सुलेटेड वैरिएबल को प्राथमिकता दूंगा क्योंकि यह प्रतिरूपकता बढ़ाता है। लेकिन एक जानने के लिए अच्छा है।
हक्रे

0

get_columns_array()फ़ंक्शन को अपने function.php में जोड़ें । फिर आप आसानी से अपने स्तंभों पर पुनरावृति कर सकते हैं:

अपने विषय में आप स्तंभों पर फिर से प्रकाश डालते हैं:

<?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; ?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.