কিভাবে একাধিক কলামে একটি লুপ বিভক্ত করা যায়


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

আপনার ক্যোয়ারী এবং সহজ প্রদর্শনের জন্য কলাম তৈরি করুন

টেমপ্লেটগুলিতে টেমপ্লেট ট্যাগ এবং লুপের সাথে ভালভাবে ফিট করে এমন কিছু থাকতে থিমগুলিতে আরও কার্যকর। আমার প্রথম উত্তরটি তেমন ফোকাস করে নি। অতিরিক্তভাবে আমি ভেবেছিলাম দ্রুত গ্রহণের জন্য এটি কিছুটা জটিল।

একটি সহজ পদ্ধতির যা আমার মনের মধ্যে ছড়িয়ে পড়েছিল তা হল কলামগুলি দিয়ে "লুপ" প্রসারিত করা এবং এখন পর্যন্ত এই সমাধানটিতে আসা:

একটি ডাব্লুপি_কিউরি_কলামগুলি অবজেক্ট কলমের সাথে যে কোনও স্ট্যান্ডার্ড ডাব্লুপি কোয়েরিকে "প্রসারিত" করে যা সহজেই পুনরাবৃত্তি হতে পারে। প্রথম প্যারামিটারটি ক্যোয়ারী ভেরিয়েবল এবং দ্বিতীয় প্যারামিটারটি প্রতি কলামে প্রদর্শিত আইটেমের সংখ্যা:

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

এটি ব্যবহার করতে, কেবলমাত্র এই থিমটি থেকে আপনার থিম ফাংশন.এফপি -তে ডাব্লুপি_কিউয়ারি_কলামগুলি শ্রেণি যুক্ত করুন ।

উন্নত ব্যবহার

আপনি বর্তমানে প্রদর্শিত কলাম নম্বরটির যদি প্রয়োজন হয় (উদাহরণস্বরূপ কিছু এমনকি / বিজোড় সিএসএস ক্লাসের জন্য, আপনি সেটি পূর্বাচ থেকেও পেতে পারেন:

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

বিশটি উদাহরণ

আমি পরীক্ষার জন্য এইভাবে দশটি থিমটি হ্যাক করতে পারি এবং এইভাবে কোনও লুপের উপরে শিরোনামগুলি যুক্ত করতে পারি। এটি লুপ.এফপি inোকানো হয়েছে, শুরুটি থিমের কোড:

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

দীর্ঘ উত্তরের জন্য:

(এটি মূলত আমি উপরের স্টাফগুলিতে এসেছি, তবে সাধারণ গণিতের ক্রিয়াকলাপগুলি দিয়ে কীভাবে সমস্যাটি সমাধান করা যায় তা আরও ভালভাবে ব্যাখ্যা করে My আমার নতুন সমাধানটি প্রাক-গণনা করা কিছুতে পুনরাবৃত্তি করা rate)

সমস্যাটি সমাধান করার জন্য আপনার আসলে কতটা প্রয়োজন তা কিছুটা নির্ভর করে।

উদাহরণস্বরূপ, যদি প্রতি কলামে আইটেমের সংখ্যা সমান হয় তবে এটি খুব সহজ:

<?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 আউটপুটটির জন্য বেশ ইন্টারেস্টেরিং কারণ আপনি সম্ভবত কেবল আইটেমগুলিই নয়, এইচটিএমএল উপাদানগুলির সাথে কলামটিও বদ্ধ করতে চান।

ভাগ্যক্রমে কোড সহ, আমরা এগুলি সমস্ত ভেরিয়েবলগুলিতে সেট করতে পারি এবং এমন কোড তৈরি করতে পারি যা সর্বদা আমাদের প্রয়োজনের সাথে গণনা করে।

এবং কখনও কখনও এমনকি এমনকি আমরা প্রথম থেকেই প্রতিটি প্রশ্নের উত্তর দিতে পারি না। এক্সপ্লোমালের জন্য, মোট আইটেমের গণনা: মোট কলামগুলির পূর্ণসংখ্যার সংখ্যার সাথে মেলে এমন কোনও, কিছু, একাধিক, একটি সঠিক গণনা রয়েছে?

এমনকি জ্যান ফ্যাব্রির উত্তর কিছু ক্ষেত্রে কার্যকর হতে পারে (যেমন উপরে আমার উদাহরণটি এক-আইটেম-প্রতি-কলামের দৃশ্যের জন্য করে), আপনি এমন কিছুতে আগ্রহী হতে পারেন যা ডাব্লুপি_কিউয়ারী দ্বারা ফিরিয়ে দেওয়া আইটেমগুলির জন্য কাজ করে।

গণিতের জন্য প্রথম:

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

ইতিমধ্যে বেশ ভাল simulates কিভাবে এটি পারে একটি ওয়ার্ডপ্রেস টেমপ্লেট মত চেহারা:

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

(আমি ডাব্লুপি পরিবেশে সর্বশেষ উদাহরণটি কার্যকর করি নি তবে এটি কমপক্ষে সিন্টেক্সিকভাবে সঠিক হওয়া উচিত))


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()- যা নিজে থেকে যথেষ্টও হতে পারে?)
জান ফ্যাব্রি

ঠিক আছে আমি একরকম wp_query মিশিয়ে কিছুটা পোস্ট করেছি, ভেবেছিলাম এটি কিছু করতে পারে $wp_queryতবে $the_queryউদাহরণে ব্যবহৃত হয়েছিল। তবে, আমি ভুল ছিলাম, আমি সম্পূর্ণতার জন্য এটি আমার দ্বিতীয় উত্তরে যুক্ত করব।
hakre

আপনি শেষ আইটেমটির জন্য অ্যাকাউন্টিং করছেন না। যদি লুপটি 10 ​​দ্বারা বিভাজ্য সংখ্যায় শেষ হয় তবে আপনি একটি খালি সেট পাবেন <ul></ul>
ড্যান গেইল

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

উল্লেখযোগ্য। উদাহরণ যুক্ত হয়েছে।
ড্যান গেইল

দুর্দান্ত, আমি সংযোজনটি পছন্দ করি কারণ খালি ul <ul> </ul> only এখন কেবল 0 টি পোস্টের জন্য (তবে এটি এখনও তাদের জন্য রয়েছে) - তবে আমি আজ যা শিখেছি তা থেকে সেই ফর্মটি সবচেয়ে ছোট এক / হে একটি নতুন ফাংশন প্রবর্তন।
hakre

ভাল সংযোজন। আমি দেখতে পাচ্ছি যে WP_Queryএর একটি $post_countপরিবর্তনশীলও রয়েছে, আপনি এটি পরিবর্তে ব্যবহার করতে পারেন count($the_query->posts)। জ্যাক, আপনি আমার উত্তরটিকে "অস্বীকার" করতে পারেন এবং যদি আপনার সমস্যার আরও ভাল সমাধান করে তবে অন্যটি গ্রহণ করতে পারেন।
জান ফ্যাব্রি

@ জান - আমি বিশ্বব্যাপী একের তুলনায় এনক্যাপসুলেটেড ভেরিয়েবলটিকে প্রাধান্য দেব কারণ এটি পরিমিতি বাড়ায়। তবে একটি জেনে রাখা ভাল।
হ্যাক্রে

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 এ সেট করেছি You আপনি নিজের পাতায় কোনও কলামের আকার সেট করতে দ্বিতীয় প্যারামিটারটি ব্যবহার করতে পারেন। 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.