अपनी क्वेरी और आसान प्रदर्शन के लिए कॉलम बनाएं
विषयों में शायद कुछ और उपयोगी है जो टेम्पलेट टैग और लूप में अच्छी तरह से फिट बैठता है। मेरा पहला जवाब इतना पर ध्यान केंद्रित नहीं किया। इसके अतिरिक्त मुझे लगा कि यह जल्दी अपनाने के लिए थोड़ा जटिल है।
एक आसान तरीका जो मेरे दिमाग में आया, वह था "लूप" को कॉलम के साथ बढ़ाना और अब तक इस समाधान में आना :
एक 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 वातावरण में अंतिम उदाहरण निष्पादित नहीं किया है, लेकिन यह कम से कम वाक्यविन्यास रूप से सही होना चाहिए।)